]> granicus.if.org Git - llvm/commitdiff
[MC] Emit unused undefined symbol even if its binding is not set
authorFangrui Song <maskray@google.com>
Sun, 29 Sep 2019 15:26:12 +0000 (15:26 +0000)
committerFangrui Song <maskray@google.com>
Sun, 29 Sep 2019 15:26:12 +0000 (15:26 +0000)
For the following two cases, we currently suppress the symbols. This
patch emits them (compatible with GNU as).

* `test2_a = undef`: if `undef` is otherwise unused.
* `.hidden hidden`: if `hidden` is unused. This is the main point of the
  patch, because omitting the symbol would cause a linker semantic
  difference.

It causes a behavior change that is not compatible with GNU as:

.weakref foo1, bar1

When neither foo1 nor bar1 is used, we now emit bar1, which is arguably
more consistent.

Another change is that we will emit .TOC. for .TOC.@tocbase .  For this
directive, suppressing .TOC. can be seen as a size optimization, but we
choose to drop it for simplicity and consistency.

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

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/undef.s
test/MC/ELF/weakref.s

index 6f160e491cea565473cdf6204e0ec0a6e7fab7a5..f8e9388934449fe1ffb666a67b1e98547b3e413e 100644 (file)
@@ -615,9 +615,6 @@ bool ELFWriter::isInSymtab(const MCAsmLayout &Layout, const MCSymbolELF &Symbol,
     return false;
   }
 
-  if (Symbol.isUndefined() && !Symbol.isBindingSet())
-    return false;
-
   if (Symbol.isTemporary())
     return false;
 
index f313d71369ef73fef9280d868912dac97677cf87..9d99b834ffdf821c2d086b6186c357c4956e5ce4 100644 (file)
@@ -18,6 +18,8 @@
         .text
         movsd   .Lsym8(%rip), %xmm1
 
+.hidden hidden
+
 test2_a = undef
 test2_b = undef + 1
 
@@ -41,6 +43,17 @@ test2_b = undef + 1
 // CHECK-NEXT:     Section: .rodata.str1.1
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
+// CHECK-NEXT:     Name: hidden
+// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Size: 0
+// CHECK-NEXT:     Binding: Global
+// CHECK-NEXT:     Type: None
+// CHECK-NEXT:     Other [
+// CHECK-NEXT:       STV_HIDDEN
+// CHECK-NEXT:     ]
+// CHECK-NEXT:     Section: Undefined
+// CHECK-NEXT:   }
+// CHECK-NEXT:   Symbol {
 // CHECK-NEXT:     Name: sym6
 // CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
@@ -49,4 +62,13 @@ test2_b = undef + 1
 // CHECK-NEXT:     Other: 0
 // CHECK-NEXT:     Section: Undefined
 // CHECK-NEXT:   }
+// CHECK-NEXT:   Symbol {
+// CHECK-NEXT:     Name: undef
+// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Size: 0
+// CHECK-NEXT:     Binding: Global
+// CHECK-NEXT:     Type: None
+// CHECK-NEXT:     Other: 0
+// CHECK-NEXT:     Section: Undefined
+// CHECK-NEXT:   }
 // CHECK-NEXT: ]
index 51905d8ad7cc738befc6d398e2d8606fc1178920..bca8ec4f281696da42ebcf49eb36eece0d6bdc11 100644 (file)
@@ -125,6 +125,15 @@ bar15:
 // CHECK-NEXT:     Section: .text
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
+// CHECK-NEXT:     Name: bar1
+// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Size: 0
+// CHECK-NEXT:     Binding: Global
+// CHECK-NEXT:     Type: None
+// CHECK-NEXT:     Other: 0
+// CHECK-NEXT:     Section: Undefined
+// CHECK-NEXT:   }
+// CHECK-NEXT:   Symbol {
 // CHECK-NEXT:     Name: bar10
 // CHECK-NEXT:     Value: 0x28
 // CHECK-NEXT:     Size: 0