blob: b823ce9eacb52c8b2d2050241248de35b96a5375 [file] [log] [blame]
Rui Ueyama411c63602015-05-28 19:09:30 +00001//===- SymbolTable.cpp ----------------------------------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Config.h"
11#include "Driver.h"
Rui Ueyama8fd9fb92015-06-01 02:58:15 +000012#include "Error.h"
Rui Ueyama411c63602015-05-28 19:09:30 +000013#include "SymbolTable.h"
Rui Ueyama411c63602015-05-28 19:09:30 +000014#include "llvm/ADT/STLExtras.h"
Peter Collingbourne60c16162015-06-01 20:10:10 +000015#include "llvm/LTO/LTOCodeGenerator.h"
Rui Ueyama411c63602015-05-28 19:09:30 +000016#include "llvm/Support/Debug.h"
17#include "llvm/Support/raw_ostream.h"
18
Rui Ueyamad68ff342015-05-31 03:57:30 +000019using namespace llvm;
20
Rui Ueyama411c63602015-05-28 19:09:30 +000021namespace lld {
22namespace coff {
23
24SymbolTable::SymbolTable() {
Rui Ueyama07e661f2015-06-03 05:39:12 +000025 resolve(new (Alloc) DefinedAbsolute("__ImageBase", Config->ImageBase));
Rui Ueyama5cff6852015-05-31 03:34:08 +000026 if (!Config->EntryName.empty())
Rui Ueyama07e661f2015-06-03 05:39:12 +000027 resolve(new (Alloc) Undefined(Config->EntryName));
Rui Ueyama411c63602015-05-28 19:09:30 +000028}
29
Rui Ueyama0d2e9992015-06-23 23:56:39 +000030void SymbolTable::addFile(std::unique_ptr<InputFile> File) {
31 Files.push_back(std::move(File));
Rui Ueyama411c63602015-05-28 19:09:30 +000032}
33
Rui Ueyama0d2e9992015-06-23 23:56:39 +000034std::error_code SymbolTable::run() {
35 while (FileIdx < Files.size()) {
36 InputFile *F = Files[FileIdx++].get();
37 if (Config->Verbose)
38 llvm::outs() << "Reading " << F->getShortName() << "\n";
39 if (auto EC = F->parse())
40 return EC;
41 if (auto *P = dyn_cast<ObjectFile>(F)) {
42 ObjectFiles.push_back(P);
43 } else if (auto *P = dyn_cast<ArchiveFile>(F)) {
44 ArchiveFiles.push_back(P);
45 } else if (auto *P = dyn_cast<BitcodeFile>(F)) {
46 BitcodeFiles.push_back(P);
47 } else {
48 ImportFiles.push_back(cast<ImportFile>(F));
Rui Ueyamaeeae5dd2015-06-08 06:00:10 +000049 }
Rui Ueyama0d2e9992015-06-23 23:56:39 +000050
51 for (SymbolBody *B : F->getSymbols())
52 if (B->isExternal())
53 if (auto EC = resolve(B))
54 return EC;
55
56 // If a object file contains .drectve section,
57 // read that and add files listed there.
58 StringRef S = F->getDirectives();
59 if (!S.empty())
60 if (auto EC = Driver->parseDirectives(S))
61 return EC;
Rui Ueyamaeeae5dd2015-06-08 06:00:10 +000062 }
Peter Collingbourneace2f092015-06-06 02:00:45 +000063 return std::error_code();
64}
65
Rui Ueyama411c63602015-05-28 19:09:30 +000066bool SymbolTable::reportRemainingUndefines() {
67 bool Ret = false;
68 for (auto &I : Symtab) {
69 Symbol *Sym = I.second;
70 auto *Undef = dyn_cast<Undefined>(Sym->Body);
71 if (!Undef)
72 continue;
Rui Ueyamad7666532015-06-25 02:21:44 +000073 StringRef Name = Undef->getName();
Rui Ueyamaf24e6f82015-06-28 20:34:09 +000074 // The weak alias may have been resovled, so check for that.
Rui Ueyama411c63602015-05-28 19:09:30 +000075 if (SymbolBody *Alias = Undef->getWeakAlias()) {
Rui Ueyamaf24e6f82015-06-28 20:34:09 +000076 if (auto *D = dyn_cast<Defined>(Alias->getReplacement())) {
77 Sym->Body = D;
78 continue;
Rui Ueyama411c63602015-05-28 19:09:30 +000079 }
Rui Ueyama411c63602015-05-28 19:09:30 +000080 }
Rui Ueyamad7666532015-06-25 02:21:44 +000081 // If we can resolve a symbol by removing __imp_ prefix, do that.
82 // This odd rule is for compatibility with MSVC linker.
83 if (Name.startswith("__imp_")) {
84 if (Defined *Imp = find(Name.substr(strlen("__imp_")))) {
Rui Ueyama88e0f922015-06-25 03:31:47 +000085 auto *S = new (Alloc) DefinedLocalImport(Name, Imp);
86 LocalImportChunks.push_back(S->getChunk());
87 Sym->Body = S;
Rui Ueyamad7666532015-06-25 02:21:44 +000088 continue;
89 }
90 }
91 llvm::errs() << "undefined symbol: " << Name << "\n";
Rui Ueyama95925fd2015-06-28 19:35:15 +000092 // Remaining undefined symbols are not fatal if /force is specified.
93 // They are replaced with dummy defined symbols.
94 if (Config->Force) {
95 Sym->Body = new (Alloc) DefinedAbsolute(Name, 0);
96 continue;
97 }
Rui Ueyama411c63602015-05-28 19:09:30 +000098 Ret = true;
99 }
100 return Ret;
101}
102
103// This function resolves conflicts if there's an existing symbol with
104// the same name. Decisions are made based on symbol type.
105std::error_code SymbolTable::resolve(SymbolBody *New) {
106 // Find an existing Symbol or create and insert a new one.
107 StringRef Name = New->getName();
108 Symbol *&Sym = Symtab[Name];
109 if (!Sym) {
110 Sym = new (Alloc) Symbol(New);
111 New->setBackref(Sym);
Rui Ueyama573bf7d2015-06-19 21:12:48 +0000112 ++Version;
Rui Ueyama411c63602015-05-28 19:09:30 +0000113 return std::error_code();
114 }
115 New->setBackref(Sym);
116
117 // compare() returns -1, 0, or 1 if the lhs symbol is less preferable,
118 // equivalent (conflicting), or more preferable, respectively.
119 SymbolBody *Existing = Sym->Body;
120 int comp = Existing->compare(New);
Rui Ueyama573bf7d2015-06-19 21:12:48 +0000121 if (comp < 0) {
Rui Ueyama411c63602015-05-28 19:09:30 +0000122 Sym->Body = New;
Rui Ueyama573bf7d2015-06-19 21:12:48 +0000123 ++Version;
124 }
Rui Ueyama8fd9fb92015-06-01 02:58:15 +0000125 if (comp == 0) {
Rui Ueyama68633f12015-06-25 23:22:00 +0000126 llvm::errs() << "duplicate symbol: " << Existing->getDebugName()
127 << " and " << New->getDebugName() << "\n";
Rui Ueyama8fd9fb92015-06-01 02:58:15 +0000128 return make_error_code(LLDError::DuplicateSymbols);
129 }
Rui Ueyama411c63602015-05-28 19:09:30 +0000130
131 // If we have an Undefined symbol for a Lazy symbol, we need
132 // to read an archive member to replace the Lazy symbol with
133 // a Defined symbol.
134 if (isa<Undefined>(Existing) || isa<Undefined>(New))
135 if (auto *B = dyn_cast<Lazy>(Sym->Body))
136 return addMemberFile(B);
137 return std::error_code();
138}
139
140// Reads an archive member file pointed by a given symbol.
141std::error_code SymbolTable::addMemberFile(Lazy *Body) {
142 auto FileOrErr = Body->getMember();
143 if (auto EC = FileOrErr.getError())
144 return EC;
145 std::unique_ptr<InputFile> File = std::move(FileOrErr.get());
146
147 // getMember returns an empty buffer if the member was already
148 // read from the library.
149 if (!File)
150 return std::error_code();
151 if (Config->Verbose)
Rui Ueyama5b2588a2015-06-08 05:43:50 +0000152 llvm::outs() << "Loaded " << File->getShortName() << " for "
Rui Ueyama411c63602015-05-28 19:09:30 +0000153 << Body->getName() << "\n";
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000154 addFile(std::move(File));
155 return std::error_code();
Rui Ueyama411c63602015-05-28 19:09:30 +0000156}
157
158std::vector<Chunk *> SymbolTable::getChunks() {
159 std::vector<Chunk *> Res;
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000160 for (ObjectFile *File : ObjectFiles) {
Rui Ueyama411c63602015-05-28 19:09:30 +0000161 std::vector<Chunk *> &V = File->getChunks();
162 Res.insert(Res.end(), V.begin(), V.end());
163 }
164 return Res;
165}
166
Rui Ueyama5cff6852015-05-31 03:34:08 +0000167Defined *SymbolTable::find(StringRef Name) {
Rui Ueyama411c63602015-05-28 19:09:30 +0000168 auto It = Symtab.find(Name);
169 if (It == Symtab.end())
170 return nullptr;
Rui Ueyama5cff6852015-05-31 03:34:08 +0000171 if (auto *Def = dyn_cast<Defined>(It->second->Body))
172 return Def;
173 return nullptr;
174}
175
Rui Ueyama23ed96d2015-06-18 17:29:50 +0000176std::error_code SymbolTable::resolveLazy(StringRef Name) {
Rui Ueyamaae369852015-06-18 00:40:33 +0000177 auto It = Symtab.find(Name);
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000178 if (It == Symtab.end())
179 return std::error_code();
180 if (auto *B = dyn_cast<Lazy>(It->second->Body)) {
181 if (auto EC = addMemberFile(B))
182 return EC;
183 return run();
184 }
Rui Ueyamaae369852015-06-18 00:40:33 +0000185 return std::error_code();
186}
187
Rui Ueyama80b56892015-05-31 16:10:50 +0000188// Windows specific -- Link default entry point name.
Rui Ueyama5cff6852015-05-31 03:34:08 +0000189ErrorOr<StringRef> SymbolTable::findDefaultEntry() {
Rui Ueyama80b56892015-05-31 16:10:50 +0000190 // User-defined main functions and their corresponding entry points.
Rui Ueyama5cff6852015-05-31 03:34:08 +0000191 static const char *Entries[][2] = {
Rui Ueyama5cff6852015-05-31 03:34:08 +0000192 {"main", "mainCRTStartup"},
193 {"wmain", "wmainCRTStartup"},
194 {"WinMain", "WinMainCRTStartup"},
195 {"wWinMain", "wWinMainCRTStartup"},
196 };
Rui Ueyama80b56892015-05-31 16:10:50 +0000197 for (auto E : Entries) {
Rui Ueyama23ed96d2015-06-18 17:29:50 +0000198 resolveLazy(E[1]);
Rui Ueyama80b56892015-05-31 16:10:50 +0000199 if (find(E[1]))
200 return StringRef(E[1]);
201 if (!find(E[0]))
Rui Ueyama5cff6852015-05-31 03:34:08 +0000202 continue;
Rui Ueyama07e661f2015-06-03 05:39:12 +0000203 if (auto EC = resolve(new (Alloc) Undefined(E[1])))
Rui Ueyama5cff6852015-05-31 03:34:08 +0000204 return EC;
Rui Ueyama80b56892015-05-31 16:10:50 +0000205 return StringRef(E[1]);
Rui Ueyama5cff6852015-05-31 03:34:08 +0000206 }
Rui Ueyama8fd9fb92015-06-01 02:58:15 +0000207 llvm::errs() << "entry point must be defined\n";
208 return make_error_code(LLDError::InvalidOption);
Rui Ueyama5cff6852015-05-31 03:34:08 +0000209}
210
Rui Ueyamae042fa9a2015-05-31 19:55:40 +0000211std::error_code SymbolTable::addUndefined(StringRef Name) {
Rui Ueyama07e661f2015-06-03 05:39:12 +0000212 return resolve(new (Alloc) Undefined(Name));
Rui Ueyamae042fa9a2015-05-31 19:55:40 +0000213}
214
Rui Ueyama360bace2015-05-31 22:31:31 +0000215// Resolve To, and make From an alias to To.
216std::error_code SymbolTable::rename(StringRef From, StringRef To) {
Rui Ueyama4d2834b2015-06-19 19:23:43 +0000217 // If From is not undefined, do nothing.
218 // Otherwise, rename it to see if To can be resolved instead.
219 auto It = Symtab.find(From);
220 if (It == Symtab.end())
221 return std::error_code();
222 Symbol *Sym = It->second;
223 if (!isa<Undefined>(Sym->Body))
224 return std::error_code();
Rui Ueyama360bace2015-05-31 22:31:31 +0000225 SymbolBody *Body = new (Alloc) Undefined(To);
226 if (auto EC = resolve(Body))
227 return EC;
Rui Ueyama4d2834b2015-06-19 19:23:43 +0000228 Sym->Body = Body->getReplacement();
229 Body->setBackref(Sym);
Rui Ueyama573bf7d2015-06-19 21:12:48 +0000230 ++Version;
Rui Ueyama360bace2015-05-31 22:31:31 +0000231 return std::error_code();
232}
233
Peter Collingbournebe549552015-06-26 18:58:24 +0000234void SymbolTable::printMap(llvm::raw_ostream &OS) {
235 for (ObjectFile *File : ObjectFiles) {
236 OS << File->getShortName() << ":\n";
237 for (SymbolBody *Body : File->getSymbols())
238 if (auto *R = dyn_cast<DefinedRegular>(Body))
239 if (R->isLive())
240 OS << Twine::utohexstr(Config->ImageBase + R->getRVA())
241 << " " << R->getName() << "\n";
242 }
243}
244
Peter Collingbourne60c16162015-06-01 20:10:10 +0000245std::error_code SymbolTable::addCombinedLTOObject() {
246 if (BitcodeFiles.empty())
247 return std::error_code();
248
Peter Collingbourne60c16162015-06-01 20:10:10 +0000249 // Create an object file and add it to the symbol table by replacing any
250 // DefinedBitcode symbols with the definitions in the object file.
Rui Ueyamaefba7812015-06-09 17:52:17 +0000251 LTOCodeGenerator CG;
252 auto FileOrErr = createLTOObject(&CG);
253 if (auto EC = FileOrErr.getError())
Peter Collingbourne60c16162015-06-01 20:10:10 +0000254 return EC;
Rui Ueyamaefba7812015-06-09 17:52:17 +0000255 ObjectFile *Obj = FileOrErr.get();
256
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000257 // Skip the combined object file as the file is processed below
258 // rather than by run().
259 ++FileIdx;
260
Peter Collingbourne60c16162015-06-01 20:10:10 +0000261 for (SymbolBody *Body : Obj->getSymbols()) {
262 if (!Body->isExternal())
263 continue;
Peter Collingbourned9e4e982015-06-09 02:53:09 +0000264 // Find an existing Symbol. We should not see any new undefined symbols at
265 // this point.
Peter Collingbourne60c16162015-06-01 20:10:10 +0000266 StringRef Name = Body->getName();
Peter Collingbourned9e4e982015-06-09 02:53:09 +0000267 Symbol *&Sym = Symtab[Name];
Peter Collingbourne60c16162015-06-01 20:10:10 +0000268 if (!Sym) {
Peter Collingbourned9e4e982015-06-09 02:53:09 +0000269 if (!isa<Defined>(Body)) {
270 llvm::errs() << "LTO: undefined symbol: " << Name << '\n';
271 return make_error_code(LLDError::BrokenFile);
272 }
273 Sym = new (Alloc) Symbol(Body);
274 Body->setBackref(Sym);
275 continue;
Peter Collingbourne60c16162015-06-01 20:10:10 +0000276 }
277 Body->setBackref(Sym);
278
279 if (isa<DefinedBitcode>(Sym->Body)) {
280 // The symbol should now be defined.
281 if (!isa<Defined>(Body)) {
282 llvm::errs() << "LTO: undefined symbol: " << Name << '\n';
283 return make_error_code(LLDError::BrokenFile);
284 }
285 Sym->Body = Body;
Peter Collingbourne1b6fd1f2015-06-11 21:49:54 +0000286 } else {
287 int comp = Sym->Body->compare(Body);
288 if (comp < 0)
289 Sym->Body = Body;
290 if (comp == 0) {
291 llvm::errs() << "LTO: unexpected duplicate symbol: " << Name << "\n";
292 return make_error_code(LLDError::BrokenFile);
293 }
Peter Collingbourne60c16162015-06-01 20:10:10 +0000294 }
Peter Collingbourne73b75e32015-06-09 04:29:54 +0000295
296 // We may see new references to runtime library symbols such as __chkstk
297 // here. These symbols must be wholly defined in non-bitcode files.
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000298 if (auto *B = dyn_cast<Lazy>(Sym->Body))
Peter Collingbourne2ed4c8f2015-06-24 00:12:34 +0000299 if (auto EC = addMemberFile(B))
300 return EC;
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000301 }
302
303 size_t NumBitcodeFiles = BitcodeFiles.size();
304 if (auto EC = run())
305 return EC;
306 if (BitcodeFiles.size() != NumBitcodeFiles) {
307 llvm::errs() << "LTO: late loaded symbol created new bitcode reference\n";
308 return make_error_code(LLDError::BrokenFile);
Peter Collingbourne60c16162015-06-01 20:10:10 +0000309 }
310
Peter Collingbourne73b75e32015-06-09 04:29:54 +0000311 // New runtime library symbol references may have created undefined references.
312 if (reportRemainingUndefines())
313 return make_error_code(LLDError::BrokenFile);
Peter Collingbourne60c16162015-06-01 20:10:10 +0000314 return std::error_code();
315}
316
Rui Ueyamaefba7812015-06-09 17:52:17 +0000317// Combine and compile bitcode files and then return the result
318// as a regular COFF object file.
319ErrorOr<ObjectFile *> SymbolTable::createLTOObject(LTOCodeGenerator *CG) {
320 // All symbols referenced by non-bitcode objects must be preserved.
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000321 for (ObjectFile *File : ObjectFiles)
Rui Ueyamaefba7812015-06-09 17:52:17 +0000322 for (SymbolBody *Body : File->getSymbols())
323 if (auto *S = dyn_cast<DefinedBitcode>(Body->getReplacement()))
324 CG->addMustPreserveSymbol(S->getName());
325
Peter Collingbourne1b6fd1f2015-06-11 21:49:54 +0000326 // Likewise for bitcode symbols which we initially resolved to non-bitcode.
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000327 for (BitcodeFile *File : BitcodeFiles)
Peter Collingbourne1b6fd1f2015-06-11 21:49:54 +0000328 for (SymbolBody *Body : File->getSymbols())
329 if (isa<DefinedBitcode>(Body) &&
330 !isa<DefinedBitcode>(Body->getReplacement()))
331 CG->addMustPreserveSymbol(Body->getName());
332
Rui Ueyamaefba7812015-06-09 17:52:17 +0000333 // Likewise for other symbols that must be preserved.
334 for (StringRef Name : Config->GCRoots)
335 if (isa<DefinedBitcode>(Symtab[Name]->Body))
336 CG->addMustPreserveSymbol(Name);
337
338 CG->setModule(BitcodeFiles[0]->releaseModule());
339 for (unsigned I = 1, E = BitcodeFiles.size(); I != E; ++I)
340 CG->addModule(BitcodeFiles[I]->getModule());
341
342 std::string ErrMsg;
343 LTOMB = CG->compile(false, false, false, ErrMsg); // take MB ownership
344 if (!LTOMB) {
345 llvm::errs() << ErrMsg << '\n';
346 return make_error_code(LLDError::BrokenFile);
347 }
Rui Ueyama0d2e9992015-06-23 23:56:39 +0000348 auto *Obj = new ObjectFile(LTOMB->getMemBufferRef());
349 Files.emplace_back(Obj);
350 ObjectFiles.push_back(Obj);
Rui Ueyamaefba7812015-06-09 17:52:17 +0000351 if (auto EC = Obj->parse())
352 return EC;
353 return Obj;
354}
355
Rui Ueyama411c63602015-05-28 19:09:30 +0000356} // namespace coff
357} // namespace lld