1 //===- 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"
12 #include "Error.h"
13 #include "SymbolTable.h"
14 #include "llvm/ADT/STLExtras.h"
15 #include "llvm/LTO/LTOCodeGenerator.h"
16 #include "llvm/Support/Debug.h"
17 #include "llvm/Support/raw_ostream.h"
18 
19 using namespace llvm;
20 
21 namespace lld {
22 namespace coff {
23 
24 SymbolTable::SymbolTable() {
25   resolve(new (Alloc) DefinedAbsolute("__ImageBase", Config->ImageBase));
26   if (!Config->EntryName.empty())
27     resolve(new (Alloc) Undefined(Config->EntryName));
28 }
29 
30 std::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);
38   if (auto *P = dyn_cast<BitcodeFile>(FileP))
39     return addBitcode(P);
40   return addImport(cast<ImportFile>(FileP));
41 }
42 
43 std::error_code SymbolTable::addDirectives(InputFile *File) {
44   StringRef S = File->getDirectives();
45   if (S.empty())
46     return std::error_code();
47   std::vector<std::unique_ptr<InputFile>> Libs;
48   if (auto EC = Driver->parseDirectives(S, &Libs))
49     return EC;
50   for (std::unique_ptr<InputFile> &Lib : Libs) {
51     if (Config->Verbose) {
52       llvm::outs() << "Reading " << Lib->getName()
53                    << " for " << File->getName() << "\n";
54     }
55     addFile(std::move(Lib));
56   }
57   return std::error_code();
58 }
59 
60 std::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.
69   return addDirectives(File);
70 }
71 
72 std::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 
80 std::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 
87   // Add any linker directives from the module flags metadata.
88   return addDirectives(File);
89 }
90 
91 std::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 
99 bool 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.
124 std::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);
131     return std::error_code();
132   }
133   New->setBackref(Sym);
134 
135   // compare() returns -1, 0, or 1 if the lhs symbol is less preferable,
136   // equivalent (conflicting), or more preferable, respectively.
137   SymbolBody *Existing = Sym->Body;
138   int comp = Existing->compare(New);
139   if (comp < 0)
140     Sym->Body = New;
141   if (comp == 0) {
142     llvm::errs() << "duplicate symbol: " << Name << "\n";
143     return make_error_code(LLDError::DuplicateSymbols);
144   }
145 
146   // If we have an Undefined symbol for a Lazy symbol, we need
147   // to read an archive member to replace the Lazy symbol with
148   // a Defined symbol.
149   if (isa<Undefined>(Existing) || isa<Undefined>(New))
150     if (auto *B = dyn_cast<Lazy>(Sym->Body))
151       return addMemberFile(B);
152   return std::error_code();
153 }
154 
155 // Reads an archive member file pointed by a given symbol.
156 std::error_code SymbolTable::addMemberFile(Lazy *Body) {
157   auto FileOrErr = Body->getMember();
158   if (auto EC = FileOrErr.getError())
159     return EC;
160   std::unique_ptr<InputFile> File = std::move(FileOrErr.get());
161 
162   // getMember returns an empty buffer if the member was already
163   // read from the library.
164   if (!File)
165     return std::error_code();
166   if (Config->Verbose)
167     llvm::outs() << "Loaded " << File->getShortName() << " for "
168                  << Body->getName() << "\n";
169   return addFile(std::move(File));
170 }
171 
172 std::vector<Chunk *> SymbolTable::getChunks() {
173   std::vector<Chunk *> Res;
174   for (std::unique_ptr<ObjectFile> &File : ObjectFiles) {
175     std::vector<Chunk *> &V = File->getChunks();
176     Res.insert(Res.end(), V.begin(), V.end());
177   }
178   return Res;
179 }
180 
181 Defined *SymbolTable::find(StringRef Name) {
182   auto It = Symtab.find(Name);
183   if (It == Symtab.end())
184     return nullptr;
185   if (auto *Def = dyn_cast<Defined>(It->second->Body))
186     return Def;
187   return nullptr;
188 }
189 
190 // Windows specific -- Link default entry point name.
191 ErrorOr<StringRef> SymbolTable::findDefaultEntry() {
192   // User-defined main functions and their corresponding entry points.
193   static const char *Entries[][2] = {
194       {"main", "mainCRTStartup"},
195       {"wmain", "wmainCRTStartup"},
196       {"WinMain", "WinMainCRTStartup"},
197       {"wWinMain", "wWinMainCRTStartup"},
198   };
199   for (auto E : Entries) {
200     if (find(E[1]))
201       return StringRef(E[1]);
202     if (!find(E[0]))
203       continue;
204     if (auto EC = resolve(new (Alloc) Undefined(E[1])))
205       return EC;
206     return StringRef(E[1]);
207   }
208   llvm::errs() << "entry point must be defined\n";
209   return make_error_code(LLDError::InvalidOption);
210 }
211 
212 std::error_code SymbolTable::addUndefined(StringRef Name) {
213   return resolve(new (Alloc) Undefined(Name));
214 }
215 
216 // Resolve To, and make From an alias to To.
217 std::error_code SymbolTable::rename(StringRef From, StringRef To) {
218   SymbolBody *Body = new (Alloc) Undefined(To);
219   if (auto EC = resolve(Body))
220     return EC;
221   Symtab[From]->Body = Body->getReplacement();
222   return std::error_code();
223 }
224 
225 void SymbolTable::dump() {
226   for (auto &P : Symtab) {
227     Symbol *Ref = P.second;
228     if (auto *Body = dyn_cast<Defined>(Ref->Body))
229       llvm::dbgs() << Twine::utohexstr(Config->ImageBase + Body->getRVA())
230                    << " " << Body->getName() << "\n";
231   }
232 }
233 
234 std::error_code SymbolTable::addCombinedLTOObject() {
235   if (BitcodeFiles.empty())
236     return std::error_code();
237 
238   // Create an object file and add it to the symbol table by replacing any
239   // DefinedBitcode symbols with the definitions in the object file.
240   LTOCodeGenerator CG;
241   auto FileOrErr = createLTOObject(&CG);
242   if (auto EC = FileOrErr.getError())
243     return EC;
244   ObjectFile *Obj = FileOrErr.get();
245 
246   for (SymbolBody *Body : Obj->getSymbols()) {
247     if (!Body->isExternal())
248       continue;
249     // Find an existing Symbol. We should not see any new undefined symbols at
250     // this point.
251     StringRef Name = Body->getName();
252     Symbol *&Sym = Symtab[Name];
253     if (!Sym) {
254       if (!isa<Defined>(Body)) {
255         llvm::errs() << "LTO: undefined symbol: " << Name << '\n';
256         return make_error_code(LLDError::BrokenFile);
257       }
258       Sym = new (Alloc) Symbol(Body);
259       Body->setBackref(Sym);
260       continue;
261     }
262     Body->setBackref(Sym);
263 
264     if (isa<DefinedBitcode>(Sym->Body)) {
265       // The symbol should now be defined.
266       if (!isa<Defined>(Body)) {
267         llvm::errs() << "LTO: undefined symbol: " << Name << '\n';
268         return make_error_code(LLDError::BrokenFile);
269       }
270       Sym->Body = Body;
271     } else {
272       int comp = Sym->Body->compare(Body);
273       if (comp < 0)
274         Sym->Body = Body;
275       if (comp == 0) {
276         llvm::errs() << "LTO: unexpected duplicate symbol: " << Name << "\n";
277         return make_error_code(LLDError::BrokenFile);
278       }
279     }
280 
281     // We may see new references to runtime library symbols such as __chkstk
282     // here. These symbols must be wholly defined in non-bitcode files.
283     if (auto *B = dyn_cast<Lazy>(Sym->Body)) {
284       size_t NumBitcodeFiles = BitcodeFiles.size();
285       if (auto EC = addMemberFile(B))
286         return EC;
287       if (BitcodeFiles.size() != NumBitcodeFiles) {
288         llvm::errs()
289             << "LTO: late loaded symbol created new bitcode reference: " << Name
290             << "\n";
291         return make_error_code(LLDError::BrokenFile);
292       }
293     }
294   }
295 
296   // New runtime library symbol references may have created undefined references.
297   if (reportRemainingUndefines())
298     return make_error_code(LLDError::BrokenFile);
299   return std::error_code();
300 }
301 
302 // Combine and compile bitcode files and then return the result
303 // as a regular COFF object file.
304 ErrorOr<ObjectFile *> SymbolTable::createLTOObject(LTOCodeGenerator *CG) {
305   // All symbols referenced by non-bitcode objects must be preserved.
306   for (std::unique_ptr<ObjectFile> &File : ObjectFiles)
307     for (SymbolBody *Body : File->getSymbols())
308       if (auto *S = dyn_cast<DefinedBitcode>(Body->getReplacement()))
309         CG->addMustPreserveSymbol(S->getName());
310 
311   // Likewise for bitcode symbols which we initially resolved to non-bitcode.
312   for (std::unique_ptr<BitcodeFile> &File : BitcodeFiles)
313     for (SymbolBody *Body : File->getSymbols())
314       if (isa<DefinedBitcode>(Body) &&
315           !isa<DefinedBitcode>(Body->getReplacement()))
316         CG->addMustPreserveSymbol(Body->getName());
317 
318   // Likewise for other symbols that must be preserved.
319   for (StringRef Name : Config->GCRoots)
320     if (isa<DefinedBitcode>(Symtab[Name]->Body))
321       CG->addMustPreserveSymbol(Name);
322 
323   CG->setModule(BitcodeFiles[0]->releaseModule());
324   for (unsigned I = 1, E = BitcodeFiles.size(); I != E; ++I)
325     CG->addModule(BitcodeFiles[I]->getModule());
326 
327   std::string ErrMsg;
328   LTOMB = CG->compile(false, false, false, ErrMsg); // take MB ownership
329   if (!LTOMB) {
330     llvm::errs() << ErrMsg << '\n';
331     return make_error_code(LLDError::BrokenFile);
332   }
333   auto Obj = new ObjectFile(LTOMB->getMemBufferRef());
334   ObjectFiles.emplace_back(Obj);
335   if (auto EC = Obj->parse())
336     return EC;
337   return Obj;
338 }
339 
340 } // namespace coff
341 } // namespace lld
342