[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>
Fri, 8 Nov 2019 22:47:48 +0000 (14:47 -0800)
Recommit r373168, which was reverted by r373242. This actually exposed a
boringssl bug which has been fixed for more than one month.

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.

lld/test/ELF/ppc64-abs64-dyn.s
lld/test/ELF/ppc64-relocs.s
llvm/lib/MC/ELFObjectWriter.cpp
llvm/test/MC/ELF/undef.s
llvm/test/MC/ELF/weakref.s

index 2497631..45d10b2 100644 (file)
 
 ## FIXME the addend for offset 0x20000 should be TOC base+0x8000+1, not 0x80001.
 # CHECK:      .rela.dyn {
-# CHECK-NEXT:   0x303B0 R_PPC64_RELATIVE - 0x8001
-# CHECK-NEXT:   0x303B8 R_PPC64_RELATIVE - 0x303B1
-# CHECK-NEXT:   0x303C0 R_PPC64_ADDR64 external 0x1
-# CHECK-NEXT:   0x303C8 R_PPC64_ADDR64 global 0x1
+# CHECK-NEXT:   0x303B8 R_PPC64_RELATIVE - 0x8001
+# CHECK-NEXT:   0x303C0 R_PPC64_RELATIVE - 0x303B9
+# CHECK-NEXT:   0x303C8 R_PPC64_ADDR64 external 0x1
+# CHECK-NEXT:   0x303D0 R_PPC64_ADDR64 global 0x1
 # CHECK-NEXT: }
 
 .data
index 0fe0edf..e3363b6 100644 (file)
@@ -26,13 +26,13 @@ _start:
   ld 1, .L1@toc@l(2)
 
 # CHECK-LABEL: Disassembly of section .R_PPC64_TOC16_LO_DS:
-# CHECK: ld 1, -32768(2)
+# CHECK: ld 1, -32760(2)
 
 .section .R_PPC64_TOC16_LO,"ax",@progbits
   addi  1, 2, .L1@toc@l
 
 # CHECK-LABEL: Disassembly of section .R_PPC64_TOC16_LO:
-# CHECK: addi 1, 2, -32768
+# CHECK: addi 1, 2, -32760
 
 .section .R_PPC64_TOC16_HI,"ax",@progbits
   addis 1, 2, .L1@toc@h
index 6f160e4..f8e9388 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 f313d71..9d99b83 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 51905d8..bca8ec4 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