[lld] f84023a - [lld][macho] Stop grouping symbols by sections in mapfile.
Jez Ng via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 20 12:16:50 PST 2022
Author: Roger Kim
Date: 2022-01-20T12:16:37-08:00
New Revision: f84023a812b6499c506358912691b22a6424f897
URL: https://github.com/llvm/llvm-project/commit/f84023a812b6499c506358912691b22a6424f897
DIFF: https://github.com/llvm/llvm-project/commit/f84023a812b6499c506358912691b22a6424f897.diff
LOG: [lld][macho] Stop grouping symbols by sections in mapfile.
As per [Bug 50689](https://bugs.llvm.org/show_bug.cgi?id=50689),
```
2. getSectionSyms() puts all the symbols into a map of section -> symbols, but this seems unnecessary. This was likely copied from the ELF port, which prints a section header before the list of symbols it contains. But the Mach-O map file doesn't print these headers.
```
This diff removes `getSectionSyms()` and keeps all symbols in a flat vector.
What does ld64's mapfile look like?
```
$ llvm-mc -filetype=obj -triple=x86_64-apple-darwin test.s -o test.o
$ llvm-mc -filetype=obj -triple=x86_64-apple-darwin foo.s -o foo.o
$ ld -map map test.o foo.o -o out -L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem
```
```
[ 0] linker synthesized
[ 1] test.o
[ 2] foo.o
0x100003FB7 0x00000001 __TEXT __text
0x100003FB8 0x00000000 __TEXT obj
0x100003FB8 0x00000048 __TEXT __unwind_info
0x100004000 0x00000001 __DATA __common
0x100003FB7 0x00000001 [ 1] _main
0x100003FB8 0x00000000 [ 2] _foo
0x100003FB8 0x00000048 [ 0] compact unwind info
0x100004000 0x00000001 [ 1] _number
```
Perf numbers when linking chromium framework on a 16-Core Intel Xeon W Mac Pro:
```
base diff difference (95% CI)
sys_time 1.406 ± 0.020 1.388 ± 0.019 [ -1.9% .. -0.6%]
user_time 5.557 ± 0.023 5.914 ± 0.020 [ +6.2% .. +6.6%]
wall_time 4.455 ± 0.041 4.436 ± 0.035 [ -0.8% .. -0.0%]
samples 35 35
```
Reviewed By: #lld-macho, int3
Differential Revision: https://reviews.llvm.org/D114735
Added:
Modified:
lld/MachO/MapFile.cpp
lld/test/MachO/map-file.s
Removed:
################################################################################
diff --git a/lld/MachO/MapFile.cpp b/lld/MachO/MapFile.cpp
index 79471eecbd528..93abea2ed08b2 100644
--- a/lld/MachO/MapFile.cpp
+++ b/lld/MachO/MapFile.cpp
@@ -40,26 +40,6 @@ using namespace llvm::sys;
using namespace lld;
using namespace lld::macho;
-using SymbolMapTy = DenseMap<const InputSection *, SmallVector<Defined *, 4>>;
-
-// Returns a map from sections to their symbols.
-static SymbolMapTy getSectionSyms(ArrayRef<Defined *> syms) {
- SymbolMapTy ret;
- for (Defined *dr : syms)
- ret[dr->isec].push_back(dr);
-
- // Sort symbols by address. We want to print out symbols in the order they
- // appear in the output file rather than the order they appeared in the input
- // files.
- for (auto &it : ret)
- parallelSort(
- it.second.begin(), it.second.end(), [](Defined *a, Defined *b) {
- return a->getVA() != b->getVA() ? a->getVA() < b->getVA()
- : a->getName() < b->getName();
- });
- return ret;
-}
-
// Returns a list of all symbols that we want to print out.
static std::vector<Defined *> getSymbols() {
std::vector<Defined *> v;
@@ -126,7 +106,10 @@ void macho::writeMapFile() {
// Collect symbol info that we want to print out.
std::vector<Defined *> syms = getSymbols();
- SymbolMapTy sectionSyms = getSectionSyms(syms);
+ parallelSort(syms.begin(), syms.end(), [](Defined *a, Defined *b) {
+ return a->getVA() != b->getVA() ? a->getVA() < b->getVA()
+ : a->getName() < b->getName();
+ });
DenseMap<Symbol *, std::string> symStr = getSymbolStrings(syms);
// Dump table of sections
@@ -144,15 +127,9 @@ void macho::writeMapFile() {
// Dump table of symbols
os << "# Symbols:\n";
os << "# Address\t File Name\n";
- for (InputSection *isec : inputSections) {
- auto symsIt = sectionSyms.find(isec);
- assert(!shouldOmitFromOutput(isec) || (symsIt == sectionSyms.end()));
- if (symsIt == sectionSyms.end())
- continue;
- for (Symbol *sym : symsIt->second) {
- os << format("0x%08llX\t[%3u] %s\n", sym->getVA(),
- readerToFileOrdinal[sym->getFile()], symStr[sym].c_str());
- }
+ for (Symbol *sym : syms) {
+ os << format("0x%08llX\t[%3u] %s\n", sym->getVA(),
+ readerToFileOrdinal[sym->getFile()], symStr[sym].c_str());
}
// TODO: when we implement -dead_strip, we should dump dead stripped symbols
diff --git a/lld/test/MachO/map-file.s b/lld/test/MachO/map-file.s
index 67a44eb2dcd32..85c23e763e9ef 100644
--- a/lld/test/MachO/map-file.s
+++ b/lld/test/MachO/map-file.s
@@ -47,8 +47,8 @@ _main:
# CHECK-NEXT: # Symbols:
# CHECK-NEXT: # Address File Name
-# CHECK-NEXT: 0x[[#NUMBER]] [ 1] _number
# CHECK-NEXT: 0x[[#MAIN]] [ 1] _main
# CHECK-NEXT: 0x[[#FOO]] [ 2] _foo
+# CHECK-NEXT: 0x[[#NUMBER]] [ 1] _number
# MAPFILE: "name":"Total Write map file"
More information about the llvm-commits
mailing list