From de89b010b0b347cdbd1bc9553a970880a3e721bf Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 15 Oct 2010 18:25:33 +0000 Subject: [PATCH] Refactor alias handling to AliasedSymbol. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116600 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/ELFObjectWriter.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index c4281a4f8a2..d249c92dad5 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; } +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(Value); + S = &Ref->getSymbol(); + } + return *S; +} + 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(); - assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented"); - const MCSymbolRefExpr *Ref = static_cast(Value); - AliasData = &Layout.getAssembler().getSymbolData(Ref->getSymbol()); - } - MCSymbolData &Data = AliasData ? *AliasData : OrigData; + 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(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!");