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