@@ -40,18 +40,32 @@ using namespace llvm::sys;
40
40
using namespace lld ;
41
41
using namespace lld ::macho;
42
42
43
- // Returns a list of all symbols that we want to print out.
44
- static std::vector<Defined *> getSymbols () {
45
- std::vector<Defined *> v;
43
+ using Symbols = std::vector<Defined *>;
44
+ // Returns a pair where the left element is a container of all live Symbols and
45
+ // the right element is a container of all dead symbols.
46
+ static std::pair<Symbols, Symbols> getSymbols () {
47
+ Symbols liveSymbols, deadSymbols;
46
48
for (InputFile *file : inputFiles)
47
49
if (isa<ObjFile>(file))
48
50
for (Symbol *sym : file->symbols )
49
51
if (auto *d = dyn_cast_or_null<Defined>(sym))
50
- if (d->isLive () && d->isec && d->getFile () == file) {
51
- assert (!shouldOmitFromOutput (d->isec ));
52
- v.push_back (d);
52
+ if (d->isec && d->getFile () == file) {
53
+ if (d->isLive ()) {
54
+ assert (!shouldOmitFromOutput (d->isec ));
55
+ liveSymbols.push_back (d);
56
+ } else {
57
+ deadSymbols.push_back (d);
58
+ }
53
59
}
54
- return v;
60
+ parallelSort (liveSymbols.begin (), liveSymbols.end (),
61
+ [](Defined *a, Defined *b) {
62
+ return a->getVA () != b->getVA () ? a->getVA () < b->getVA ()
63
+ : a->getName () < b->getName ();
64
+ });
65
+ parallelSort (
66
+ deadSymbols.begin (), deadSymbols.end (),
67
+ [](Defined *a, Defined *b) { return a->getName () < b->getName (); });
68
+ return {std::move (liveSymbols), std::move (deadSymbols)};
55
69
}
56
70
57
71
// Construct a map from symbols to their stringified representations.
@@ -104,14 +118,6 @@ void macho::writeMapFile() {
104
118
}
105
119
}
106
120
107
- // Collect symbol info that we want to print out.
108
- std::vector<Defined *> syms = getSymbols ();
109
- parallelSort (syms.begin (), syms.end (), [](Defined *a, Defined *b) {
110
- return a->getVA () != b->getVA () ? a->getVA () < b->getVA ()
111
- : a->getName () < b->getName ();
112
- });
113
- DenseMap<Symbol *, std::string> symStr = getSymbolStrings (syms);
114
-
115
121
// Dump table of sections
116
122
os << " # Sections:\n " ;
117
123
os << " # Address\t Size \t Segment\t Section\n " ;
@@ -125,12 +131,29 @@ void macho::writeMapFile() {
125
131
}
126
132
127
133
// Dump table of symbols
134
+ Symbols liveSymbols, deadSymbols;
135
+ std::tie (liveSymbols, deadSymbols) = getSymbols ();
136
+
137
+ DenseMap<Symbol *, std::string> liveSymbolStrings =
138
+ getSymbolStrings (liveSymbols);
128
139
os << " # Symbols:\n " ;
129
140
os << " # Address\t File Name\n " ;
130
- for (Symbol *sym : syms) {
141
+ for (Symbol *sym : liveSymbols) {
142
+ assert (sym->isLive ());
131
143
os << format (" 0x%08llX\t [%3u] %s\n " , sym->getVA (),
132
- readerToFileOrdinal[sym->getFile ()], symStr[sym].c_str ());
144
+ readerToFileOrdinal[sym->getFile ()],
145
+ liveSymbolStrings[sym].c_str ());
133
146
}
134
147
135
- // TODO: when we implement -dead_strip, we should dump dead stripped symbols
148
+ if (config->deadStrip ) {
149
+ DenseMap<Symbol *, std::string> deadSymbolStrings =
150
+ getSymbolStrings (deadSymbols);
151
+ os << " # Dead Stripped Symbols:\n " ;
152
+ os << " # Address\t File Name\n " ;
153
+ for (Symbol *sym : deadSymbols) {
154
+ assert (!sym->isLive ());
155
+ os << format (" <<dead>>\t [%3u] %s\n " , readerToFileOrdinal[sym->getFile ()],
156
+ deadSymbolStrings[sym].c_str ());
157
+ }
158
+ }
136
159
}
0 commit comments