Don't force symbols to be globals in .thumb_set.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 1 May 2014 12:45:43 +0000 (12:45 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 1 May 2014 12:45:43 +0000 (12:45 +0000)
We currently force symbols to be globals in .thumb_set. The intent
seems to be that given

.thumb_set foo, bar

we emit an undefined symbol to bar if it is never defined. The side
effect is that we mark bar as global, even if it is defined, which gas
does not.

Producing an undefined reference to bar is a general difference from MC and gas.
For example, given

a = b

gas will produce an undefined reference to b, MC will not. I would be surprised
if any code depends on this, but it it does, we should fix the general
difference, not special case .thumb_set.

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

lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
test/MC/ARM/thumb_set.s

index e55aa66713485070ff667ba9111414652e9a0734..3f5f42318ff00aff8779a89e86486b1049e4ed86 100644 (file)
@@ -1003,11 +1003,8 @@ ARMTargetELFStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) {
 
 void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
   if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Value)) {
-    // FIXME: Doing a lookup in here is a hack.
-    MCSymbol *Sym =
-        getStreamer().getContext().LookupSymbol(SRE->getSymbol().getName());
-    if (!Sym->isDefined()) {
-      getStreamer().EmitSymbolAttribute(Sym, MCSA_Global);
+    const MCSymbol &Sym = SRE->getSymbol();
+    if (!Sym.isDefined()) {
       getStreamer().EmitAssignment(Symbol, Value);
       return;
     }
index ac4bd32889586db643f37f64c19e32f649601a93..d2a0dc04730c1e6398c7cc6aa56b06fad361617d 100644 (file)
@@ -59,8 +59,6 @@ beta:
 
        .thumb_set beta, alpha
 
-       .thumb_set alias_undefined, undefined
-
 @ CHECK: Symbol {
 @ CHECK:   Name: alias_arm_func
 @ CHECK:   Value: 0x1
@@ -109,6 +107,16 @@ beta:
 @ CHECK:   Type: Function
 @ CHECK: }
 
+@ CHECK:      Symbol {
+@ CHECK:        Name: badblood
+@ CHECK-NEXT:   Value: 0x0
+@ CHECK-NEXT:   Size: 0
+@ CHECK-NEXT:   Binding: Local
+@ CHECK-NEXT:   Type: Object
+@ CHECK-NEXT:   Other: 0
+@ CHECK-NEXT:   Section: .data
+@ CHECK-NEXT: }
+
 @ CHECK: Symbol {
 @ CHECK:   Name: bedazzle
 @ CHECK:   Value: 0x4
@@ -144,16 +152,3 @@ beta:
 @ CHECK:   Value: 0x5
 @ CHECK:   Type: Function
 @ CHECK: }
-
-@ CHECK: Symbol {
-@ CHECK:   Name: badblood
-@ CHECK:   Value: 0x0
-@ CHECK:   Type: Object
-@ CHECK: }
-
-@ CHECK: Symbol {
-@ CHECK:   Name: undefined
-@ CHECK:   Value: 0x0
-@ CHECK:   Type: None
-@ CHECK: }
-