34 void applyFixup(
const MCFragment &,
const MCFixup &,
const MCValue &Target,
36 bool fixupNeedsRelaxationAdvanced(
const MCFragment &,
const MCFixup &,
40 void relaxInstruction(MCInst &Inst,
41 const MCSubtargetInfo &STI)
const override;
44 const MCSubtargetInfo &STI)
const override;
46 unsigned getMinimumNopSize()
const override;
48 const MCSubtargetInfo *STI)
const override;
50 std::optional<MCFixupKind>
getFixupKind(StringRef Name)
const override;
51 MCFixupKindInfo getFixupKindInfo(
MCFixupKind Kind)
const override;
56void AMDGPUAsmBackend::relaxInstruction(
MCInst &Inst,
62 Inst = std::move(Res);
65bool AMDGPUAsmBackend::fixupNeedsRelaxationAdvanced(
const MCFragment &,
69 bool Resolved)
const {
75 return (((int64_t(
Value)/4)-1) == 0x3f);
78bool AMDGPUAsmBackend::mayNeedRelaxation(
unsigned Opcode,
80 const MCSubtargetInfo &STI)
const {
81 if (!STI.
hasFeature(AMDGPU::FeatureOffset3fBug))
113 int64_t SignedValue =
static_cast<int64_t
>(
Value);
115 switch (
Fixup.getKind()) {
117 int64_t BrImm = (SignedValue - 4) / 4;
120 Ctx->reportError(
Fixup.getLoc(),
"branch size exceeds simm16");
135void AMDGPUAsmBackend::applyFixup(
const MCFragment &
F,
const MCFixup &
Fixup,
136 const MCValue &Target, uint8_t *
Data,
138 if (
Target.getSpecifier())
140 maybeAddReloc(
F,
Fixup, Target,
Value, IsResolved);
148 MCFixupKindInfo
Info = getFixupKindInfo(
Fixup.getKind());
155 "Invalid fixup offset!");
159 for (
unsigned i = 0; i != NumBytes; ++i)
160 Data[i] |=
static_cast<uint8_t
>((
Value >> (i * 8)) & 0xff);
163std::optional<MCFixupKind>
164AMDGPUAsmBackend::getFixupKind(StringRef Name)
const {
165 auto Type = StringSwitch<unsigned>(Name)
166#define ELF_RELOC(Name, Value) .Case(#Name, Value)
167#include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def"
169 .Case(
"BFD_RELOC_NONE", ELF::R_AMDGPU_NONE)
170 .Case(
"BFD_RELOC_32", ELF::R_AMDGPU_ABS32)
171 .Case(
"BFD_RELOC_64", ELF::R_AMDGPU_ABS64)
178MCFixupKindInfo AMDGPUAsmBackend::getFixupKindInfo(
MCFixupKind Kind)
const {
181 {
"fixup_si_sopp_br", 0, 16, 0},
195unsigned AMDGPUAsmBackend::getMinimumNopSize()
const {
199bool AMDGPUAsmBackend::writeNopData(raw_ostream &OS,
uint64_t Count,
200 const MCSubtargetInfo *STI)
const {
205 unsigned MinInstAlignment =
getContext().getAsmInfo().getMinInstAlignment();
209 Count /= MinInstAlignment;
213 const uint32_t Encoded_S_NOP_0 = 0xbf800000;
215 assert(MinInstAlignment ==
sizeof(Encoded_S_NOP_0));
228class ELFAMDGPUAsmBackend :
public AMDGPUAsmBackend {
230 bool HasRelocationAddend;
234 ELFAMDGPUAsmBackend(
const Target &
T,
const Triple &TT)
235 : AMDGPUAsmBackend(
T), Is64Bit(
TT.isAMDGCN()),
236 HasRelocationAddend(
TT.getOS() == Triple::AMDHSA) {
237 switch (
TT.getOS()) {
239 OSABI = ELF::ELFOSABI_AMDGPU_HSA;
242 OSABI = ELF::ELFOSABI_AMDGPU_PAL;
245 OSABI = ELF::ELFOSABI_AMDGPU_MESA3D;
252 std::unique_ptr<MCObjectTargetWriter>
253 createObjectTargetWriter()
const override {
static unsigned getFixupKindNumBytes(unsigned Kind)
The number of bytes the fixup may change.
static uint64_t adjustFixupValue(const MCFixup &Fixup, const MCValue &Target, uint64_t Value, MCContext &Ctx, const Triple &TheTriple, bool IsResolved)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Provides AMDGPU specific target descriptions.
PowerPC TLS Dynamic Call Fixup
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
Generic interface to target specific assembler backends.
virtual MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
Context object for machine code objects.
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Instances of this class represent a single low-level machine instruction.
unsigned getOpcode() const
void addOperand(const MCOperand Op)
void setOpcode(unsigned Op)
const MCOperand & getOperand(unsigned i) const
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
const Triple & getTargetTriple() const
Target - Wrapper for Target specific information.
LLVM Value Representation.
raw_ostream & write_zeros(unsigned NumZeros)
write_zeros - Insert 'NumZeros' nulls.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ fixup_si_sopp_br
16-bit PC relative fixup for SOPP branch instructions.
LLVM_READONLY int32_t getSOPPWithRelaxation(uint32_t Opcode)
VE::Fixups getFixupKind(uint8_t S)
Error applyFixup(LinkGraph &G, Block &B, const Edge &E, const ArmConfig &ArmCfg)
Apply fixup expression for edge to block content.
bool isRelocation(MCFixupKind FixupKind)
void write(void *memory, value_type value, endianness endian)
Write a value to memory with a particular endianness.
This is an optimization pass for GlobalISel generic memory operations.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
MCAsmBackend * createAMDGPUAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
std::unique_ptr< MCObjectTargetWriter > createAMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI, bool HasRelocationAddend)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
uint16_t MCFixupKind
Extensible enumeration to represent the type of a fixup.
@ FK_SecRel_2
A two-byte section relative fixup.
@ FirstLiteralRelocationKind
@ FK_Data_8
A eight-byte fixup.
@ FK_Data_1
A one-byte fixup.
@ FK_Data_4
A four-byte fixup.
@ FK_SecRel_8
A eight-byte section relative fixup.
@ FK_SecRel_4
A four-byte section relative fixup.
@ FK_SecRel_1
A one-byte section relative fixup.
@ FK_Data_2
A two-byte fixup.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
ArrayRef(const T &OneElt) -> ArrayRef< T >