56void AMDGPUAsmBackend::relaxInstruction(
MCInst &Inst,
62 Inst = std::move(Res);
65bool AMDGPUAsmBackend::fixupNeedsRelaxation(
const MCFixup &
Fixup,
70 return (((int64_t(
Value)/4)-1) == 0x3f);
73bool AMDGPUAsmBackend::mayNeedRelaxation(
unsigned Opcode,
76 if (!STI.
hasFeature(AMDGPU::FeatureOffset3fBug))
108 int64_t SignedValue =
static_cast<int64_t
>(
Value);
110 switch (
Fixup.getKind()) {
112 int64_t BrImm = (SignedValue - 4) / 4;
114 if (Ctx && !isInt<16>(BrImm))
133 if (
Target.getSpecifier())
150 "Invalid fixup offset!");
154 for (
unsigned i = 0; i != NumBytes; ++i)
155 Data[i] |=
static_cast<uint8_t>((
Value >> (i * 8)) & 0xff);
158std::optional<MCFixupKind>
161#define ELF_RELOC(Name, Value) .Case(#Name, Value)
162#include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def"
164 .
Case(
"BFD_RELOC_NONE", ELF::R_AMDGPU_NONE)
165 .
Case(
"BFD_RELOC_32", ELF::R_AMDGPU_ABS32)
166 .
Case(
"BFD_RELOC_64", ELF::R_AMDGPU_ABS64)
176 {
"fixup_si_sopp_br", 0, 16, 0},
190unsigned AMDGPUAsmBackend::getMinimumNopSize()
const {
200 unsigned MinInstAlignment = getContext().getAsmInfo()->getMinInstAlignment();
204 Count /= MinInstAlignment;
208 const uint32_t Encoded_S_NOP_0 = 0xbf800000;
210 assert(MinInstAlignment ==
sizeof(Encoded_S_NOP_0));
212 support::endian::write<uint32_t>(
OS, Encoded_S_NOP_0, Endian);
223class ELFAMDGPUAsmBackend :
public AMDGPUAsmBackend {
225 bool HasRelocationAddend;
230 : AMDGPUAsmBackend(
T), Is64Bit(
TT.isAMDGCN()),
231 HasRelocationAddend(
TT.getOS() ==
Triple::AMDHSA) {
232 switch (
TT.getOS()) {
247 std::unique_ptr<MCObjectTargetWriter>
248 createObjectTargetWriter()
const override {
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static uint64_t adjustFixupValue(const MCFixup &Fixup, uint64_t Value, MCContext *Ctx)
static unsigned getFixupKindNumBytes(unsigned Kind)
Provides AMDGPU specific target descriptions.
Analysis containing CSE Info
mir Rename Register Operands
PowerPC TLS Dynamic Call Fixup
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Generic interface to target specific assembler backends.
virtual unsigned getMinimumNopSize() const
Returns the minimum size of a nop in bytes on this target.
virtual bool writeNopData(raw_ostream &OS, uint64_t Count, const MCSubtargetInfo *STI) const =0
Write an (optimal) nop sequence of Count bytes to the given output.
virtual void relaxInstruction(MCInst &Inst, const MCSubtargetInfo &STI) const
Relax the instruction in the given fragment to the next wider instruction.
virtual MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
virtual bool mayNeedRelaxation(unsigned Opcode, ArrayRef< MCOperand > Operands, const MCSubtargetInfo &STI) const
Check whether the given instruction (encoded as Opcode+Operands) may need relaxation.
virtual bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value) const
Simple predicate for targets where !Resolved implies requiring relaxation.
virtual std::optional< MCFixupKind > getFixupKind(StringRef Name) const
Map a relocation name used in .reloc to a fixup kind.
virtual void applyFixup(const MCFragment &, const MCFixup &, const MCValue &Target, uint8_t *Data, uint64_t Value, bool IsResolved)=0
Context object for machine code objects.
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
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
StringRef - Represent a constant reference to a string, i.e.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
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 int getSOPPWithRelaxation(uint16_t Opcode)
bool isRelocation(MCFixupKind FixupKind)
This is an optimization pass for GlobalISel generic memory operations.
@ 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.
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)
Target independent information on a fixup kind.