MC: Use MCSymbol in MCAsmLayout::getSymbolOffset(), NFC

Continue to canonicalize on MCSymbol instead of MCSymbolData when both
are needed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237749 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith
2015-05-19 23:53:20 +00:00
parent a5703bc52e
commit e1fce8692d
10 changed files with 31 additions and 35 deletions

View File

@ -99,10 +99,10 @@ public:
/// \brief Get the offset of the given symbol, as computed in the current /// \brief Get the offset of the given symbol, as computed in the current
/// layout. /// layout.
/// \return True on success. /// \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. /// \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. /// \brief If this symbol is equivalent to A + Constant, return A.
const MCSymbol *getBaseSymbol(const MCSymbol &Symbol) const; const MCSymbol *getBaseSymbol(const MCSymbol &Symbol) const;

View File

@ -407,7 +407,7 @@ uint64_t ELFObjectWriter::SymbolValue(MCSymbolData &Data,
return Data.getCommonAlignment(); return Data.getCommonAlignment();
uint64_t Res; uint64_t Res;
if (!Layout.getSymbolOffset(&Data, Res)) if (!Layout.getSymbolOffset(Data.getSymbol(), Res))
return 0; return 0;
if (Layout.getAssembler().isThumbFunc(&Data.getSymbol())) if (Layout.getAssembler().isThumbFunc(&Data.getSymbol()))
@ -800,12 +800,11 @@ void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
Asm.getContext().reportFatalError( Asm.getContext().reportFatalError(
Fixup.getLoc(), "Cannot represent a difference across sections"); Fixup.getLoc(), "Cannot represent a difference across sections");
const MCSymbolData &SymBD = Asm.getSymbolData(SymB); if (::isWeak(SymB.getData()))
if (::isWeak(SymBD))
Asm.getContext().reportFatalError( Asm.getContext().reportFatalError(
Fixup.getLoc(), "Cannot represent a subtraction with a weak symbol"); 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; uint64_t K = SymBOffset - FixupOffset;
IsPCRel = true; IsPCRel = true;
C -= K; C -= K;
@ -819,7 +818,7 @@ void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
unsigned Type = GetRelocType(Target, Fixup, IsPCRel); unsigned Type = GetRelocType(Target, Fixup, IsPCRel);
bool RelocateWithSymbol = shouldRelocateWithSymbol(Asm, RefA, SymAD, C, Type); bool RelocateWithSymbol = shouldRelocateWithSymbol(Asm, RefA, SymAD, C, Type);
if (!RelocateWithSymbol && SymA && !SymA->isUndefined()) if (!RelocateWithSymbol && SymA && !SymA->isUndefined())
C += Layout.getSymbolOffset(SymAD); C += Layout.getSymbolOffset(*SymA);
uint64_t Addend = 0; uint64_t Addend = 0;
if (hasRelocationAddend()) { if (hasRelocationAddend()) {

View File

@ -132,13 +132,10 @@ static bool getLabelOffset(const MCAsmLayout &Layout, const MCSymbolData &SD,
return true; return true;
} }
static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, const MCSymbol &S,
const MCSymbolData *SD, bool ReportError, bool ReportError, uint64_t &Val) {
uint64_t &Val) {
const MCSymbol &S = SD->getSymbol();
if (!S.isVariable()) if (!S.isVariable())
return getLabelOffset(Layout, *SD, ReportError, Val); return getLabelOffset(Layout, S.getData(), ReportError, Val);
// If SD is a variable, evaluate it. // If SD is a variable, evaluate it.
MCValue Target; MCValue Target;
@ -172,13 +169,13 @@ static bool getSymbolOffsetImpl(const MCAsmLayout &Layout,
return true; return true;
} }
bool MCAsmLayout::getSymbolOffset(const MCSymbolData *SD, uint64_t &Val) const { bool MCAsmLayout::getSymbolOffset(const MCSymbol &S, uint64_t &Val) const {
return getSymbolOffsetImpl(*this, SD, false, Val); 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; uint64_t Val;
getSymbolOffsetImpl(*this, SD, true, Val); getSymbolOffsetImpl(*this, S, true, Val);
return Val; return Val;
} }
@ -519,12 +516,12 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
if (const MCSymbolRefExpr *A = Target.getSymA()) { if (const MCSymbolRefExpr *A = Target.getSymA()) {
const MCSymbol &Sym = A->getSymbol(); const MCSymbol &Sym = A->getSymbol();
if (Sym.isDefined()) if (Sym.isDefined())
Value += Layout.getSymbolOffset(&getSymbolData(Sym)); Value += Layout.getSymbolOffset(Sym);
} }
if (const MCSymbolRefExpr *B = Target.getSymB()) { if (const MCSymbolRefExpr *B = Target.getSymB()) {
const MCSymbol &Sym = B->getSymbol(); const MCSymbol &Sym = B->getSymbol();
if (Sym.isDefined()) if (Sym.isDefined())
Value -= Layout.getSymbolOffset(&getSymbolData(Sym)); Value -= Layout.getSymbolOffset(Sym);
} }

View File

@ -498,8 +498,8 @@ static void AttemptToFoldSymbolOffsetDifference(
return; return;
// Eagerly evaluate. // Eagerly evaluate.
Addend += (Layout->getSymbolOffset(&Asm->getSymbolData(A->getSymbol())) - Addend += Layout->getSymbolOffset(A->getSymbol()) -
Layout->getSymbolOffset(&Asm->getSymbolData(B->getSymbol()))); Layout->getSymbolOffset(B->getSymbol());
if (Addrs && (&SecA != &SecB)) if (Addrs && (&SecA != &SecB))
Addend += (Addrs->lookup(&SecA) - Addrs->lookup(&SecB)); Addend += (Addrs->lookup(&SecA) - Addrs->lookup(&SecB));

View File

@ -108,7 +108,7 @@ uint64_t MachObjectWriter::getSymbolAddress(const MCSymbolData* SD,
} }
return getSectionAddress(SD->getFragment()->getParent()) + return getSectionAddress(SD->getFragment()->getParent()) +
Layout.getSymbolOffset(SD); Layout.getSymbolOffset(S);
} }
uint64_t MachObjectWriter::getPaddingSize(const MCSectionData *SD, uint64_t MachObjectWriter::getPaddingSize(const MCSectionData *SD,

View File

@ -355,7 +355,7 @@ static uint64_t getSymbolValue(const MCSymbolData &Data,
return Data.getCommonSize(); return Data.getCommonSize();
uint64_t Res; uint64_t Res;
if (!Layout.getSymbolOffset(&Data, Res)) if (!Layout.getSymbolOffset(Data.getSymbol(), Res))
return 0; return 0;
return Res; return Res;
@ -724,13 +724,13 @@ void WinCOFFObjectWriter::RecordRelocation(
CrossSection = &Symbol.getSection() != &B->getSection(); CrossSection = &Symbol.getSection() != &B->getSection();
// Offset of the symbol in the section // 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 // 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 // between the two symbols. Update FixedValue to account for the delta, and
// skip recording the relocation. // skip recording the relocation.
if (!CrossSection) { if (!CrossSection) {
int64_t OffsetOfA = Layout.getSymbolOffset(&A_SD); int64_t OffsetOfA = Layout.getSymbolOffset(A);
FixedValue = (OffsetOfA - OffsetOfB) + Target.getConstant(); FixedValue = (OffsetOfA - OffsetOfB) + Target.getConstant();
return; return;
} }

View File

@ -221,7 +221,7 @@ void AArch64MachObjectWriter::RecordRelocation(
// ... _foo@got - Ltmp0 // ... _foo@got - Ltmp0
if (Target.getSymA()->getKind() == MCSymbolRefExpr::VK_GOT && if (Target.getSymA()->getKind() == MCSymbolRefExpr::VK_GOT &&
Target.getSymB()->getKind() == MCSymbolRefExpr::VK_None && Target.getSymB()->getKind() == MCSymbolRefExpr::VK_None &&
Layout.getSymbolOffset(&B_SD) == Layout.getSymbolOffset(*B) ==
Layout.getFragmentOffset(Fragment) + Fixup.getOffset()) { Layout.getFragmentOffset(Fragment) + Fixup.getOffset()) {
// SymB is the PC, so use a PC-rel pointer-to-GOT relocation. // SymB is the PC, so use a PC-rel pointer-to-GOT relocation.
Type = MachO::ARM64_RELOC_POINTER_TO_GOT; Type = MachO::ARM64_RELOC_POINTER_TO_GOT;
@ -341,9 +341,9 @@ void AArch64MachObjectWriter::RecordRelocation(
RelSymbol = Base; RelSymbol = Base;
// Add the local offset, if needed. // Add the local offset, if needed.
if (&Base->getData() != &SD) if (Base != Symbol)
Value += Layout.getSymbolOffset(&SD) - Value +=
Layout.getSymbolOffset(&Base->getData()); Layout.getSymbolOffset(*Symbol) - Layout.getSymbolOffset(*Base);
} else if (Symbol->isInSection()) { } else if (Symbol->isInSection()) {
if (!CanUseLocalRelocation) if (!CanUseLocalRelocation)
Asm.getContext().reportFatalError( Asm.getContext().reportFatalError(

View File

@ -422,7 +422,7 @@ void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
// compensate for the addend of the symbol address, if it was // compensate for the addend of the symbol address, if it was
// undefined. This occurs with weak definitions, for example. // undefined. This occurs with weak definitions, for example.
if (!SD->getSymbol().isUndefined()) if (!SD->getSymbol().isUndefined())
FixedValue -= Layout.getSymbolOffset(SD); FixedValue -= Layout.getSymbolOffset(SD->getSymbol());
} else { } else {
// The index is the section ordinal (1-based). // The index is the section ordinal (1-based).
const MCSectionData &SymSD = Asm.getSectionData( const MCSectionData &SymSD = Asm.getSectionData(

View File

@ -360,7 +360,7 @@ void PPCMachObjectWriter::RecordPPCRelocation(
// compensate for the addend of the symbol address, if it was // compensate for the addend of the symbol address, if it was
// undefined. This occurs with weak definitions, for example. // undefined. This occurs with weak definitions, for example.
if (!SD->getSymbol().isUndefined()) if (!SD->getSymbol().isUndefined())
FixedValue -= Layout.getSymbolOffset(SD); FixedValue -= Layout.getSymbolOffset(SD->getSymbol());
} else { } else {
// The index is the section ordinal (1-based). // The index is the section ordinal (1-based).
const MCSectionData &SymSD = const MCSectionData &SymSD =

View File

@ -232,9 +232,9 @@ void X86MachObjectWriter::RecordX86_64Relocation(
// non-local symbol). // non-local symbol).
if (RelSymbol) { if (RelSymbol) {
// Add the local offset, if needed. // Add the local offset, if needed.
if (&RelSymbol->getData() != &SD) if (RelSymbol != Symbol)
Value += Layout.getSymbolOffset(&SD) - Value += Layout.getSymbolOffset(*Symbol) -
Layout.getSymbolOffset(&RelSymbol->getData()); Layout.getSymbolOffset(*RelSymbol);
} else if (Symbol->isInSection() && !Symbol->isVariable()) { } else if (Symbol->isInSection() && !Symbol->isVariable()) {
// The index is the section ordinal (1-based). // The index is the section ordinal (1-based).
Index = SD.getFragment()->getParent()->getOrdinal() + 1; 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 // compensate for the addend of the symbol address, if it was
// undefined. This occurs with weak definitions, for example. // undefined. This occurs with weak definitions, for example.
if (!SD->getSymbol().isUndefined()) if (!SD->getSymbol().isUndefined())
FixedValue -= Layout.getSymbolOffset(SD); FixedValue -= Layout.getSymbolOffset(SD->getSymbol());
} else { } else {
// The index is the section ordinal (1-based). // The index is the section ordinal (1-based).
const MCSectionData &SymSD = Asm.getSectionData( const MCSectionData &SymSD = Asm.getSectionData(