diff --git a/include/llvm/MC/MCAsmLayout.h b/include/llvm/MC/MCAsmLayout.h index ae7fd7c2e29..ae008300f0e 100644 --- a/include/llvm/MC/MCAsmLayout.h +++ b/include/llvm/MC/MCAsmLayout.h @@ -99,10 +99,10 @@ public: /// \brief Get the offset of the given symbol, as computed in the current /// layout. /// \return True on success. - bool getSymbolOffset(const MCSymbolData *SD, uint64_t &Val) const; + bool getSymbolOffset(const MCSymbol &S, uint64_t &Val) const; /// \brief Variant that reports a fatal error if the offset is not computable. - uint64_t getSymbolOffset(const MCSymbolData *SD) const; + uint64_t getSymbolOffset(const MCSymbol &S) const; /// \brief If this symbol is equivalent to A + Constant, return A. const MCSymbol *getBaseSymbol(const MCSymbol &Symbol) const; diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 9f87cd1f183..97d6d39f2ec 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -407,7 +407,7 @@ uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &Data, return Data.getCommonAlignment(); uint64_t Res; - if (!Layout.getSymbolOffset(&Data, Res)) + if (!Layout.getSymbolOffset(Data.getSymbol(), Res)) return 0; if (Layout.getAssembler().isThumbFunc(&Data.getSymbol())) @@ -800,12 +800,11 @@ void ELFObjectWriter::RecordRelocation(MCAssembler &Asm, Asm.getContext().reportFatalError( Fixup.getLoc(), "Cannot represent a difference across sections"); - const MCSymbolData &SymBD = Asm.getSymbolData(SymB); - if (::isWeak(SymBD)) + if (::isWeak(SymB.getData())) Asm.getContext().reportFatalError( Fixup.getLoc(), "Cannot represent a subtraction with a weak symbol"); - uint64_t SymBOffset = Layout.getSymbolOffset(&SymBD); + uint64_t SymBOffset = Layout.getSymbolOffset(SymB); uint64_t K = SymBOffset - FixupOffset; IsPCRel = true; C -= K; @@ -819,7 +818,7 @@ void ELFObjectWriter::RecordRelocation(MCAssembler &Asm, unsigned Type = GetRelocType(Target, Fixup, IsPCRel); bool RelocateWithSymbol = shouldRelocateWithSymbol(Asm, RefA, SymAD, C, Type); if (!RelocateWithSymbol && SymA && !SymA->isUndefined()) - C += Layout.getSymbolOffset(SymAD); + C += Layout.getSymbolOffset(*SymA); uint64_t Addend = 0; if (hasRelocationAddend()) { diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 18687cdd6a2..1f1e9a16d50 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -132,13 +132,10 @@ static bool getLabelOffset(const MCAsmLayout &Layout, const MCSymbolData &SD, return true; } -static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, - const MCSymbolData *SD, bool ReportError, - uint64_t &Val) { - const MCSymbol &S = SD->getSymbol(); - +static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, const MCSymbol &S, + bool ReportError, uint64_t &Val) { if (!S.isVariable()) - return getLabelOffset(Layout, *SD, ReportError, Val); + return getLabelOffset(Layout, S.getData(), ReportError, Val); // If SD is a variable, evaluate it. MCValue Target; @@ -172,13 +169,13 @@ static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, return true; } -bool MCAsmLayout::getSymbolOffset(const MCSymbolData *SD, uint64_t &Val) const { - return getSymbolOffsetImpl(*this, SD, false, Val); +bool MCAsmLayout::getSymbolOffset(const MCSymbol &S, uint64_t &Val) const { + return getSymbolOffsetImpl(*this, S, false, Val); } -uint64_t MCAsmLayout::getSymbolOffset(const MCSymbolData *SD) const { +uint64_t MCAsmLayout::getSymbolOffset(const MCSymbol &S) const { uint64_t Val; - getSymbolOffsetImpl(*this, SD, true, Val); + getSymbolOffsetImpl(*this, S, true, Val); return Val; } @@ -519,12 +516,12 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout, if (const MCSymbolRefExpr *A = Target.getSymA()) { const MCSymbol &Sym = A->getSymbol(); if (Sym.isDefined()) - Value += Layout.getSymbolOffset(&getSymbolData(Sym)); + Value += Layout.getSymbolOffset(Sym); } if (const MCSymbolRefExpr *B = Target.getSymB()) { const MCSymbol &Sym = B->getSymbol(); if (Sym.isDefined()) - Value -= Layout.getSymbolOffset(&getSymbolData(Sym)); + Value -= Layout.getSymbolOffset(Sym); } diff --git a/lib/MC/MCExpr.cpp b/lib/MC/MCExpr.cpp index 01a63665484..cd11caec6bc 100644 --- a/lib/MC/MCExpr.cpp +++ b/lib/MC/MCExpr.cpp @@ -498,8 +498,8 @@ static void AttemptToFoldSymbolOffsetDifference( return; // Eagerly evaluate. - Addend += (Layout->getSymbolOffset(&Asm->getSymbolData(A->getSymbol())) - - Layout->getSymbolOffset(&Asm->getSymbolData(B->getSymbol()))); + Addend += Layout->getSymbolOffset(A->getSymbol()) - + Layout->getSymbolOffset(B->getSymbol()); if (Addrs && (&SecA != &SecB)) Addend += (Addrs->lookup(&SecA) - Addrs->lookup(&SecB)); diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp index 002aa3c705e..12e5a17ea22 100644 --- a/lib/MC/MachObjectWriter.cpp +++ b/lib/MC/MachObjectWriter.cpp @@ -108,7 +108,7 @@ uint64_t MachObjectWriter::getSymbolAddress(const MCSymbolData* SD, } return getSectionAddress(SD->getFragment()->getParent()) + - Layout.getSymbolOffset(SD); + Layout.getSymbolOffset(S); } uint64_t MachObjectWriter::getPaddingSize(const MCSectionData *SD, diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 278329aed5f..6bf4a4d2136 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -355,7 +355,7 @@ static uint64_t getSymbolValue(const MCSymbolData &Data, return Data.getCommonSize(); uint64_t Res; - if (!Layout.getSymbolOffset(&Data, Res)) + if (!Layout.getSymbolOffset(Data.getSymbol(), Res)) return 0; return Res; @@ -724,13 +724,13 @@ void WinCOFFObjectWriter::RecordRelocation( CrossSection = &Symbol.getSection() != &B->getSection(); // Offset of the symbol in the section - int64_t OffsetOfB = Layout.getSymbolOffset(&B_SD); + int64_t OffsetOfB = Layout.getSymbolOffset(*B); // In the case where we have SymbA and SymB, we just need to store the delta // between the two symbols. Update FixedValue to account for the delta, and // skip recording the relocation. if (!CrossSection) { - int64_t OffsetOfA = Layout.getSymbolOffset(&A_SD); + int64_t OffsetOfA = Layout.getSymbolOffset(A); FixedValue = (OffsetOfA - OffsetOfB) + Target.getConstant(); return; } diff --git a/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp b/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp index 99f30bcac7e..8abe78c8ced 100644 --- a/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp +++ b/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp @@ -221,7 +221,7 @@ void AArch64MachObjectWriter::RecordRelocation( // ... _foo@got - Ltmp0 if (Target.getSymA()->getKind() == MCSymbolRefExpr::VK_GOT && Target.getSymB()->getKind() == MCSymbolRefExpr::VK_None && - Layout.getSymbolOffset(&B_SD) == + Layout.getSymbolOffset(*B) == Layout.getFragmentOffset(Fragment) + Fixup.getOffset()) { // SymB is the PC, so use a PC-rel pointer-to-GOT relocation. Type = MachO::ARM64_RELOC_POINTER_TO_GOT; @@ -341,9 +341,9 @@ void AArch64MachObjectWriter::RecordRelocation( RelSymbol = Base; // Add the local offset, if needed. - if (&Base->getData() != &SD) - Value += Layout.getSymbolOffset(&SD) - - Layout.getSymbolOffset(&Base->getData()); + if (Base != Symbol) + Value += + Layout.getSymbolOffset(*Symbol) - Layout.getSymbolOffset(*Base); } else if (Symbol->isInSection()) { if (!CanUseLocalRelocation) Asm.getContext().reportFatalError( diff --git a/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp b/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp index 5b85a2a41fa..4572119779a 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp @@ -422,7 +422,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 (!SD->getSymbol().isUndefined()) - FixedValue -= Layout.getSymbolOffset(SD); + FixedValue -= Layout.getSymbolOffset(SD->getSymbol()); } else { // The index is the section ordinal (1-based). const MCSectionData &SymSD = Asm.getSectionData( diff --git a/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp b/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp index 6e10169e923..d7dd4581508 100644 --- a/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp +++ b/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp @@ -360,7 +360,7 @@ void PPCMachObjectWriter::RecordPPCRelocation( // compensate for the addend of the symbol address, if it was // undefined. This occurs with weak definitions, for example. if (!SD->getSymbol().isUndefined()) - FixedValue -= Layout.getSymbolOffset(SD); + FixedValue -= Layout.getSymbolOffset(SD->getSymbol()); } else { // The index is the section ordinal (1-based). const MCSectionData &SymSD = diff --git a/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp b/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp index 3ede3ce1df1..01f4bbe03e1 100644 --- a/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp +++ b/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp @@ -232,9 +232,9 @@ void X86MachObjectWriter::RecordX86_64Relocation( // non-local symbol). if (RelSymbol) { // Add the local offset, if needed. - if (&RelSymbol->getData() != &SD) - Value += Layout.getSymbolOffset(&SD) - - Layout.getSymbolOffset(&RelSymbol->getData()); + if (RelSymbol != Symbol) + Value += Layout.getSymbolOffset(*Symbol) - + Layout.getSymbolOffset(*RelSymbol); } else if (Symbol->isInSection() && !Symbol->isVariable()) { // The index is the section ordinal (1-based). Index = SD.getFragment()->getParent()->getOrdinal() + 1; @@ -553,7 +553,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 (!SD->getSymbol().isUndefined()) - FixedValue -= Layout.getSymbolOffset(SD); + FixedValue -= Layout.getSymbolOffset(SD->getSymbol()); } else { // The index is the section ordinal (1-based). const MCSectionData &SymSD = Asm.getSectionData(