Index: llvm/trunk/lib/MC/MCAssembler.cpp =================================================================== --- llvm/trunk/lib/MC/MCAssembler.cpp +++ llvm/trunk/lib/MC/MCAssembler.cpp @@ -114,10 +114,16 @@ 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(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: llvm/trunk/test/MC/ARM/elf-thumbfunc.s =================================================================== --- llvm/trunk/test/MC/ARM/elf-thumbfunc.s +++ llvm/trunk/test/MC/ARM/elf-thumbfunc.s @@ -14,6 +14,9 @@ .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 @@ -23,6 +26,13 @@ @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 @CHECK-NEXT: Size: 0