]> granicus.if.org Git - llvm/commitdiff
Fix aliases to thumbfunc-based exprs to be thumbfunc.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Thu, 19 Jan 2017 20:04:11 +0000 (20:04 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Thu, 19 Jan 2017 20:04:11 +0000 (20:04 +0000)
If F is a Thumb function symbol, and G = F + const, and G is a
function symbol, then G is Thumb. Because what else could it be?

Differential Revision: https://reviews.llvm.org/D28878

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

lib/MC/MCAssembler.cpp
test/MC/ARM/elf-thumbfunc.s

index 83fcec92e2b53238c22950567cf44f2f276ab57b..17a0edcc95450a4f5551aed5c5e00bb7db844995 100644 (file)
@@ -114,10 +114,16 @@ bool MCAssembler::isThumbFunc(const MCSymbol *Symbol) const {
   if (!Symbol->isVariable())
     return false;
 
-  // FIXME: It looks like gas supports some cases of the form "foo + 2". It
-  // is not clear if that is a bug or a feature.
   const MCExpr *Expr = Symbol->getVariableValue();
-  const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(Expr);
+
+  MCValue V;
+  if (!Expr->evaluateAsRelocatable(V, nullptr, nullptr))
+    return false;
+
+  if (V.getSymB() || V.getRefKind() != MCSymbolRefExpr::VK_None)
+    return false;
+
+  const MCSymbolRefExpr *Ref = V.getSymA();
   if (!Ref)
     return false;
 
index af061b50bc3d224511d23cdb7df844617d6a79e5..b6b0b03059c006cb9c30c914099e74af88af8319 100644 (file)
@@ -14,6 +14,9 @@ foo:
        .global bar
 bar = foo
 
+       .global baz
+baz = foo + 2
+
 @@ make sure foo and bar are thumb function: bit 0 = 1 (st_value)
 @CHECK:        Symbol {
 @CHECK:          Name: bar
@@ -22,6 +25,13 @@ bar = foo
 @CHECK-NEXT:     Binding: Global
 @CHECK-NEXT:     Type: Function
 
+@CHECK:        Symbol {
+@CHECK:          Name: baz
+@CHECK-NEXT:     Value: 0x3
+@CHECK-NEXT:     Size: 0
+@CHECK-NEXT:     Binding: Global
+@CHECK-NEXT:     Type: Function
+
 @CHECK:        Symbol {
 @CHECK:          Name: foo
 @CHECK-NEXT:     Value: 0x1