forked from OSchip/llvm-project
[MC] Emit unused undefined symbol even if its binding is not set
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. llvm-svn: 373168
This commit is contained in:
parent
d30093bb8a
commit
c513360662
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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: ]
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue