[MC] Remove the MCAsmLayout parameter from MCMachObjectTargetWriter

This commit is contained in:
Fangrui Song 2024-06-30 21:53:35 -07:00
parent 8598bcb993
commit 262ad4cdf4
5 changed files with 83 additions and 108 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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(

View File

@ -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();

View File

@ -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();