summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2021-12-14 10:31:06 -0800
committerFangrui Song <i@maskray.me>2021-12-14 10:31:06 -0800
commit6a44013b0e319979ce6ea9ead2a740564e434f76 (patch)
treeae9df34bed224c134ec3a328d96f44f01ddbd7e7
parente0aa2ea661fbdd6443a0aa36803ca34152e32a52 (diff)
downloadllvm-6a44013b0e319979ce6ea9ead2a740564e434f76.tar.gz
[ELF] -Map: Print symbols which needs canonical PLT entry/copy relocation just once
If a copy related symbol (say `copy`) is referenced in two .o files, this change removes a duplicated line from the -Map output: ``` 202470 202470 1 1 .bss.rel.ro 202470 202470 1 1 <internal>:(.bss.rel.ro) 202470 202470 1 1 copy removed 202470 202470 1 1 copy ``` Differential Revision: https://reviews.llvm.org/D115697
-rw-r--r--lld/ELF/MapFile.cpp9
-rw-r--r--lld/test/ELF/map-file-copy.s52
2 files changed, 60 insertions, 1 deletions
diff --git a/lld/ELF/MapFile.cpp b/lld/ELF/MapFile.cpp
index cefe8a235b48..275983527538 100644
--- a/lld/ELF/MapFile.cpp
+++ b/lld/ELF/MapFile.cpp
@@ -72,10 +72,17 @@ static SymbolMapTy getSectionSyms(ArrayRef<Defined *> syms) {
// Sort symbols by address. We want to print out symbols in the
// order in the output file rather than the order they appeared
// in the input files.
- for (auto &it : ret)
+ SmallPtrSet<Defined *, 4> set;
+ for (auto &it : ret) {
+ // Deduplicate symbols which need a canonical PLT entry/copy relocation.
+ set.clear();
+ llvm::erase_if(it.second,
+ [&](Defined *sym) { return !set.insert(sym).second; });
+
llvm::stable_sort(it.second, [](Defined *a, Defined *b) {
return a->getVA() < b->getVA();
});
+ }
return ret;
}
diff --git a/lld/test/ELF/map-file-copy.s b/lld/test/ELF/map-file-copy.s
new file mode 100644
index 000000000000..58c0ce981048
--- /dev/null
+++ b/lld/test/ELF/map-file-copy.s
@@ -0,0 +1,52 @@
+# REQUIRES: x86
+
+# RUN: split-file %s %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/1.s -o %t/1.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/2.s -o %t/2.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/3.s -o %t/3.o
+# RUN: ld.lld -shared -soname=3 --version-script=%t/3.ver %t/3.o -o %t/3.so
+# RUN: ld.lld -Map=%t/1.map %t/1.o %t/2.o %t/3.so -o %t/1
+# RUN: FileCheck %s --input-file=%t/1.map
+
+## Both TUs reference func/copy which need a canonical PLT entry/copy relocation.
+## Test we print func/copy just once.
+# CHECK: {{ }}.plt
+# CHECK-NEXT: <internal>:(.plt)
+# CHECK-NEXT: func@v1{{$}}
+# CHECK-NEXT: .dynamic
+
+# CHECK: .bss.rel.ro
+# CHECK-NEXT: <internal>:(.bss.rel.ro)
+## Ideally this is displayed as copy@v2.
+# CHECK-NEXT: copy{{$}}
+# CHECK-NEXT: .got.plt
+
+#--- 1.s
+.global _start
+_start:
+.symver func, func@@@v1
+ mov $copy, %eax
+ mov $func - ., %eax
+
+#--- 2.s
+.symver func, func@@@v1
+ mov $copy, %eax
+ mov $func - ., %eax
+
+#--- 3.s
+.globl func
+.symver func, func@v1, remove
+.type func, @function
+func:
+ ret
+
+.section .rodata,"a"
+.globl copy
+.type copy, @object
+copy:
+.byte 1
+.size copy, 1
+
+#--- 3.ver
+v1 { func; };
+v2 { copy; };