diff options
Diffstat (limited to 'lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index c4281a4f8a..d249c92dad 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -435,17 +435,22 @@ static uint64_t SymbolValue(MCSymbolData &Data, const MCAsmLayout &Layout) { return 0; } -void ELFObjectWriterImpl::WriteSymbol(MCDataFragment *F, ELFSymbolData &MSD, - const MCAsmLayout &Layout) { - MCSymbolData &OrigData = *MSD.SymbolData; - MCSymbolData *AliasData = NULL; - if (OrigData.Symbol->isVariable()) { - const MCExpr *Value = OrigData.getSymbol().getVariableValue(); +static const MCSymbol &AliasedSymbol(const MCSymbol &Symbol) { + const MCSymbol *S = &Symbol; + while (S->isVariable()) { + const MCExpr *Value = S->getVariableValue(); assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented"); const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value); - AliasData = &Layout.getAssembler().getSymbolData(Ref->getSymbol()); + S = &Ref->getSymbol(); } - MCSymbolData &Data = AliasData ? *AliasData : OrigData; + return *S; +} + +void ELFObjectWriterImpl::WriteSymbol(MCDataFragment *F, ELFSymbolData &MSD, + const MCAsmLayout &Layout) { + MCSymbolData &OrigData = *MSD.SymbolData; + MCSymbolData &Data = + Layout.getAssembler().getSymbolData(AliasedSymbol(OrigData.getSymbol())); uint8_t Binding = GetBinding(OrigData); uint8_t Visibility = GetVisibility(OrigData); @@ -592,7 +597,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind()); if (!Target.isAbsolute()) { - Symbol = &Target.getSymA()->getSymbol(); + Symbol = &AliasedSymbol(Target.getSymA()->getSymbol()); MCSymbolData &SD = Asm.getSymbolData(*Symbol); MCFragment *F = SD.getFragment(); @@ -802,10 +807,7 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { MSD.SectionIndex = ELF::SHN_ABS; Add = true; } else if (Symbol.isVariable()) { - const MCExpr *Value = Symbol.getVariableValue(); - assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented"); - const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value); - const MCSymbol &RefSymbol = Ref->getSymbol(); + const MCSymbol &RefSymbol = AliasedSymbol(Symbol); if (RefSymbol.isDefined()) { MSD.SectionIndex = SectionIndexMap.lookup(&RefSymbol.getSection()); assert(MSD.SectionIndex && "Invalid section index!"); |