41 std::string Diagnostic =
"out of range " + Description;
46 Diagnostic +=
" (expected an integer in the range " + std::to_string(Min) +
47 " to " + std::to_string(Max) +
")";
50 Ctx->reportError(
Fixup.getLoc(), Diagnostic);
61 std::string Diagnostic =
"out of range " + Description;
66 " (expected an integer in the range 0 to " + std::to_string(Max) +
")";
69 Ctx->reportError(
Fixup.getLoc(), Diagnostic);
108 auto top =
Value & (0xf00000 << 6);
109 auto middle =
Value & (0x1ffff << 5);
110 auto bottom =
Value & 0x1f;
112 Value = (top << 6) | (middle << 3) | (bottom << 0);
217 Value = (upper << 4) | lower;
258 unsigned Kind =
Fixup.getKind();
373std::unique_ptr<MCObjectTargetWriter>
392 auto NumBits =
Info.TargetSize +
Info.TargetOffset;
393 auto NumBytes = (NumBits / 8) + ((NumBits % 8) == 0 ? 0 : 1);
403 for (
unsigned i = 0; i < NumBytes; ++i) {
404 uint8_t mask = (((
Value >> (i * 8)) & 0xff));
412#define ELF_RELOC(X, Y) .Case(#X, Y)
413#include "llvm/BinaryFormat/ELFRelocs/AVR.def"
415 .
Case(
"BFD_RELOC_NONE", ELF::R_AVR_NONE)
416 .
Case(
"BFD_RELOC_16", ELF::R_AVR_16)
417 .
Case(
"BFD_RELOC_32", ELF::R_AVR_32)
432 {
"fixup_32", 0, 32, 0},
437 {
"fixup_16", 0, 16, 0},
438 {
"fixup_16_pm", 0, 16, 0},
440 {
"fixup_ldi", 0, 8, 0},
442 {
"fixup_lo8_ldi", 0, 8, 0},
443 {
"fixup_hi8_ldi", 0, 8, 0},
444 {
"fixup_hh8_ldi", 0, 8, 0},
445 {
"fixup_ms8_ldi", 0, 8, 0},
447 {
"fixup_lo8_ldi_neg", 0, 8, 0},
448 {
"fixup_hi8_ldi_neg", 0, 8, 0},
449 {
"fixup_hh8_ldi_neg", 0, 8, 0},
450 {
"fixup_ms8_ldi_neg", 0, 8, 0},
452 {
"fixup_lo8_ldi_pm", 0, 8, 0},
453 {
"fixup_hi8_ldi_pm", 0, 8, 0},
454 {
"fixup_hh8_ldi_pm", 0, 8, 0},
456 {
"fixup_lo8_ldi_pm_neg", 0, 8, 0},
457 {
"fixup_hi8_ldi_pm_neg", 0, 8, 0},
458 {
"fixup_hh8_ldi_pm_neg", 0, 8, 0},
460 {
"fixup_call", 0, 22, 0},
462 {
"fixup_6", 0, 16, 0},
463 {
"fixup_6_adiw", 0, 6, 0},
465 {
"fixup_lo8_ldi_gs", 0, 8, 0},
466 {
"fixup_hi8_ldi_gs", 0, 8, 0},
468 {
"fixup_8", 0, 8, 0},
469 {
"fixup_8_lo8", 0, 8, 0},
470 {
"fixup_8_hi8", 0, 8, 0},
471 {
"fixup_8_hlo8", 0, 8, 0},
473 {
"fixup_diff8", 0, 8, 0},
474 {
"fixup_diff16", 0, 16, 0},
475 {
"fixup_diff32", 0, 32, 0},
477 {
"fixup_lds_sts_16", 0, 16, 0},
479 {
"fixup_port6", 0, 16, 0},
480 {
"fixup_port5", 3, 5, 0},
502 assert((Count % 2) == 0 &&
"NOP instructions must be 2 bytes");
504 OS.write_zeros(Count);
511 switch ((
unsigned)
Fixup.getKind()) {
519 if (
const auto *SymA =
Target.getSymA())
520 if (SymA->getSymbol().getName().size() == 0)
unsigned const MachineRegisterInfo * MRI
Analysis containing CSE Info
PowerPC TLS Dynamic Call Fixup
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Utilities for manipulating generated AVR machine code.
const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const override
Get information on a fixup kind.
bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup, const MCValue &Target) override
Hook to check if a relocation is needed for some target specific reason.
std::unique_ptr< MCObjectTargetWriter > createObjectTargetWriter() const override
void adjustFixupValue(const MCFixup &Fixup, const MCValue &Target, uint64_t &Value, MCContext *Ctx=nullptr) const
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...
std::optional< MCFixupKind > getFixupKind(StringRef Name) const override
Map a relocation name used in .reloc to a fixup kind.
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.
unsigned getNumFixupKinds() const override
Get the number of target specific fixup kinds.
Generic interface to target specific assembler backends.
virtual const 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)...
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
This represents an "assembler immediate".
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
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.
OSType getOS() const
Get the parsed operating system type of this triple.
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.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static void hi8(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
static void neg(uint64_t &Value)
static void hh8(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
static void fixup(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
Adjusts a value to fix up the immediate of an LDI Rd, K instruction.
static void lo8(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
static void ms8(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
static void unsigned_width(unsigned Width, uint64_t Value, std::string Description, const MCFixup &Fixup, MCContext *Ctx=nullptr)
static void fixup_6(const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
6-bit fixup for the immediate operand of the STD/LDD family of instructions.
static void fixup_13_pcrel(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
12-bit PC-relative fixup.
static void fixup_port6(const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
6-bit port number fixup on the IN family of instructions.
static void fixup_lds_sts_16(const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
7-bit data space address fixup for the LDS/STS instructions on AVRTiny.
static void signed_width(unsigned Width, uint64_t Value, std::string Description, const MCFixup &Fixup, MCContext *Ctx=nullptr)
static void adjustBranch(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
Adjusts the value of a branch target before fixup application.
static void pm(uint64_t &Value)
Adjusts a program memory address.
static void fixup_call(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
22-bit absolute fixup.
static void fixup_6_adiw(const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
6-bit fixup for the immediate operand of the ADIW family of instructions.
static void adjustRelativeBranch(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
Adjusts the value of a relative branch target before fixup application.
static void fixup_7_pcrel(unsigned Size, const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
7-bit PC-relative fixup.
static void fixup_port5(const MCFixup &Fixup, uint64_t &Value, MCContext *Ctx=nullptr)
5-bit port number fixup on the SBIC family of instructions.
void adjustBranchTarget(T &val)
Adjusts the value of a branch target.
@ fixup_16_pm
A 16-bit program memory address.
@ fixup_16
A 16-bit address.
@ fixup_call
A 22-bit fixup for the target of a CALL k or JMP k instruction.
@ fixup_hh8_ldi
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a 24-bit value ...
@ fixup_ms8_ldi_neg
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a negated negat...
@ fixup_lo8_ldi_neg
Replaces the immediate operand of a 16-bit Rd, K instruction with the lower 8 bits of a negated 16-bi...
@ fixup_6_adiw
A symbol+addr fixup for the `LDD <x>+<n>, <r>" family of instructions.
@ fixup_ms8_ldi
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a 32-bit value ...
@ fixup_7_pcrel
A 7-bit PC-relative fixup for the family of conditional branches which take 7-bit targets (BRNE,...
@ fixup_ldi
Replaces the 8-bit immediate with another value.
@ fixup_lo8_ldi
Replaces the immediate operand of a 16-bit Rd, K instruction with the lower 8 bits of a 16-bit value ...
@ fixup_hi8_ldi_pm_neg
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a negated 16-bi...
@ fixup_hi8_ldi
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a 16-bit value ...
@ fixup_lo8_ldi_pm
Replaces the immediate operand of a 16-bit Rd, K instruction with the lower 8 bits of a 16-bit progra...
@ fixup_port6
A 6-bit port address.
@ fixup_hh8_ldi_neg
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a negated negat...
@ fixup_hh8_ldi_pm
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a 24-bit progra...
@ fixup_port5
A 5-bit port address.
@ fixup_lo8_ldi_pm_neg
Replaces the immediate operand of a 16-bit Rd, K instruction with the lower 8 bits of a negated 16-bi...
@ fixup_hi8_ldi_pm
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a 16-bit progra...
@ fixup_hh8_ldi_pm_neg
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a negated 24-bi...
@ fixup_13_pcrel
A 12-bit PC-relative fixup for the family of branches which take 12-bit targets (RJMP,...
@ fixup_hi8_ldi_neg
Replaces the immediate operand of a 16-bit Rd, K instruction with the upper 8 bits of a negated 16-bi...
This is an optimization pass for GlobalISel generic memory operations.
int64_t maxIntN(int64_t N)
Gets the maximum value for a N-bit signed integer.
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
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_GPRel_4
A four-byte gp relative fixup.
@ FK_Data_2
A two-byte fixup.
std::unique_ptr< MCObjectTargetWriter > createAVRELFObjectWriter(uint8_t OSABI)
Creates an ELF object writer for AVR.
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
int64_t minIntN(int64_t N)
Gets the minimum value for a N-bit signed integer.
MCAsmBackend * createAVRAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const llvm::MCTargetOptions &TO)
Creates an assembly backend for AVR.
uint64_t maxUIntN(uint64_t N)
Gets the maximum value for a N-bit unsigned integer.
Target independent information on a fixup kind.
@ FKF_IsPCRel
Is this fixup kind PCrelative? This is used by the assembler backend to evaluate fixup values in a ta...
unsigned TargetSize
The number of bits written by this fixup.