diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-11-11 17:24:43 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-11-11 17:24:43 +0000 |
| commit | fb6540c112ca784daaf9eb28ef6507cfc41d95c1 (patch) | |
| tree | 4d7e2efc448651c4e26a0d814f198828628ec3d2 /llvm/lib | |
| parent | 1d6aa32b8790d89909044aa8c4620400caccc5d3 (diff) | |
| download | bcm5719-llvm-fb6540c112ca784daaf9eb28ef6507cfc41d95c1.tar.gz bcm5719-llvm-fb6540c112ca784daaf9eb28ef6507cfc41d95c1.zip | |
Make AliasedSymbol able to handle MCTargetExpr. They can get here if
a weakref is used with a VariantKind.
llvm-svn: 118798
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index f84164d253b..93ea77a0e1c 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -470,10 +470,23 @@ static const MCSymbol &AliasedSymbol(const MCSymbol &Symbol) { const MCSymbol *S = &Symbol; while (S->isVariable()) { const MCExpr *Value = S->getVariableValue(); - if (Value->getKind() != MCExpr::SymbolRef) + MCExpr::ExprKind Kind = Value->getKind(); + switch (Kind) { + case MCExpr::SymbolRef: { + const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value); + S = &Ref->getSymbol(); + break; + } + case MCExpr::Target: { + const MCTargetExpr *TExp = static_cast<const MCTargetExpr*>(Value); + MCValue Res; + TExp->EvaluateAsRelocatableImpl(Res, NULL); + S = &Res.getSymA()->getSymbol(); + break; + } + default: return *S; - const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value); - S = &Ref->getSymbol(); + } } return *S; } |

