summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-11-11 17:24:43 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-11-11 17:24:43 +0000
commitfb6540c112ca784daaf9eb28ef6507cfc41d95c1 (patch)
tree4d7e2efc448651c4e26a0d814f198828628ec3d2 /llvm/lib
parent1d6aa32b8790d89909044aa8c4620400caccc5d3 (diff)
downloadbcm5719-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.cpp19
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;
}
OpenPOWER on IntegriCloud