18#define DEBUG_TYPE "csky-asmbackend"
22std::unique_ptr<MCObjectTargetWriter>
37 {
"fixup_csky_pcrel_uimm16_scale4", 0, 32,
41 {
"fixup_csky_pcrel_uimm8_scale4", 0, 32,
50 {
"fixup_csky_got_imm18_scale4", 0, 32, 0}},
56 {
"fixup_csky_plt_imm18_scale4", 0, 32, 0}},
60 {
"fixup_csky_pcrel_uimm7_scale4", 0, 16,
64 {
"fixup_csky_doffset_imm18", 0, 18, 0}},
66 {
"fixup_csky_doffset_imm18_scale2", 0, 18, 0}},
68 {
"fixup_csky_doffset_imm18_scale4", 0, 18, 0}}};
71 "Not all fixup kinds added to Infos array");
87 switch (
Fixup.getTargetKind()) {
103 return Value & 0xffffffff;
110 return (
Value >> 1) & 0xffff;
117 return (
Value >> 2) & 0xffff;
124 return (
Value >> 1) & 0x3ffffff;
131 return (
Value >> 1) & 0x3ffff;
138 unsigned IMM4L = (
Value >> 2) & 0xf;
139 unsigned IMM4H = (
Value >> 6) & 0xf;
141 Value = (IMM4H << 21) | (IMM4L << 4);
150 return (
Value >> 1) & 0x3ff;
152 if ((
Value >> 2) > 0xfe)
157 if ((
Value >> 2) <= 0x7f) {
158 unsigned IMM5L = (
Value >> 2) & 0x1f;
159 unsigned IMM2H = (
Value >> 7) & 0x3;
161 Value = (1 << 12) | (IMM2H << 8) | IMM5L;
163 unsigned IMM5L = (
~Value >> 2) & 0x1f;
164 unsigned IMM2H = (
~Value >> 7) & 0x3;
166 Value = (IMM2H << 8) | IMM5L;
177 const bool WasForced)
const {
182 if (!Resolved && !WasForced)
186 switch (
Fixup.getTargetKind()) {
190 return !isShiftedInt<10, 1>(
Offset);
192 return !isShiftedInt<16, 1>(
Offset);
194 return !isShiftedInt<26, 1>(
Offset);
196 return ((
Value >> 2) > 0xfe) || (
Value & 0x3);
219 unsigned NumBytes =
alignTo(
Info.TargetSize +
Info.TargetOffset, 8) / 8;
228 if (IsLittleEndian && IsInstFixup && (NumBytes == 4)) {
234 for (
unsigned I = 0;
I != NumBytes;
I++) {
235 unsigned Idx = IsLittleEndian ?
I : (NumBytes - 1 -
I);
268 switch (
Fixup.getTargetKind()) {
333 opcode = Inst.
getOpcode() == CSKY::JBT16 ? CSKY::JBT32 : CSKY::JBF32;
335 opcode = Inst.
getOpcode() == CSKY::JBT16 ? CSKY::JBT_E : CSKY::JBF_E;
343 Inst = std::move(Res);
unsigned const MachineRegisterInfo * MRI
static uint64_t adjustFixupValue(const MCFixup &Fixup, const MCValue &Target, uint64_t Value, MCContext &Ctx, const Triple &TheTriple, bool IsResolved)
Analysis containing CSE Info
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
This file defines the DenseMap class.
PowerPC TLS Dynamic Call Fixup
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const override
Get information on a fixup kind.
bool mayNeedRelaxation(const MCInst &Inst, const MCSubtargetInfo &STI) const override
Check whether the given instruction may need relaxation.
bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value) const override
Simple predicate for targets where !Resolved implies requiring relaxation.
void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, const MCValue &Target, MutableArrayRef< char > Data, uint64_t Value, bool IsResolved, const MCSubtargetInfo *STI) const override
Apply the Value for given Fixup into the provided data fragment, at the offset specified by the fixup...
void relaxInstruction(MCInst &Inst, const MCSubtargetInfo &STI) const override
Relax the instruction in the given fragment to the next wider instruction.
unsigned int getNumFixupKinds() const override
Get the number of target specific fixup kinds.
bool fixupNeedsRelaxationAdvanced(const MCAssembler &Asm, const MCFixup &Fixup, bool Resolved, uint64_t Value, const MCRelaxableFragment *DF, const bool WasForced) const override
Target specific predicate for whether a given fixup requires the associated instruction to be relaxed...
std::unique_ptr< MCObjectTargetWriter > createObjectTargetWriter() const override
bool writeNopData(raw_ostream &OS, uint64_t Count, const MCSubtargetInfo *STI) const override
Write an (optimal) nop sequence of Count bytes to the given output.
bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup, const MCValue &Target, const MCSubtargetInfo *STI) override
Hook to check if a relocation is needed for some target specific reason.
Generic interface to target specific assembler backends.
const llvm::endianness Endian
virtual const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
Context object for machine code objects.
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...
A relaxable fragment holds on to its MCInst, since it may need to be relaxed during the assembler lay...
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
This represents an "assembler immediate".
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Target - Wrapper for Target specific information.
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_csky_pcrel_imm10_scale2
@ fixup_csky_pcrel_uimm7_scale4
@ fixup_csky_doffset_imm18_scale2
@ fixup_csky_pcrel_imm16_scale2
@ fixup_csky_pcrel_imm18_scale2
@ fixup_csky_doffset_imm18_scale4
@ fixup_csky_pcrel_uimm16_scale4
@ fixup_csky_plt_imm18_scale4
@ fixup_csky_pcrel_imm26_scale2
@ fixup_csky_got_imm18_scale4
@ fixup_csky_pcrel_uimm8_scale4
@ fixup_csky_doffset_imm18
This is an optimization pass for GlobalISel generic memory operations.
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
MCAsmBackend * createCSKYAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)
std::unique_ptr< MCObjectTargetWriter > createCSKYELFObjectWriter()
MCFixupKind
Extensible enumeration to represent the type of a fixup.
@ FirstLiteralRelocationKind
The range [FirstLiteralRelocationKind, MaxTargetFixupKind) is used for relocations coming from ....
@ FK_Data_8
A eight-byte fixup.
@ FK_Data_1
A one-byte fixup.
@ FK_Data_4
A four-byte fixup.
@ FK_Data_2
A two-byte fixup.
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Target independent information on a fixup kind.
@ FKF_IsAlignedDownTo32Bits
Should this fixup kind force a 4-byte aligned effective PC value?
@ FKF_IsPCRel
Is this fixup kind PCrelative? This is used by the assembler backend to evaluate fixup values in a ta...