[llvm] 8f089f2 - [MC] Emit unused undefined symbol even if its binding is not set
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 8 14:47:57 PST 2019
Author: Fangrui Song
Date: 2019-11-08T14:47:48-08:00
New Revision: 8f089f2099d39021bbfb76a2cd575612382a7cf6
URL: https://github.com/llvm/llvm-project/commit/8f089f2099d39021bbfb76a2cd575612382a7cf6
DIFF: https://github.com/llvm/llvm-project/commit/8f089f2099d39021bbfb76a2cd575612382a7cf6.diff
LOG: [MC] Emit unused undefined symbol even if its binding is not set
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. at tocbase . For this
directive, suppressing .TOC. can be seen as a size optimization, but we
choose to drop it for simplicity and consistency.
Added:
Modified:
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
Removed:
################################################################################
diff --git a/lld/test/ELF/ppc64-abs64-dyn.s b/lld/test/ELF/ppc64-abs64-dyn.s
index 24976316c451..45d10b28004e 100644
--- a/lld/test/ELF/ppc64-abs64-dyn.s
+++ b/lld/test/ELF/ppc64-abs64-dyn.s
@@ -12,10 +12,10 @@
## 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
diff --git a/lld/test/ELF/ppc64-relocs.s b/lld/test/ELF/ppc64-relocs.s
index 0fe0edfc576c..e3363b60488f 100644
--- a/lld/test/ELF/ppc64-relocs.s
+++ b/lld/test/ELF/ppc64-relocs.s
@@ -26,13 +26,13 @@ _start:
ld 1, .L1 at 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", at progbits
addi 1, 2, .L1 at 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", at progbits
addis 1, 2, .L1 at toc@h
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index 6f160e491cea..f8e938893444 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -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;
diff --git a/llvm/test/MC/ELF/undef.s b/llvm/test/MC/ELF/undef.s
index f313d71369ef..9d99b834ffdf 100644
--- a/llvm/test/MC/ELF/undef.s
+++ b/llvm/test/MC/ELF/undef.s
@@ -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: ]
diff --git a/llvm/test/MC/ELF/weakref.s b/llvm/test/MC/ELF/weakref.s
index 51905d8ad7cc..bca8ec4f2816 100644
--- a/llvm/test/MC/ELF/weakref.s
+++ b/llvm/test/MC/ELF/weakref.s
@@ -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
More information about the llvm-commits
mailing list