Make AliasedSymbol able to handle MCTargetExpr. They can get here if

a weakref is used with a VariantKind.

llvm-svn: 118798
This commit is contained in:
Rafael Espindola 2010-11-11 17:24:43 +00:00
parent 3514fa6b11
commit f7b3bb84e8
2 changed files with 24 additions and 3 deletions

View File

@ -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;
}

View File

@ -0,0 +1,8 @@
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
.weakref bar,foo
call bar@PLT
// CHECK: # Symbol 0x00000005
// CHECK-NEXT: (('st_name', 0x00000001) # 'foo'
// CHECK-NEXT: ('st_bind', 0x00000002)