1919#include " llvm/ADT/SmallVector.h"
2020#include " llvm/ADT/Triple.h"
2121#include " llvm/ADT/Twine.h"
22- #include " llvm/IR/LLVMContext.h"
23- #include " llvm/LTO/legacy/LTOModule.h"
22+ #include " llvm/Bitcode/BitcodeReader.h"
2423#include " llvm/Object/Binary.h"
2524#include " llvm/Object/COFF.h"
2625#include " llvm/Support/COFF.h"
@@ -45,7 +44,19 @@ using llvm::support::ulittle32_t;
4544namespace lld {
4645namespace coff {
4746
48- LLVMContext BitcodeFile::Context;
47+ // / Checks that Source is compatible with being a weak alias to Target.
48+ // / If Source is Undefined and has no weak alias set, makes it a weak
49+ // / alias to Target.
50+ static void checkAndSetWeakAlias (SymbolTable *Symtab, InputFile *F,
51+ SymbolBody *Source, SymbolBody *Target) {
52+ auto *U = dyn_cast<Undefined>(Source);
53+ if (!U)
54+ return ;
55+ else if (!U->WeakAlias )
56+ U->WeakAlias = Target;
57+ else if (U->WeakAlias != Target)
58+ Symtab->reportDuplicate (Source->symbol (), F);
59+ }
4960
5061ArchiveFile::ArchiveFile (MemoryBufferRef M) : InputFile(ArchiveKind, M) {}
5162
@@ -175,15 +186,9 @@ void ObjectFile::initializeSymbols() {
175186 I += Sym.getNumberOfAuxSymbols ();
176187 LastSectionNumber = Sym.getSectionNumber ();
177188 }
178- for (auto WeakAlias : WeakAliases) {
179- auto *U = dyn_cast<Undefined>(WeakAlias.first );
180- if (!U)
181- continue ;
182- // Report an error if two undefined symbols have different weak aliases.
183- if (U->WeakAlias && U->WeakAlias != SparseSymbolBodies[WeakAlias.second ])
184- Symtab->reportDuplicate (U->symbol (), this );
185- U->WeakAlias = SparseSymbolBodies[WeakAlias.second ];
186- }
189+ for (auto WeakAlias : WeakAliases)
190+ checkAndSetWeakAlias (Symtab, this , WeakAlias.first ,
191+ SparseSymbolBodies[WeakAlias.second ]);
187192}
188193
189194SymbolBody *ObjectFile::createUndefined (COFFSymbolRef Sym) {
@@ -198,7 +203,10 @@ SymbolBody *ObjectFile::createDefined(COFFSymbolRef Sym, const void *AuxP,
198203 if (Sym.isCommon ()) {
199204 auto *C = new (Alloc) CommonChunk (Sym);
200205 Chunks.push_back (C);
201- return Symtab->addCommon (this , Sym, C)->body ();
206+ COFFObj->getSymbolName (Sym, Name);
207+ Symbol *S =
208+ Symtab->addCommon (this , Name, Sym.getValue (), Sym.getGeneric (), C);
209+ return S->body ();
202210 }
203211 if (Sym.isAbsolute ()) {
204212 COFFObj->getSymbolName (Sym, Name);
@@ -245,10 +253,14 @@ SymbolBody *ObjectFile::createDefined(COFFSymbolRef Sym, const void *AuxP,
245253 }
246254
247255 DefinedRegular *B;
248- if (Sym.isExternal ())
249- B = cast<DefinedRegular>(Symtab->addRegular (this , Sym, SC)->body ());
250- else
251- B = new (Alloc) DefinedRegular (this , Sym, SC);
256+ if (Sym.isExternal ()) {
257+ COFFObj->getSymbolName (Sym, Name);
258+ Symbol *S =
259+ Symtab->addRegular (this , Name, SC->isCOMDAT (), Sym.getGeneric (), SC);
260+ B = cast<DefinedRegular>(S->body ());
261+ } else
262+ B = new (Alloc) DefinedRegular (this , /* Name*/ " " , SC->isCOMDAT (),
263+ /* IsExternal*/ false , Sym.getGeneric (), SC);
252264 if (SC->isCOMDAT () && Sym.getValue () == 0 && !AuxP)
253265 SC->setSymbol (B);
254266
@@ -327,39 +339,38 @@ void ImportFile::parse() {
327339}
328340
329341void BitcodeFile::parse () {
330- Context.enableDebugTypeODRUniquing ();
331- ErrorOr<std::unique_ptr<LTOModule>> ModOrErr = LTOModule::createFromBuffer (
332- Context, MB.getBufferStart (), MB.getBufferSize (), llvm::TargetOptions ());
333- M = check (std::move (ModOrErr), " could not create LTO module" );
334-
335- StringSaver Saver (Alloc);
336- for (unsigned I = 0 , E = M->getSymbolCount (); I != E; ++I) {
337- lto_symbol_attributes Attrs = M->getSymbolAttributes (I);
338- if ((Attrs & LTO_SYMBOL_SCOPE_MASK) == LTO_SYMBOL_SCOPE_INTERNAL)
339- continue ;
340-
341- StringRef SymName = Saver.save (M->getSymbolName (I));
342- int SymbolDef = Attrs & LTO_SYMBOL_DEFINITION_MASK;
343- if (SymbolDef == LTO_SYMBOL_DEFINITION_UNDEFINED) {
344- SymbolBodies.push_back (Symtab->addUndefined (SymName, this , false )->body ());
342+ Obj = check (lto::InputFile::create (
343+ MemoryBufferRef (MB.getBuffer (), Saver.save (MB.getBufferIdentifier ()))));
344+ for (const lto::InputFile::Symbol &ObjSym : Obj->symbols ()) {
345+ StringRef SymName = Saver.save (ObjSym.getName ());
346+ auto Flags = ObjSym.getFlags ();
347+ Symbol *Sym;
348+ if (Flags & object::BasicSymbolRef::SF_Undefined) {
349+ Sym = Symtab->addUndefined (SymName, this , false );
350+ } else if (Flags & object::BasicSymbolRef::SF_Common) {
351+ Sym = Symtab->addCommon (this , SymName, ObjSym.getCommonSize ());
352+ } else if ((Flags & object::BasicSymbolRef::SF_Weak) &&
353+ (Flags & object::BasicSymbolRef::SF_Indirect)) {
354+ // Weak external.
355+ Sym = Symtab->addUndefined (SymName, this , true );
356+ std::string Fallback = ObjSym.getCOFFWeakExternalFallback ();
357+ SymbolBody *Alias = Symtab->addUndefined (Saver.save (Fallback));
358+ checkAndSetWeakAlias (Symtab, this , Sym->body (), Alias);
345359 } else {
346- bool Replaceable =
347- (SymbolDef == LTO_SYMBOL_DEFINITION_TENTATIVE || // common
348- (Attrs & LTO_SYMBOL_COMDAT) || // comdat
349- (SymbolDef == LTO_SYMBOL_DEFINITION_WEAK && // weak external
350- (Attrs & LTO_SYMBOL_ALIAS)));
351- SymbolBodies.push_back (
352- Symtab->addBitcode (this , SymName, Replaceable)->body ());
360+ Expected<int > ComdatIndex = ObjSym.getComdatIndex ();
361+ bool IsCOMDAT = ComdatIndex && *ComdatIndex != -1 ;
362+ Sym = Symtab->addRegular (this , SymName, IsCOMDAT);
353363 }
364+ SymbolBodies.push_back (Sym->body ());
354365 }
355-
356- Directives = M->getLinkerOpts ();
366+ Directives = check (Obj->getLinkerOpts ());
357367}
358368
359369MachineTypes BitcodeFile::getMachineType () {
360- if (!M)
370+ Expected<std::string> ET = getBitcodeTargetTriple (MB);
371+ if (!ET)
361372 return IMAGE_FILE_MACHINE_UNKNOWN;
362- switch (Triple (M-> getTargetTriple () ).getArch ()) {
373+ switch (Triple (*ET ).getArch ()) {
363374 case Triple::x86_64:
364375 return AMD64;
365376 case Triple::x86:
0 commit comments