Skip to content

Commit 8f089f2

Browse files
committed
[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.@tocbase . For this directive, suppressing .TOC. can be seen as a size optimization, but we choose to drop it for simplicity and consistency.
1 parent 3a7a224 commit 8f089f2

File tree

5 files changed

+37
-9
lines changed

5 files changed

+37
-9
lines changed

lld/test/ELF/ppc64-abs64-dyn.s

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212

1313
## FIXME the addend for offset 0x20000 should be TOC base+0x8000+1, not 0x80001.
1414
# CHECK: .rela.dyn {
15-
# CHECK-NEXT: 0x303B0 R_PPC64_RELATIVE - 0x8001
16-
# CHECK-NEXT: 0x303B8 R_PPC64_RELATIVE - 0x303B1
17-
# CHECK-NEXT: 0x303C0 R_PPC64_ADDR64 external 0x1
18-
# CHECK-NEXT: 0x303C8 R_PPC64_ADDR64 global 0x1
15+
# CHECK-NEXT: 0x303B8 R_PPC64_RELATIVE - 0x8001
16+
# CHECK-NEXT: 0x303C0 R_PPC64_RELATIVE - 0x303B9
17+
# CHECK-NEXT: 0x303C8 R_PPC64_ADDR64 external 0x1
18+
# CHECK-NEXT: 0x303D0 R_PPC64_ADDR64 global 0x1
1919
# CHECK-NEXT: }
2020

2121
.data

lld/test/ELF/ppc64-relocs.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ _start:
2626
ld 1, .L1@toc@l(2)
2727

2828
# CHECK-LABEL: Disassembly of section .R_PPC64_TOC16_LO_DS:
29-
# CHECK: ld 1, -32768(2)
29+
# CHECK: ld 1, -32760(2)
3030

3131
.section .R_PPC64_TOC16_LO,"ax",@progbits
3232
addi 1, 2, .L1@toc@l
3333

3434
# CHECK-LABEL: Disassembly of section .R_PPC64_TOC16_LO:
35-
# CHECK: addi 1, 2, -32768
35+
# CHECK: addi 1, 2, -32760
3636

3737
.section .R_PPC64_TOC16_HI,"ax",@progbits
3838
addis 1, 2, .L1@toc@h

llvm/lib/MC/ELFObjectWriter.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -615,9 +615,6 @@ bool ELFWriter::isInSymtab(const MCAsmLayout &Layout, const MCSymbolELF &Symbol,
615615
return false;
616616
}
617617

618-
if (Symbol.isUndefined() && !Symbol.isBindingSet())
619-
return false;
620-
621618
if (Symbol.isTemporary())
622619
return false;
623620

llvm/test/MC/ELF/undef.s

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
.text
1919
movsd .Lsym8(%rip), %xmm1
2020

21+
.hidden hidden
22+
2123
test2_a = undef
2224
test2_b = undef + 1
2325

@@ -41,6 +43,17 @@ test2_b = undef + 1
4143
// CHECK-NEXT: Section: .rodata.str1.1
4244
// CHECK-NEXT: }
4345
// CHECK-NEXT: Symbol {
46+
// CHECK-NEXT: Name: hidden
47+
// CHECK-NEXT: Value: 0x0
48+
// CHECK-NEXT: Size: 0
49+
// CHECK-NEXT: Binding: Global
50+
// CHECK-NEXT: Type: None
51+
// CHECK-NEXT: Other [
52+
// CHECK-NEXT: STV_HIDDEN
53+
// CHECK-NEXT: ]
54+
// CHECK-NEXT: Section: Undefined
55+
// CHECK-NEXT: }
56+
// CHECK-NEXT: Symbol {
4457
// CHECK-NEXT: Name: sym6
4558
// CHECK-NEXT: Value: 0x0
4659
// CHECK-NEXT: Size: 0
@@ -49,4 +62,13 @@ test2_b = undef + 1
4962
// CHECK-NEXT: Other: 0
5063
// CHECK-NEXT: Section: Undefined
5164
// CHECK-NEXT: }
65+
// CHECK-NEXT: Symbol {
66+
// CHECK-NEXT: Name: undef
67+
// CHECK-NEXT: Value: 0x0
68+
// CHECK-NEXT: Size: 0
69+
// CHECK-NEXT: Binding: Global
70+
// CHECK-NEXT: Type: None
71+
// CHECK-NEXT: Other: 0
72+
// CHECK-NEXT: Section: Undefined
73+
// CHECK-NEXT: }
5274
// CHECK-NEXT: ]

llvm/test/MC/ELF/weakref.s

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,15 @@ bar15:
125125
// CHECK-NEXT: Section: .text
126126
// CHECK-NEXT: }
127127
// CHECK-NEXT: Symbol {
128+
// CHECK-NEXT: Name: bar1
129+
// CHECK-NEXT: Value: 0x0
130+
// CHECK-NEXT: Size: 0
131+
// CHECK-NEXT: Binding: Global
132+
// CHECK-NEXT: Type: None
133+
// CHECK-NEXT: Other: 0
134+
// CHECK-NEXT: Section: Undefined
135+
// CHECK-NEXT: }
136+
// CHECK-NEXT: Symbol {
128137
// CHECK-NEXT: Name: bar10
129138
// CHECK-NEXT: Value: 0x28
130139
// CHECK-NEXT: Size: 0

0 commit comments

Comments
 (0)