Make AliasedSymbol able to handle MCTargetExpr. They can get here if
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 11 Nov 2010 17:24:43 +0000 (17:24 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 11 Nov 2010 17:24:43 +0000 (17:24 +0000)
a weakref is used with a VariantKind.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118798 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/weakref-plt.s [new file with mode: 0644]

index f84164d253b3b4e759288aed4af7ba57b6864d56..93ea77a0e1c5dfc965f31d8d76547f3788c314d5 100644 (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;
 }
diff --git a/test/MC/ELF/weakref-plt.s b/test/MC/ELF/weakref-plt.s
new file mode 100644 (file)
index 0000000..26ba3f6
--- /dev/null
@@ -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)