[MC] Remove the MCAsmLayout parameter from MCMachObjectTargetWriter
This commit is contained in:
parent
8598bcb993
commit
262ad4cdf4
@ -73,7 +73,6 @@ public:
|
||||
/// @{
|
||||
|
||||
virtual void recordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue) = 0;
|
||||
|
||||
@ -502,8 +502,8 @@ void MachObjectWriter::recordRelocation(MCAssembler &Asm,
|
||||
return;
|
||||
}
|
||||
|
||||
TargetObjectWriter->recordRelocation(this, Asm, Layout, Fragment, Fixup,
|
||||
Target, FixedValue);
|
||||
TargetObjectWriter->recordRelocation(this, Asm, Fragment, Fixup, Target,
|
||||
FixedValue);
|
||||
}
|
||||
|
||||
void MachObjectWriter::bindIndirectSymbols(MCAssembler &Asm) {
|
||||
|
||||
@ -42,9 +42,8 @@ public:
|
||||
: MCMachObjectTargetWriter(!IsILP32 /* is64Bit */, CPUType, CPUSubtype) {}
|
||||
|
||||
void recordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout, const MCFragment *Fragment,
|
||||
const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue) override;
|
||||
const MCFragment *Fragment, const MCFixup &Fixup,
|
||||
MCValue Target, uint64_t &FixedValue) override;
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
@ -148,13 +147,12 @@ static bool canUseLocalRelocation(const MCSectionMachO &Section,
|
||||
}
|
||||
|
||||
void AArch64MachObjectWriter::recordRelocation(
|
||||
MachObjectWriter *Writer, MCAssembler &Asm, const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue) {
|
||||
MachObjectWriter *Writer, MCAssembler &Asm, const MCFragment *Fragment,
|
||||
const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue) {
|
||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||
|
||||
// See <reloc.h>.
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment);
|
||||
uint32_t FixupOffset = Asm.getFragmentOffset(*Fragment);
|
||||
unsigned Log2Size = 0;
|
||||
int64_t Value = 0;
|
||||
unsigned Index = 0;
|
||||
@ -227,8 +225,8 @@ void AArch64MachObjectWriter::recordRelocation(
|
||||
// ... _foo@got - Ltmp0
|
||||
if (Target.getSymA()->getKind() == MCSymbolRefExpr::VK_GOT &&
|
||||
Target.getSymB()->getKind() == MCSymbolRefExpr::VK_None &&
|
||||
Layout.getSymbolOffset(*B) ==
|
||||
Layout.getFragmentOffset(Fragment) + Fixup.getOffset()) {
|
||||
Asm.getSymbolOffset(*B) ==
|
||||
Asm.getFragmentOffset(*Fragment) + Fixup.getOffset()) {
|
||||
// SymB is the PC, so use a PC-rel pointer-to-GOT relocation.
|
||||
Type = MachO::ARM64_RELOC_POINTER_TO_GOT;
|
||||
IsPCRel = 1;
|
||||
@ -280,12 +278,18 @@ void AArch64MachObjectWriter::recordRelocation(
|
||||
return;
|
||||
}
|
||||
|
||||
Value += (!A->getFragment() ? 0 : Writer->getSymbolAddress(*A, Layout)) -
|
||||
(!A_Base || !A_Base->getFragment() ? 0 : Writer->getSymbolAddress(
|
||||
*A_Base, Layout));
|
||||
Value -= (!B->getFragment() ? 0 : Writer->getSymbolAddress(*B, Layout)) -
|
||||
(!B_Base || !B_Base->getFragment() ? 0 : Writer->getSymbolAddress(
|
||||
*B_Base, Layout));
|
||||
Value +=
|
||||
(!A->getFragment() ? 0
|
||||
: Writer->getSymbolAddress(*A, *Asm.getLayout())) -
|
||||
(!A_Base || !A_Base->getFragment()
|
||||
? 0
|
||||
: Writer->getSymbolAddress(*A_Base, *Asm.getLayout()));
|
||||
Value -=
|
||||
(!B->getFragment() ? 0
|
||||
: Writer->getSymbolAddress(*B, *Asm.getLayout())) -
|
||||
(!B_Base || !B_Base->getFragment()
|
||||
? 0
|
||||
: Writer->getSymbolAddress(*B_Base, *Asm.getLayout()));
|
||||
|
||||
Type = MachO::ARM64_RELOC_UNSIGNED;
|
||||
|
||||
@ -341,8 +345,7 @@ void AArch64MachObjectWriter::recordRelocation(
|
||||
|
||||
// Add the local offset, if needed.
|
||||
if (Base != Symbol)
|
||||
Value +=
|
||||
Layout.getSymbolOffset(*Symbol) - Layout.getSymbolOffset(*Base);
|
||||
Value += Asm.getSymbolOffset(*Symbol) - Asm.getSymbolOffset(*Base);
|
||||
} else if (Symbol->isInSection()) {
|
||||
if (!CanUseLocalRelocation) {
|
||||
Asm.getContext().reportError(
|
||||
@ -355,10 +358,10 @@ void AArch64MachObjectWriter::recordRelocation(
|
||||
// The index is the section ordinal (1-based).
|
||||
const MCSection &Sec = Symbol->getSection();
|
||||
Index = Sec.getOrdinal() + 1;
|
||||
Value += Writer->getSymbolAddress(*Symbol, Layout);
|
||||
Value += Writer->getSymbolAddress(*Symbol, *Asm.getLayout());
|
||||
|
||||
if (IsPCRel)
|
||||
Value -= Writer->getFragmentAddress(Fragment, Layout) +
|
||||
Value -= Writer->getFragmentAddress(Fragment, *Asm.getLayout()) +
|
||||
Fixup.getOffset() + (1ULL << Log2Size);
|
||||
} else {
|
||||
llvm_unreachable(
|
||||
|
||||
@ -27,18 +27,14 @@ using namespace llvm;
|
||||
|
||||
namespace {
|
||||
class ARMMachObjectWriter : public MCMachObjectTargetWriter {
|
||||
void RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
void recordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
unsigned Type,
|
||||
unsigned Log2Size,
|
||||
const MCFixup &Fixup, MCValue Target,
|
||||
unsigned Type, unsigned Log2Size,
|
||||
uint64_t &FixedValue);
|
||||
void RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
void recordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue);
|
||||
@ -53,9 +49,8 @@ public:
|
||||
: MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype) {}
|
||||
|
||||
void recordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout, const MCFragment *Fragment,
|
||||
const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue) override;
|
||||
const MCFragment *Fragment, const MCFixup &Fixup,
|
||||
MCValue Target, uint64_t &FixedValue) override;
|
||||
};
|
||||
}
|
||||
|
||||
@ -136,15 +131,11 @@ static bool getARMFixupKindMachOInfo(unsigned Kind, unsigned &RelocType,
|
||||
}
|
||||
}
|
||||
|
||||
void ARMMachObjectWriter::
|
||||
RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
uint64_t &FixedValue) {
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
void ARMMachObjectWriter::recordARMScatteredHalfRelocation(
|
||||
MachObjectWriter *Writer, const MCAssembler &Asm,
|
||||
const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue) {
|
||||
uint32_t FixupOffset = Asm.getFragmentOffset(*Fragment) + Fixup.getOffset();
|
||||
|
||||
if (FixupOffset & 0xff000000) {
|
||||
Asm.getContext().reportError(Fixup.getLoc(),
|
||||
@ -167,7 +158,7 @@ RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t Value = Writer->getSymbolAddress(*A, Layout);
|
||||
uint32_t Value = Writer->getSymbolAddress(*A, *Asm.getLayout());
|
||||
uint32_t Value2 = 0;
|
||||
uint64_t SecAddr = Writer->getSectionAddress(A->getFragment()->getParent());
|
||||
FixedValue += SecAddr;
|
||||
@ -184,7 +175,7 @@ RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
|
||||
// Select the appropriate difference relocation type.
|
||||
Type = MachO::ARM_RELOC_HALF_SECTDIFF;
|
||||
Value2 = Writer->getSymbolAddress(B->getSymbol(), Layout);
|
||||
Value2 = Writer->getSymbolAddress(B->getSymbol(), *Asm.getLayout());
|
||||
FixedValue -= Writer->getSectionAddress(SB->getFragment()->getParent());
|
||||
}
|
||||
|
||||
@ -250,16 +241,11 @@ RecordARMScatteredHalfRelocation(MachObjectWriter *Writer,
|
||||
Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
|
||||
}
|
||||
|
||||
void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
unsigned Type,
|
||||
unsigned Log2Size,
|
||||
uint64_t &FixedValue) {
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
void ARMMachObjectWriter::recordARMScatteredRelocation(
|
||||
MachObjectWriter *Writer, const MCAssembler &Asm,
|
||||
const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target,
|
||||
unsigned Type, unsigned Log2Size, uint64_t &FixedValue) {
|
||||
uint32_t FixupOffset = Asm.getFragmentOffset(*Fragment) + Fixup.getOffset();
|
||||
|
||||
if (FixupOffset & 0xff000000) {
|
||||
Asm.getContext().reportError(Fixup.getLoc(),
|
||||
@ -281,7 +267,7 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t Value = Writer->getSymbolAddress(*A, Layout);
|
||||
uint32_t Value = Writer->getSymbolAddress(*A, *Asm.getLayout());
|
||||
uint64_t SecAddr = Writer->getSectionAddress(A->getFragment()->getParent());
|
||||
FixedValue += SecAddr;
|
||||
uint32_t Value2 = 0;
|
||||
@ -299,7 +285,7 @@ void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter *Writer,
|
||||
|
||||
// Select the appropriate difference relocation type.
|
||||
Type = MachO::ARM_RELOC_SECTDIFF;
|
||||
Value2 = Writer->getSymbolAddress(B->getSymbol(), Layout);
|
||||
Value2 = Writer->getSymbolAddress(B->getSymbol(), *Asm.getLayout());
|
||||
FixedValue -= Writer->getSectionAddress(SB->getFragment()->getParent());
|
||||
}
|
||||
|
||||
@ -374,7 +360,6 @@ bool ARMMachObjectWriter::requiresExternRelocation(MachObjectWriter *Writer,
|
||||
|
||||
void ARMMachObjectWriter::recordRelocation(MachObjectWriter *Writer,
|
||||
MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue) {
|
||||
@ -395,11 +380,10 @@ void ARMMachObjectWriter::recordRelocation(MachObjectWriter *Writer,
|
||||
// relocations.
|
||||
if (Target.getSymB()) {
|
||||
if (RelocType == MachO::ARM_RELOC_HALF)
|
||||
return RecordARMScatteredHalfRelocation(Writer, Asm, Layout, Fragment,
|
||||
Fixup, Target, FixedValue);
|
||||
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||
Target, RelocType, Log2Size,
|
||||
FixedValue);
|
||||
return recordARMScatteredHalfRelocation(Writer, Asm, Fragment, Fixup,
|
||||
Target, FixedValue);
|
||||
return recordARMScatteredRelocation(Writer, Asm, Fragment, Fixup, Target,
|
||||
RelocType, Log2Size, FixedValue);
|
||||
}
|
||||
|
||||
// Get the symbol data, if any.
|
||||
@ -417,12 +401,11 @@ void ARMMachObjectWriter::recordRelocation(MachObjectWriter *Writer,
|
||||
Offset += 1 << Log2Size;
|
||||
if (Offset && A && !Writer->doesSymbolRequireExternRelocation(*A) &&
|
||||
RelocType != MachO::ARM_RELOC_HALF)
|
||||
return RecordARMScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||
Target, RelocType, Log2Size,
|
||||
FixedValue);
|
||||
return recordARMScatteredRelocation(Writer, Asm, Fragment, Fixup, Target,
|
||||
RelocType, Log2Size, FixedValue);
|
||||
|
||||
// See <reloc.h>.
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
uint32_t FixupOffset = Asm.getFragmentOffset(*Fragment) + Fixup.getOffset();
|
||||
unsigned Index = 0;
|
||||
unsigned Type = 0;
|
||||
const MCSymbol *RelSymbol = nullptr;
|
||||
@ -453,7 +436,7 @@ void ARMMachObjectWriter::recordRelocation(MachObjectWriter *Writer,
|
||||
// compensate for the addend of the symbol address, if it was
|
||||
// undefined. This occurs with weak definitions, for example.
|
||||
if (!A->isUndefined())
|
||||
FixedValue -= Layout.getSymbolOffset(*A);
|
||||
FixedValue -= Asm.getSymbolOffset(*A);
|
||||
} else {
|
||||
// The index is the section ordinal (1-based).
|
||||
const MCSection &Sec = A->getSection();
|
||||
|
||||
@ -27,7 +27,6 @@ namespace {
|
||||
class X86MachObjectWriter : public MCMachObjectTargetWriter {
|
||||
bool recordScatteredRelocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
@ -35,7 +34,6 @@ class X86MachObjectWriter : public MCMachObjectTargetWriter {
|
||||
uint64_t &FixedValue);
|
||||
void recordTLVPRelocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
@ -43,13 +41,11 @@ class X86MachObjectWriter : public MCMachObjectTargetWriter {
|
||||
|
||||
void RecordX86Relocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
uint64_t &FixedValue);
|
||||
void RecordX86_64Relocation(MachObjectWriter *Writer, MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment, const MCFixup &Fixup,
|
||||
MCValue Target, uint64_t &FixedValue);
|
||||
|
||||
@ -58,15 +54,12 @@ public:
|
||||
: MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype) {}
|
||||
|
||||
void recordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout, const MCFragment *Fragment,
|
||||
const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue) override {
|
||||
const MCFragment *Fragment, const MCFixup &Fixup,
|
||||
MCValue Target, uint64_t &FixedValue) override {
|
||||
if (Writer->is64Bit())
|
||||
RecordX86_64Relocation(Writer, Asm, Layout, Fragment, Fixup, Target,
|
||||
FixedValue);
|
||||
RecordX86_64Relocation(Writer, Asm, Fragment, Fixup, Target, FixedValue);
|
||||
else
|
||||
RecordX86Relocation(Writer, Asm, Layout, Fragment, Fixup, Target,
|
||||
FixedValue);
|
||||
RecordX86Relocation(Writer, Asm, Fragment, Fixup, Target, FixedValue);
|
||||
}
|
||||
};
|
||||
} // namespace
|
||||
@ -101,18 +94,17 @@ static unsigned getFixupKindLog2Size(unsigned Kind) {
|
||||
}
|
||||
|
||||
void X86MachObjectWriter::RecordX86_64Relocation(
|
||||
MachObjectWriter *Writer, MCAssembler &Asm, const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target,
|
||||
uint64_t &FixedValue) {
|
||||
MachObjectWriter *Writer, MCAssembler &Asm, const MCFragment *Fragment,
|
||||
const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue) {
|
||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||
unsigned IsRIPRel = isFixupKindRIPRel(Fixup.getKind());
|
||||
unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
|
||||
|
||||
// See <reloc.h>.
|
||||
uint32_t FixupOffset =
|
||||
Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
|
||||
uint32_t FixupOffset = Asm.getFragmentOffset(*Fragment) + Fixup.getOffset();
|
||||
uint32_t FixupAddress =
|
||||
Writer->getFragmentAddress(Fragment, Layout) + Fixup.getOffset();
|
||||
Writer->getFragmentAddress(Fragment, *Asm.getLayout()) +
|
||||
Fixup.getOffset();
|
||||
int64_t Value = 0;
|
||||
unsigned Index = 0;
|
||||
unsigned IsExtern = 0;
|
||||
@ -194,10 +186,12 @@ void X86MachObjectWriter::RecordX86_64Relocation(
|
||||
return;
|
||||
}
|
||||
|
||||
Value += Writer->getSymbolAddress(*A, Layout) -
|
||||
(!A_Base ? 0 : Writer->getSymbolAddress(*A_Base, Layout));
|
||||
Value -= Writer->getSymbolAddress(*B, Layout) -
|
||||
(!B_Base ? 0 : Writer->getSymbolAddress(*B_Base, Layout));
|
||||
Value +=
|
||||
Writer->getSymbolAddress(*A, *Asm.getLayout()) -
|
||||
(!A_Base ? 0 : Writer->getSymbolAddress(*A_Base, *Asm.getLayout()));
|
||||
Value -=
|
||||
Writer->getSymbolAddress(*B, *Asm.getLayout()) -
|
||||
(!B_Base ? 0 : Writer->getSymbolAddress(*B_Base, *Asm.getLayout()));
|
||||
|
||||
if (!A_Base)
|
||||
Index = A->getFragment()->getParent()->getOrdinal() + 1;
|
||||
@ -240,12 +234,11 @@ void X86MachObjectWriter::RecordX86_64Relocation(
|
||||
if (RelSymbol) {
|
||||
// Add the local offset, if needed.
|
||||
if (RelSymbol != Symbol)
|
||||
Value += Layout.getSymbolOffset(*Symbol) -
|
||||
Layout.getSymbolOffset(*RelSymbol);
|
||||
Value += Asm.getSymbolOffset(*Symbol) - Asm.getSymbolOffset(*RelSymbol);
|
||||
} else if (Symbol->isInSection() && !Symbol->isVariable()) {
|
||||
// The index is the section ordinal (1-based).
|
||||
Index = Symbol->getFragment()->getParent()->getOrdinal() + 1;
|
||||
Value += Writer->getSymbolAddress(*Symbol, Layout);
|
||||
Value += Writer->getSymbolAddress(*Symbol, *Asm.getLayout());
|
||||
|
||||
if (IsPCRel)
|
||||
Value -= FixupAddress + (1 << Log2Size);
|
||||
@ -363,14 +356,13 @@ void X86MachObjectWriter::RecordX86_64Relocation(
|
||||
|
||||
bool X86MachObjectWriter::recordScatteredRelocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
unsigned Log2Size,
|
||||
uint64_t &FixedValue) {
|
||||
uint64_t OriginalFixedValue = FixedValue;
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
uint32_t FixupOffset = Asm.getFragmentOffset(*Fragment) + Fixup.getOffset();
|
||||
unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
|
||||
unsigned Type = MachO::GENERIC_RELOC_VANILLA;
|
||||
|
||||
@ -385,7 +377,7 @@ bool X86MachObjectWriter::recordScatteredRelocation(MachObjectWriter *Writer,
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t Value = Writer->getSymbolAddress(*A, Layout);
|
||||
uint32_t Value = Writer->getSymbolAddress(*A, *Asm.getLayout());
|
||||
uint64_t SecAddr = Writer->getSectionAddress(A->getFragment()->getParent());
|
||||
FixedValue += SecAddr;
|
||||
uint32_t Value2 = 0;
|
||||
@ -408,7 +400,7 @@ bool X86MachObjectWriter::recordScatteredRelocation(MachObjectWriter *Writer,
|
||||
// pedantic compatibility with 'as'.
|
||||
Type = A->isExternal() ? (unsigned)MachO::GENERIC_RELOC_SECTDIFF
|
||||
: (unsigned)MachO::GENERIC_RELOC_LOCAL_SECTDIFF;
|
||||
Value2 = Writer->getSymbolAddress(*SB, Layout);
|
||||
Value2 = Writer->getSymbolAddress(*SB, *Asm.getLayout());
|
||||
FixedValue -= Writer->getSectionAddress(SB->getFragment()->getParent());
|
||||
}
|
||||
|
||||
@ -463,7 +455,6 @@ bool X86MachObjectWriter::recordScatteredRelocation(MachObjectWriter *Writer,
|
||||
|
||||
void X86MachObjectWriter::recordTLVPRelocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
@ -473,7 +464,7 @@ void X86MachObjectWriter::recordTLVPRelocation(MachObjectWriter *Writer,
|
||||
"Should only be called with a 32-bit TLVP relocation!");
|
||||
|
||||
unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
|
||||
uint32_t Value = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
uint32_t Value = Asm.getFragmentOffset(*Fragment) + Fixup.getOffset();
|
||||
unsigned IsPCRel = 0;
|
||||
|
||||
// We're only going to have a second symbol in pic mode and it'll be a
|
||||
@ -483,10 +474,11 @@ void X86MachObjectWriter::recordTLVPRelocation(MachObjectWriter *Writer,
|
||||
if (auto *SymB = Target.getSymB()) {
|
||||
// If this is a subtraction then we're pcrel.
|
||||
uint32_t FixupAddress =
|
||||
Writer->getFragmentAddress(Fragment, Layout) + Fixup.getOffset();
|
||||
Writer->getFragmentAddress(Fragment, *Asm.getLayout()) +
|
||||
Fixup.getOffset();
|
||||
IsPCRel = 1;
|
||||
FixedValue = FixupAddress -
|
||||
Writer->getSymbolAddress(SymB->getSymbol(), Layout) +
|
||||
Writer->getSymbolAddress(SymB->getSymbol(), *Asm.getLayout()) +
|
||||
Target.getConstant();
|
||||
FixedValue += 1ULL << Log2Size;
|
||||
} else {
|
||||
@ -503,7 +495,6 @@ void X86MachObjectWriter::recordTLVPRelocation(MachObjectWriter *Writer,
|
||||
|
||||
void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
|
||||
const MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
const MCFixup &Fixup,
|
||||
MCValue Target,
|
||||
@ -514,8 +505,7 @@ void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
|
||||
// If this is a 32-bit TLVP reloc it's handled a bit differently.
|
||||
if (Target.getSymA() &&
|
||||
Target.getSymA()->getKind() == MCSymbolRefExpr::VK_TLVP) {
|
||||
recordTLVPRelocation(Writer, Asm, Layout, Fragment, Fixup, Target,
|
||||
FixedValue);
|
||||
recordTLVPRelocation(Writer, Asm, Fragment, Fixup, Target, FixedValue);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -523,8 +513,8 @@ void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
|
||||
// scattered relocation entry. Differences always require scattered
|
||||
// relocations.
|
||||
if (Target.getSymB()) {
|
||||
recordScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup,
|
||||
Target, Log2Size, FixedValue);
|
||||
recordScatteredRelocation(Writer, Asm, Fragment, Fixup, Target, Log2Size,
|
||||
FixedValue);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -543,12 +533,12 @@ void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
|
||||
// scattered if necessary (see comments in recordScatteredRelocation()
|
||||
// for details).
|
||||
if (Offset && A && !Writer->doesSymbolRequireExternRelocation(*A) &&
|
||||
recordScatteredRelocation(Writer, Asm, Layout, Fragment, Fixup, Target,
|
||||
Log2Size, FixedValue))
|
||||
recordScatteredRelocation(Writer, Asm, Fragment, Fixup, Target, Log2Size,
|
||||
FixedValue))
|
||||
return;
|
||||
|
||||
// See <reloc.h>.
|
||||
uint32_t FixupOffset = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
|
||||
uint32_t FixupOffset = Asm.getFragmentOffset(*Fragment) + Fixup.getOffset();
|
||||
unsigned Index = 0;
|
||||
unsigned Type = 0;
|
||||
const MCSymbol *RelSymbol = nullptr;
|
||||
@ -579,7 +569,7 @@ void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
|
||||
// compensate for the addend of the symbol address, if it was
|
||||
// undefined. This occurs with weak definitions, for example.
|
||||
if (!A->isUndefined())
|
||||
FixedValue -= Layout.getSymbolOffset(*A);
|
||||
FixedValue -= Asm.getSymbolOffset(*A);
|
||||
} else {
|
||||
// The index is the section ordinal (1-based).
|
||||
const MCSection &Sec = A->getSection();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user