blob: 9b23d7d861690fc8d287fab91589983cf51b3aa1 [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
30std::error_code SymbolTable::addFile(std::unique_ptr<InputFile> File) {
31 if (auto EC = File->parse())
32 return EC;
33 InputFile *FileP = File.release();
34 if (auto *P = dyn_cast<ObjectFile>(FileP))
35 return addObject(P);
36 if (auto *P = dyn_cast<ArchiveFile>(FileP))
37 return addArchive(P);
Peter Collingbourne60c16162015-06-01 20:10:10 +000038 if (auto *P = dyn_cast<BitcodeFile>(FileP))
39 return addBitcode(P);
Rui Ueyama411c63602015-05-28 19:09:30 +000040 return addImport(cast<ImportFile>(FileP));
41}
42
Rui Ueyamaeeae5dd2015-06-08 06:00:10 +000043std::error_code SymbolTable::addDirectives(InputFile *File) {
44 StringRef S = File->getDirectives();
45 if (S.empty())
Peter Collingbourneace2f092015-06-06 02:00:45 +000046 return std::error_code();
47 std::vector<std::unique_ptr<InputFile>> Libs;
Rui Ueyamaeeae5dd2015-06-08 06:00:10 +000048 if (auto EC = Driver->parseDirectives(S, &Libs))
Peter Collingbourneace2f092015-06-06 02:00:45 +000049 return EC;
Rui Ueyamaeeae5dd2015-06-08 06:00:10 +000050 for (std::unique_ptr<InputFile> &Lib : Libs) {
51 if (Config->Verbose) {
52 llvm::outs() << "Reading " << Lib->getName()
53 << " for " << File->getName() << "\n";
54 }
Peter Collingbourneace2f092015-06-06 02:00:45 +000055 addFile(std::move(Lib));
Rui Ueyamaeeae5dd2015-06-08 06:00:10 +000056 }
Peter Collingbourneace2f092015-06-06 02:00:45 +000057 return std::error_code();
58}
59
Rui Ueyama411c63602015-05-28 19:09:30 +000060std::error_code SymbolTable::addObject(ObjectFile *File) {
61 ObjectFiles.emplace_back(File);
62 for (SymbolBody *Body : File->getSymbols())
63 if (Body->isExternal())
64 if (auto EC = resolve(Body))
65 return EC;
66
67 // If an object file contains .drectve section, read it and add
68 // files listed in the section.
Rui Ueyamaeeae5dd2015-06-08 06:00:10 +000069 return addDirectives(File);
Rui Ueyama411c63602015-05-28 19:09:30 +000070}
71
72std::error_code SymbolTable::addArchive(ArchiveFile *File) {
73 ArchiveFiles.emplace_back(File);
74 for (SymbolBody *Body : File->getSymbols())
75 if (auto EC = resolve(Body))
76 return EC;
77 return std::error_code();
78}
79
Peter Collingbourne60c16162015-06-01 20:10:10 +000080std::error_code SymbolTable::addBitcode(BitcodeFile *File) {
81 BitcodeFiles.emplace_back(File);
82 for (SymbolBody *Body : File->getSymbols())
83 if (Body->isExternal())
84 if (auto EC = resolve(Body))
85 return EC;
86
Peter Collingbourneace2f092015-06-06 02:00:45 +000087 // Add any linker directives from the module flags metadata.
Rui Ueyamaeeae5dd2015-06-08 06:00:10 +000088 return addDirectives(File);
Peter Collingbourne60c16162015-06-01 20:10:10 +000089}
90
Rui Ueyama411c63602015-05-28 19:09:30 +000091std::error_code SymbolTable::addImport(ImportFile *File) {
92 ImportFiles.emplace_back(File);
93 for (SymbolBody *Body : File->getSymbols())
94 if (auto EC = resolve(Body))
95 return EC;
96 return std::error_code();
97}
98
99bool SymbolTable::reportRemainingUndefines() {
100 bool Ret = false;
101 for (auto &I : Symtab) {
102 Symbol *Sym = I.second;
103 auto *Undef = dyn_cast<Undefined>(Sym->Body);
104 if (!Undef)
105 continue;
106 if (SymbolBody *Alias = Undef->getWeakAlias()) {
107 Sym->Body = Alias->getReplacement();
108 if (!isa<Defined>(Sym->Body)) {
109 // Aliases are yet another symbols pointed by other symbols
110 // that could also remain undefined.
111 llvm::errs() << "undefined symbol: " << Undef->getName() << "\n";
112 Ret = true;
113 }
114 continue;
115 }
116 llvm::errs() << "undefined symbol: " << Undef->getName() << "\n";
117 Ret = true;
118 }
119 return Ret;
120}
121
122// This function resolves conflicts if there's an existing symbol with
123// the same name. Decisions are made based on symbol type.
124std::error_code SymbolTable::resolve(SymbolBody *New) {
125 // Find an existing Symbol or create and insert a new one.
126 StringRef Name = New->getName();
127 Symbol *&Sym = Symtab[Name];
128 if (!Sym) {
129 Sym = new (Alloc) Symbol(New);
130 New->setBackref(Sym);
Rui Ueyama573bf7d2015-06-19 21:12:48 +0000131 ++Version;
Rui Ueyama411c63602015-05-28 19:09:30 +0000132 return std::error_code();
133 }
134 New->setBackref(Sym);
135
136 // compare() returns -1, 0, or 1 if the lhs symbol is less preferable,
137 // equivalent (conflicting), or more preferable, respectively.
138 SymbolBody *Existing = Sym->Body;
139 int comp = Existing->compare(New);
Rui Ueyama573bf7d2015-06-19 21:12:48 +0000140 if (comp < 0) {
Rui Ueyama411c63602015-05-28 19:09:30 +0000141 Sym->Body = New;
Rui Ueyama573bf7d2015-06-19 21:12:48 +0000142 ++Version;
143 }
Rui Ueyama8fd9fb92015-06-01 02:58:15 +0000144 if (comp == 0) {
145 llvm::errs() << "duplicate symbol: " << Name << "\n";
146 return make_error_code(LLDError::DuplicateSymbols);
147 }
Rui Ueyama411c63602015-05-28 19:09:30 +0000148
149 // If we have an Undefined symbol for a Lazy symbol, we need
150 // to read an archive member to replace the Lazy symbol with
151 // a Defined symbol.
152 if (isa<Undefined>(Existing) || isa<Undefined>(New))
153 if (auto *B = dyn_cast<Lazy>(Sym->Body))
154 return addMemberFile(B);
155 return std::error_code();
156}
157
158// Reads an archive member file pointed by a given symbol.
159std::error_code SymbolTable::addMemberFile(Lazy *Body) {
160 auto FileOrErr = Body->getMember();
161 if (auto EC = FileOrErr.getError())
162 return EC;
163 std::unique_ptr<InputFile> File = std::move(FileOrErr.get());
164
165 // getMember returns an empty buffer if the member was already
166 // read from the library.
167 if (!File)
168 return std::error_code();
169 if (Config->Verbose)
Rui Ueyama5b2588a2015-06-08 05:43:50 +0000170 llvm::outs() << "Loaded " << File->getShortName() << " for "
Rui Ueyama411c63602015-05-28 19:09:30 +0000171 << Body->getName() << "\n";
172 return addFile(std::move(File));
173}
174
175std::vector<Chunk *> SymbolTable::getChunks() {
176 std::vector<Chunk *> Res;
177 for (std::unique_ptr<ObjectFile> &File : ObjectFiles) {
178 std::vector<Chunk *> &V = File->getChunks();
179 Res.insert(Res.end(), V.begin(), V.end());
180 }
181 return Res;
182}
183
Rui Ueyama5cff6852015-05-31 03:34:08 +0000184Defined *SymbolTable::find(StringRef Name) {
Rui Ueyama411c63602015-05-28 19:09:30 +0000185 auto It = Symtab.find(Name);
186 if (It == Symtab.end())
187 return nullptr;
Rui Ueyama5cff6852015-05-31 03:34:08 +0000188 if (auto *Def = dyn_cast<Defined>(It->second->Body))
189 return Def;
190 return nullptr;
191}
192
Rui Ueyama23ed96d2015-06-18 17:29:50 +0000193std::error_code SymbolTable::resolveLazy(StringRef Name) {
Rui Ueyamaae369852015-06-18 00:40:33 +0000194 auto It = Symtab.find(Name);
195 if (It != Symtab.end())
196 if (auto *B = dyn_cast<Lazy>(It->second->Body))
197 return addMemberFile(B);
198 return std::error_code();
199}
200
Rui Ueyama80b56892015-05-31 16:10:50 +0000201// Windows specific -- Link default entry point name.
Rui Ueyama5cff6852015-05-31 03:34:08 +0000202ErrorOr<StringRef> SymbolTable::findDefaultEntry() {
Rui Ueyama97dff9e2015-06-17 00:16:33 +0000203 // If it's DLL, the rule is easy.
204 if (Config->DLL) {
205 StringRef Sym = "_DllMainCRTStartup";
206 if (auto EC = resolve(new (Alloc) Undefined(Sym)))
207 return EC;
208 return Sym;
209 }
210
Rui Ueyama80b56892015-05-31 16:10:50 +0000211 // User-defined main functions and their corresponding entry points.
Rui Ueyama5cff6852015-05-31 03:34:08 +0000212 static const char *Entries[][2] = {
Rui Ueyama5cff6852015-05-31 03:34:08 +0000213 {"main", "mainCRTStartup"},
214 {"wmain", "wmainCRTStartup"},
215 {"WinMain", "WinMainCRTStartup"},
216 {"wWinMain", "wWinMainCRTStartup"},
217 };
Rui Ueyama80b56892015-05-31 16:10:50 +0000218 for (auto E : Entries) {
Rui Ueyama23ed96d2015-06-18 17:29:50 +0000219 resolveLazy(E[1]);
Rui Ueyama80b56892015-05-31 16:10:50 +0000220 if (find(E[1]))
221 return StringRef(E[1]);
222 if (!find(E[0]))
Rui Ueyama5cff6852015-05-31 03:34:08 +0000223 continue;
Rui Ueyama07e661f2015-06-03 05:39:12 +0000224 if (auto EC = resolve(new (Alloc) Undefined(E[1])))
Rui Ueyama5cff6852015-05-31 03:34:08 +0000225 return EC;
Rui Ueyama80b56892015-05-31 16:10:50 +0000226 return StringRef(E[1]);
Rui Ueyama5cff6852015-05-31 03:34:08 +0000227 }
Rui Ueyama8fd9fb92015-06-01 02:58:15 +0000228 llvm::errs() << "entry point must be defined\n";
229 return make_error_code(LLDError::InvalidOption);
Rui Ueyama5cff6852015-05-31 03:34:08 +0000230}
231
Rui Ueyamae042fa9a2015-05-31 19:55:40 +0000232std::error_code SymbolTable::addUndefined(StringRef Name) {
Rui Ueyama07e661f2015-06-03 05:39:12 +0000233 return resolve(new (Alloc) Undefined(Name));
Rui Ueyamae042fa9a2015-05-31 19:55:40 +0000234}
235
Rui Ueyama360bace2015-05-31 22:31:31 +0000236// Resolve To, and make From an alias to To.
237std::error_code SymbolTable::rename(StringRef From, StringRef To) {
Rui Ueyama4d2834b2015-06-19 19:23:43 +0000238 // If From is not undefined, do nothing.
239 // Otherwise, rename it to see if To can be resolved instead.
240 auto It = Symtab.find(From);
241 if (It == Symtab.end())
242 return std::error_code();
243 Symbol *Sym = It->second;
244 if (!isa<Undefined>(Sym->Body))
245 return std::error_code();
Rui Ueyama360bace2015-05-31 22:31:31 +0000246 SymbolBody *Body = new (Alloc) Undefined(To);
247 if (auto EC = resolve(Body))
248 return EC;
Rui Ueyama4d2834b2015-06-19 19:23:43 +0000249 Sym->Body = Body->getReplacement();
250 Body->setBackref(Sym);
Rui Ueyama573bf7d2015-06-19 21:12:48 +0000251 ++Version;
Rui Ueyama360bace2015-05-31 22:31:31 +0000252 return std::error_code();
253}
254
Rui Ueyama411c63602015-05-28 19:09:30 +0000255void SymbolTable::dump() {
256 for (auto &P : Symtab) {
257 Symbol *Ref = P.second;
258 if (auto *Body = dyn_cast<Defined>(Ref->Body))
259 llvm::dbgs() << Twine::utohexstr(Config->ImageBase + Body->getRVA())
260 << " " << Body->getName() << "\n";
261 }
262}
263
Peter Collingbourne60c16162015-06-01 20:10:10 +0000264std::error_code SymbolTable::addCombinedLTOObject() {
265 if (BitcodeFiles.empty())
266 return std::error_code();
267
Peter Collingbourne60c16162015-06-01 20:10:10 +0000268 // Create an object file and add it to the symbol table by replacing any
269 // DefinedBitcode symbols with the definitions in the object file.
Rui Ueyamaefba7812015-06-09 17:52:17 +0000270 LTOCodeGenerator CG;
271 auto FileOrErr = createLTOObject(&CG);
272 if (auto EC = FileOrErr.getError())
Peter Collingbourne60c16162015-06-01 20:10:10 +0000273 return EC;
Rui Ueyamaefba7812015-06-09 17:52:17 +0000274 ObjectFile *Obj = FileOrErr.get();
275
Peter Collingbourne60c16162015-06-01 20:10:10 +0000276 for (SymbolBody *Body : Obj->getSymbols()) {
277 if (!Body->isExternal())
278 continue;
Peter Collingbourned9e4e982015-06-09 02:53:09 +0000279 // Find an existing Symbol. We should not see any new undefined symbols at
280 // this point.
Peter Collingbourne60c16162015-06-01 20:10:10 +0000281 StringRef Name = Body->getName();
Peter Collingbourned9e4e982015-06-09 02:53:09 +0000282 Symbol *&Sym = Symtab[Name];
Peter Collingbourne60c16162015-06-01 20:10:10 +0000283 if (!Sym) {
Peter Collingbourned9e4e982015-06-09 02:53:09 +0000284 if (!isa<Defined>(Body)) {
285 llvm::errs() << "LTO: undefined symbol: " << Name << '\n';
286 return make_error_code(LLDError::BrokenFile);
287 }
288 Sym = new (Alloc) Symbol(Body);
289 Body->setBackref(Sym);
290 continue;
Peter Collingbourne60c16162015-06-01 20:10:10 +0000291 }
292 Body->setBackref(Sym);
293
294 if (isa<DefinedBitcode>(Sym->Body)) {
295 // The symbol should now be defined.
296 if (!isa<Defined>(Body)) {
297 llvm::errs() << "LTO: undefined symbol: " << Name << '\n';
298 return make_error_code(LLDError::BrokenFile);
299 }
300 Sym->Body = Body;
Peter Collingbourne1b6fd1f2015-06-11 21:49:54 +0000301 } else {
302 int comp = Sym->Body->compare(Body);
303 if (comp < 0)
304 Sym->Body = Body;
305 if (comp == 0) {
306 llvm::errs() << "LTO: unexpected duplicate symbol: " << Name << "\n";
307 return make_error_code(LLDError::BrokenFile);
308 }
Peter Collingbourne60c16162015-06-01 20:10:10 +0000309 }
Peter Collingbourne73b75e32015-06-09 04:29:54 +0000310
311 // We may see new references to runtime library symbols such as __chkstk
312 // here. These symbols must be wholly defined in non-bitcode files.
313 if (auto *B = dyn_cast<Lazy>(Sym->Body)) {
314 size_t NumBitcodeFiles = BitcodeFiles.size();
315 if (auto EC = addMemberFile(B))
316 return EC;
317 if (BitcodeFiles.size() != NumBitcodeFiles) {
318 llvm::errs()
319 << "LTO: late loaded symbol created new bitcode reference: " << Name
320 << "\n";
321 return make_error_code(LLDError::BrokenFile);
322 }
323 }
Peter Collingbourne60c16162015-06-01 20:10:10 +0000324 }
325
Peter Collingbourne73b75e32015-06-09 04:29:54 +0000326 // New runtime library symbol references may have created undefined references.
327 if (reportRemainingUndefines())
328 return make_error_code(LLDError::BrokenFile);
Peter Collingbourne60c16162015-06-01 20:10:10 +0000329 return std::error_code();
330}
331
Rui Ueyamaefba7812015-06-09 17:52:17 +0000332// Combine and compile bitcode files and then return the result
333// as a regular COFF object file.
334ErrorOr<ObjectFile *> SymbolTable::createLTOObject(LTOCodeGenerator *CG) {
335 // All symbols referenced by non-bitcode objects must be preserved.
336 for (std::unique_ptr<ObjectFile> &File : ObjectFiles)
337 for (SymbolBody *Body : File->getSymbols())
338 if (auto *S = dyn_cast<DefinedBitcode>(Body->getReplacement()))
339 CG->addMustPreserveSymbol(S->getName());
340
Peter Collingbourne1b6fd1f2015-06-11 21:49:54 +0000341 // Likewise for bitcode symbols which we initially resolved to non-bitcode.
342 for (std::unique_ptr<BitcodeFile> &File : BitcodeFiles)
343 for (SymbolBody *Body : File->getSymbols())
344 if (isa<DefinedBitcode>(Body) &&
345 !isa<DefinedBitcode>(Body->getReplacement()))
346 CG->addMustPreserveSymbol(Body->getName());
347
Rui Ueyamaefba7812015-06-09 17:52:17 +0000348 // Likewise for other symbols that must be preserved.
349 for (StringRef Name : Config->GCRoots)
350 if (isa<DefinedBitcode>(Symtab[Name]->Body))
351 CG->addMustPreserveSymbol(Name);
352
353 CG->setModule(BitcodeFiles[0]->releaseModule());
354 for (unsigned I = 1, E = BitcodeFiles.size(); I != E; ++I)
355 CG->addModule(BitcodeFiles[I]->getModule());
356
357 std::string ErrMsg;
358 LTOMB = CG->compile(false, false, false, ErrMsg); // take MB ownership
359 if (!LTOMB) {
360 llvm::errs() << ErrMsg << '\n';
361 return make_error_code(LLDError::BrokenFile);
362 }
363 auto Obj = new ObjectFile(LTOMB->getMemBufferRef());
364 ObjectFiles.emplace_back(Obj);
365 if (auto EC = Obj->parse())
366 return EC;
367 return Obj;
368}
369
Rui Ueyama411c63602015-05-28 19:09:30 +0000370} // namespace coff
371} // namespace lld