1411c6360SRui Ueyama //===- InputFiles.cpp -----------------------------------------------------===//
2411c6360SRui Ueyama //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6411c6360SRui Ueyama //
7411c6360SRui Ueyama //===----------------------------------------------------------------------===//
8411c6360SRui Ueyama 
99381eb10SRui Ueyama #include "InputFiles.h"
106f7483b1SAmy Huang #include "COFFLinkerContext.h"
11411c6360SRui Ueyama #include "Chunks.h"
121a299eabSEugene Zelenko #include "Config.h"
13bf55c4e3SAlexandre Ganea #include "DebugTypes.h"
14feee2103SPeter Collingbourne #include "Driver.h"
1579a5e6b1SPeter Collingbourne #include "SymbolTable.h"
1667fcd1a0SRui Ueyama #include "Symbols.h"
17adfad4d7SReid Kleckner #include "lld/Common/DWARF.h"
189381eb10SRui Ueyama #include "llvm-c/lto.h"
191a299eabSEugene Zelenko #include "llvm/ADT/SmallVector.h"
201a299eabSEugene Zelenko #include "llvm/ADT/Triple.h"
211a299eabSEugene Zelenko #include "llvm/ADT/Twine.h"
22264b5d9eSZachary Turner #include "llvm/BinaryFormat/COFF.h"
23d307c4c4SAlexandre Ganea #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
24d307c4c4SAlexandre Ganea #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
25d307c4c4SAlexandre Ganea #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
26bf55c4e3SAlexandre Ganea #include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
2754a335a2SReid Kleckner #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
2854a335a2SReid Kleckner #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
29f24c3352SReid Kleckner #include "llvm/LTO/LTO.h"
301a299eabSEugene Zelenko #include "llvm/Object/Binary.h"
31411c6360SRui Ueyama #include "llvm/Object/COFF.h"
321a299eabSEugene Zelenko #include "llvm/Support/Casting.h"
33411c6360SRui Ueyama #include "llvm/Support/Endian.h"
341a299eabSEugene Zelenko #include "llvm/Support/Error.h"
351a299eabSEugene Zelenko #include "llvm/Support/ErrorOr.h"
361a299eabSEugene Zelenko #include "llvm/Support/FileSystem.h"
37f6be4166SNico Weber #include "llvm/Support/Path.h"
381a299eabSEugene Zelenko #include "llvm/Target/TargetOptions.h"
391a299eabSEugene Zelenko #include <cstring>
401a299eabSEugene Zelenko #include <system_error>
411a299eabSEugene Zelenko #include <utility>
42411c6360SRui Ueyama 
431d99ab39SRui Ueyama using namespace llvm;
441c79ce9aSRui Ueyama using namespace llvm::COFF;
45d307c4c4SAlexandre Ganea using namespace llvm::codeview;
46411c6360SRui Ueyama using namespace llvm::object;
47411c6360SRui Ueyama using namespace llvm::support::endian;
488a310f40SReid Kleckner using namespace lld;
498a310f40SReid Kleckner using namespace lld::coff;
501a299eabSEugene Zelenko 
51ea533cdeSRui Ueyama using llvm::Triple;
52cd3f99b6SRui Ueyama using llvm::support::ulittle32_t;
53411c6360SRui Ueyama 
54d79c3be6SFangrui Song // Returns the last element of a path, which is supposed to be a filename.
getBasename(StringRef path)55d79c3be6SFangrui Song static StringRef getBasename(StringRef path) {
56d79c3be6SFangrui Song   return sys::path::filename(path, sys::path::Style::windows);
57d79c3be6SFangrui Song }
58d79c3be6SFangrui Song 
59d79c3be6SFangrui Song // Returns a string in the format of "foo.obj" or "foo.obj(bar.lib)".
toString(const coff::InputFile * file)608a310f40SReid Kleckner std::string lld::toString(const coff::InputFile *file) {
61d79c3be6SFangrui Song   if (!file)
62d79c3be6SFangrui Song     return "<internal>";
63d79c3be6SFangrui Song   if (file->parentName.empty() || file->kind() == coff::InputFile::ImportKind)
64adcd0268SBenjamin Kramer     return std::string(file->getName());
65d79c3be6SFangrui Song 
66d79c3be6SFangrui Song   return (getBasename(file->parentName) + "(" + getBasename(file->getName()) +
67d79c3be6SFangrui Song           ")")
68d79c3be6SFangrui Song       .str();
69d79c3be6SFangrui Song }
70d79c3be6SFangrui Song 
71cde5e5b6SBob Haarman /// Checks that Source is compatible with being a weak alias to Target.
72cde5e5b6SBob Haarman /// If Source is Undefined and has no weak alias set, makes it a weak
73cde5e5b6SBob Haarman /// alias to Target.
checkAndSetWeakAlias(SymbolTable * symtab,InputFile * f,Symbol * source,Symbol * target)74136d27abSRui Ueyama static void checkAndSetWeakAlias(SymbolTable *symtab, InputFile *f,
75136d27abSRui Ueyama                                  Symbol *source, Symbol *target) {
76136d27abSRui Ueyama   if (auto *u = dyn_cast<Undefined>(source)) {
77136d27abSRui Ueyama     if (u->weakAlias && u->weakAlias != target) {
7826572002SMartin Storsjo       // Weak aliases as produced by GCC are named in the form
7926572002SMartin Storsjo       // .weak.<weaksymbol>.<othersymbol>, where <othersymbol> is the name
8026572002SMartin Storsjo       // of another symbol emitted near the weak symbol.
8126572002SMartin Storsjo       // Just use the definition from the first object file that defined
8226572002SMartin Storsjo       // this weak symbol.
83136d27abSRui Ueyama       if (config->mingw)
8426572002SMartin Storsjo         return;
85136d27abSRui Ueyama       symtab->reportDuplicate(source, f);
8626572002SMartin Storsjo     }
87136d27abSRui Ueyama     u->weakAlias = target;
88d6489635SRui Ueyama   }
89cde5e5b6SBob Haarman }
90411c6360SRui Ueyama 
ignoredSymbolName(StringRef name)917dc5e7a0SBob Haarman static bool ignoredSymbolName(StringRef name) {
927dc5e7a0SBob Haarman   return name == "@feat.00" || name == "@comp.id";
937dc5e7a0SBob Haarman }
947dc5e7a0SBob Haarman 
ArchiveFile(COFFLinkerContext & ctx,MemoryBufferRef m)956f7483b1SAmy Huang ArchiveFile::ArchiveFile(COFFLinkerContext &ctx, MemoryBufferRef m)
966f7483b1SAmy Huang     : InputFile(ctx, ArchiveKind, m) {}
971d99ab39SRui Ueyama 
parse()98b835ae8eSRafael Espindola void ArchiveFile::parse() {
99d7c2f584SRui Ueyama   // Parse a MemoryBufferRef as an archive file.
100136d27abSRui Ueyama   file = CHECK(Archive::create(mb), this);
101411c6360SRui Ueyama 
10279a5e6b1SPeter Collingbourne   // Read the symbol table to construct Lazy objects.
103136d27abSRui Ueyama   for (const Archive::Symbol &sym : file->symbols())
1046f7483b1SAmy Huang     ctx.symtab.addLazyArchive(this, sym);
10535dfc95eSKevin Enderby }
106411c6360SRui Ueyama 
107411c6360SRui Ueyama // Returns a buffer pointing to a member file containing a given symbol.
addMember(const Archive::Symbol & sym)108cb2c5002SNico Weber void ArchiveFile::addMember(const Archive::Symbol &sym) {
1099c0716f1SNico Weber   const Archive::Child &c =
1109c0716f1SNico Weber       CHECK(sym.getMember(),
1119c0716f1SNico Weber             "could not get the member for symbol " + toCOFFString(sym));
112411c6360SRui Ueyama 
113411c6360SRui Ueyama   // Return an empty buffer if we have already returned the same buffer.
114136d27abSRui Ueyama   if (!seen.insert(c.getChildOffset()).second)
1156ee0b4e9SPeter Collingbourne     return;
116feee2103SPeter Collingbourne 
117cb2c5002SNico Weber   driver->enqueueArchiveMember(c, sym, getName());
11879a5e6b1SPeter Collingbourne }
1191d99ab39SRui Ueyama 
getArchiveMembers(Archive * file)1208a310f40SReid Kleckner std::vector<MemoryBufferRef> lld::coff::getArchiveMembers(Archive *file) {
121136d27abSRui Ueyama   std::vector<MemoryBufferRef> v;
122136d27abSRui Ueyama   Error err = Error::success();
123681b1be7SFangrui Song   for (const Archive::Child &c : file->children(err)) {
124136d27abSRui Ueyama     MemoryBufferRef mbref =
125136d27abSRui Ueyama         CHECK(c.getMemoryBufferRef(),
126136d27abSRui Ueyama               file->getFileName() +
127f59b709aSRui Ueyama                   ": could not get the buffer for a child of the archive");
128136d27abSRui Ueyama     v.push_back(mbref);
129f59b709aSRui Ueyama   }
130136d27abSRui Ueyama   if (err)
131136d27abSRui Ueyama     fatal(file->getFileName() +
132136d27abSRui Ueyama           ": Archive::children failed: " + toString(std::move(err)));
133136d27abSRui Ueyama   return v;
134f59b709aSRui Ueyama }
135f59b709aSRui Ueyama 
parseLazy()136d496abbeSFangrui Song void ObjFile::parseLazy() {
1377dc5e7a0SBob Haarman   // Native object file.
1387dc5e7a0SBob Haarman   std::unique_ptr<Binary> coffObjPtr = CHECK(createBinary(mb), this);
1397dc5e7a0SBob Haarman   COFFObjectFile *coffObj = cast<COFFObjectFile>(coffObjPtr.get());
1407dc5e7a0SBob Haarman   uint32_t numSymbols = coffObj->getNumberOfSymbols();
1417dc5e7a0SBob Haarman   for (uint32_t i = 0; i < numSymbols; ++i) {
1427dc5e7a0SBob Haarman     COFFSymbolRef coffSym = check(coffObj->getSymbol(i));
1437dc5e7a0SBob Haarman     if (coffSym.isUndefined() || !coffSym.isExternal() ||
1447dc5e7a0SBob Haarman         coffSym.isWeakExternal())
1457dc5e7a0SBob Haarman       continue;
14677ecf90cSReid Kleckner     StringRef name = check(coffObj->getSymbolName(coffSym));
1477dc5e7a0SBob Haarman     if (coffSym.isAbsolute() && ignoredSymbolName(name))
1487dc5e7a0SBob Haarman       continue;
1496f7483b1SAmy Huang     ctx.symtab.addLazyObject(this, name);
1507dc5e7a0SBob Haarman     i += coffSym.getNumberOfAuxSymbols();
1517dc5e7a0SBob Haarman   }
1527dc5e7a0SBob Haarman }
1537dc5e7a0SBob Haarman 
parse()154e1b48e09SRui Ueyama void ObjFile::parse() {
155411c6360SRui Ueyama   // Parse a memory buffer as a COFF file.
156136d27abSRui Ueyama   std::unique_ptr<Binary> bin = CHECK(createBinary(mb), this);
157aa4f4450SRui Ueyama 
158136d27abSRui Ueyama   if (auto *obj = dyn_cast<COFFObjectFile>(bin.get())) {
159136d27abSRui Ueyama     bin.release();
160136d27abSRui Ueyama     coffObj.reset(obj);
161aa4f4450SRui Ueyama   } else {
162aa4f4450SRui Ueyama     fatal(toString(this) + " is not a COFF file");
163aa4f4450SRui Ueyama   }
164411c6360SRui Ueyama 
165411c6360SRui Ueyama   // Read section and symbol tables.
166b835ae8eSRafael Espindola   initializeChunks();
167b835ae8eSRafael Espindola   initializeSymbols();
168d307c4c4SAlexandre Ganea   initializeFlags();
169bf55c4e3SAlexandre Ganea   initializeDependencies();
170411c6360SRui Ueyama }
171411c6360SRui Ueyama 
getSection(uint32_t i)172136d27abSRui Ueyama const coff_section *ObjFile::getSection(uint32_t i) {
17377ecf90cSReid Kleckner   auto sec = coffObj->getSection(i);
17477ecf90cSReid Kleckner   if (!sec)
17577ecf90cSReid Kleckner     fatal("getSection failed: #" + Twine(i) + ": " + toString(sec.takeError()));
17677ecf90cSReid Kleckner   return *sec;
17748dc110eSNico Weber }
17848dc110eSNico Weber 
1791621c20fSPeter Collingbourne // We set SectionChunk pointers in the SparseChunks vector to this value
1801621c20fSPeter Collingbourne // temporarily to mark comdat sections as having an unknown resolution. As we
1811621c20fSPeter Collingbourne // walk the object file's symbol table, once we visit either a leader symbol or
1821621c20fSPeter Collingbourne // an associative section definition together with the parent comdat's leader,
1831621c20fSPeter Collingbourne // we set the pointer to either nullptr (to mark the section as discarded) or a
1841621c20fSPeter Collingbourne // valid SectionChunk for that section.
185136d27abSRui Ueyama static SectionChunk *const pendingComdat = reinterpret_cast<SectionChunk *>(1);
1861621c20fSPeter Collingbourne 
initializeChunks()187e1b48e09SRui Ueyama void ObjFile::initializeChunks() {
188136d27abSRui Ueyama   uint32_t numSections = coffObj->getNumberOfSections();
189136d27abSRui Ueyama   sparseChunks.resize(numSections + 1);
190136d27abSRui Ueyama   for (uint32_t i = 1; i < numSections + 1; ++i) {
191136d27abSRui Ueyama     const coff_section *sec = getSection(i);
192136d27abSRui Ueyama     if (sec->Characteristics & IMAGE_SCN_LNK_COMDAT)
193136d27abSRui Ueyama       sparseChunks[i] = pendingComdat;
1941621c20fSPeter Collingbourne     else
195136d27abSRui Ueyama       sparseChunks[i] = readSection(i, nullptr, "");
1961621c20fSPeter Collingbourne   }
1971621c20fSPeter Collingbourne }
1981621c20fSPeter Collingbourne 
readSection(uint32_t sectionNumber,const coff_aux_section_definition * def,StringRef leaderName)199136d27abSRui Ueyama SectionChunk *ObjFile::readSection(uint32_t sectionNumber,
200136d27abSRui Ueyama                                    const coff_aux_section_definition *def,
201136d27abSRui Ueyama                                    StringRef leaderName) {
202136d27abSRui Ueyama   const coff_section *sec = getSection(sectionNumber);
2031f3ab98aSNico Weber 
204136d27abSRui Ueyama   StringRef name;
205136d27abSRui Ueyama   if (Expected<StringRef> e = coffObj->getSectionName(sec))
206136d27abSRui Ueyama     name = *e;
2078be28cdcSFangrui Song   else
208136d27abSRui Ueyama     fatal("getSectionName failed: #" + Twine(sectionNumber) + ": " +
209136d27abSRui Ueyama           toString(e.takeError()));
210af2f7da7SReid Kleckner 
211136d27abSRui Ueyama   if (name == ".drectve") {
212136d27abSRui Ueyama     ArrayRef<uint8_t> data;
213136d27abSRui Ueyama     cantFail(coffObj->getSectionContents(sec, data));
214136d27abSRui Ueyama     directives = StringRef((const char *)data.data(), data.size());
2151621c20fSPeter Collingbourne     return nullptr;
216411c6360SRui Ueyama   }
217be939b3fSRui Ueyama 
218136d27abSRui Ueyama   if (name == ".llvm_addrsig") {
219136d27abSRui Ueyama     addrsigSec = sec;
220ab038025SPeter Collingbourne     return nullptr;
221ab038025SPeter Collingbourne   }
222ab038025SPeter Collingbourne 
223763671f3SZequan Wu   if (name == ".llvm.call-graph-profile") {
224763671f3SZequan Wu     callgraphSec = sec;
225763671f3SZequan Wu     return nullptr;
226763671f3SZequan Wu   }
227763671f3SZequan Wu 
228be939b3fSRui Ueyama   // Object files may have DWARF debug info or MS CodeView debug info
229be939b3fSRui Ueyama   // (or both).
230be939b3fSRui Ueyama   //
231be939b3fSRui Ueyama   // DWARF sections don't need any special handling from the perspective
232be939b3fSRui Ueyama   // of the linker; they are just a data section containing relocations.
233be939b3fSRui Ueyama   // We can just link them to complete debug info.
234be939b3fSRui Ueyama   //
2351f3ab98aSNico Weber   // CodeView needs linker support. We need to interpret debug info,
2361f3ab98aSNico Weber   // and then write it to a separate .pdb file.
237be939b3fSRui Ueyama 
2383108802fSPeter Collingbourne   // Ignore DWARF debug info unless /debug is given.
239136d27abSRui Ueyama   if (!config->debug && name.startswith(".debug_"))
2401621c20fSPeter Collingbourne     return nullptr;
241be939b3fSRui Ueyama 
242136d27abSRui Ueyama   if (sec->Characteristics & llvm::COFF::IMAGE_SCN_LNK_REMOVE)
2431621c20fSPeter Collingbourne     return nullptr;
244136d27abSRui Ueyama   auto *c = make<SectionChunk>(this, sec);
245136d27abSRui Ueyama   if (def)
246136d27abSRui Ueyama     c->checksum = def->CheckSum;
247f5bb738fSReid Kleckner 
248f5bb738fSReid Kleckner   // CodeView sections are stored to a different vector because they are not
249f5bb738fSReid Kleckner   // linked in the regular manner.
250136d27abSRui Ueyama   if (c->isCodeView())
251136d27abSRui Ueyama     debugChunks.push_back(c);
252136d27abSRui Ueyama   else if (name == ".gfids$y")
253136d27abSRui Ueyama     guardFidChunks.push_back(c);
2540139c8afSAndrew Paverd   else if (name == ".giats$y")
2550139c8afSAndrew Paverd     guardIATChunks.push_back(c);
256136d27abSRui Ueyama   else if (name == ".gljmp$y")
257136d27abSRui Ueyama     guardLJmpChunks.push_back(c);
258184377daSPengfei Wang   else if (name == ".gehcont$y")
259184377daSPengfei Wang     guardEHContChunks.push_back(c);
260136d27abSRui Ueyama   else if (name == ".sxdata")
2613774bcf9SReid Kleckner     sxDataChunks.push_back(c);
262136d27abSRui Ueyama   else if (config->tailMerge && sec->NumberOfRelocations == 0 &&
263136d27abSRui Ueyama            name == ".rdata" && leaderName.startswith("??_C@"))
264f1a11f87SPeter Collingbourne     // COFF sections that look like string literal sections (i.e. no
265f1a11f87SPeter Collingbourne     // relocations, in .rdata, leader symbol name matches the MSVC name mangling
266f1a11f87SPeter Collingbourne     // for string literals) are subject to string tail merging.
2676f7483b1SAmy Huang     MergeChunk::addSection(ctx, c);
2683d3a9b3bSMartin Storsjo   else if (name == ".rsrc" || name.startswith(".rsrc$"))
2693d3a9b3bSMartin Storsjo     resourceChunks.push_back(c);
270f5bb738fSReid Kleckner   else
271136d27abSRui Ueyama     chunks.push_back(c);
272f5bb738fSReid Kleckner 
273136d27abSRui Ueyama   return c;
274411c6360SRui Ueyama }
2751621c20fSPeter Collingbourne 
includeResourceChunks()2763d3a9b3bSMartin Storsjo void ObjFile::includeResourceChunks() {
2773d3a9b3bSMartin Storsjo   chunks.insert(chunks.end(), resourceChunks.begin(), resourceChunks.end());
2783d3a9b3bSMartin Storsjo }
2793d3a9b3bSMartin Storsjo 
readAssociativeDefinition(COFFSymbolRef sym,const coff_aux_section_definition * def)2801621c20fSPeter Collingbourne void ObjFile::readAssociativeDefinition(
281136d27abSRui Ueyama     COFFSymbolRef sym, const coff_aux_section_definition *def) {
282136d27abSRui Ueyama   readAssociativeDefinition(sym, def, def->getNumber(sym.isBigObj()));
28321858a9bSMartin Storsjo }
28421858a9bSMartin Storsjo 
readAssociativeDefinition(COFFSymbolRef sym,const coff_aux_section_definition * def,uint32_t parentIndex)285136d27abSRui Ueyama void ObjFile::readAssociativeDefinition(COFFSymbolRef sym,
286136d27abSRui Ueyama                                         const coff_aux_section_definition *def,
287136d27abSRui Ueyama                                         uint32_t parentIndex) {
288136d27abSRui Ueyama   SectionChunk *parent = sparseChunks[parentIndex];
289136d27abSRui Ueyama   int32_t sectionNumber = sym.getSectionNumber();
2901621c20fSPeter Collingbourne 
291136d27abSRui Ueyama   auto diag = [&]() {
29277ecf90cSReid Kleckner     StringRef name = check(coffObj->getSymbolName(sym));
2930fb18e6eSNico Weber 
29477ecf90cSReid Kleckner     StringRef parentName;
295136d27abSRui Ueyama     const coff_section *parentSec = getSection(parentIndex);
296136d27abSRui Ueyama     if (Expected<StringRef> e = coffObj->getSectionName(parentSec))
297136d27abSRui Ueyama       parentName = *e;
298136d27abSRui Ueyama     error(toString(this) + ": associative comdat " + name + " (sec " +
299136d27abSRui Ueyama           Twine(sectionNumber) + ") has invalid reference to section " +
300136d27abSRui Ueyama           parentName + " (sec " + Twine(parentIndex) + ")");
3016bb3a1aaSNico Weber   };
3026bb3a1aaSNico Weber 
303136d27abSRui Ueyama   if (parent == pendingComdat) {
3046bb3a1aaSNico Weber     // This can happen if an associative comdat refers to another associative
3056bb3a1aaSNico Weber     // comdat that appears after it (invalid per COFF spec) or to a section
3066bb3a1aaSNico Weber     // without any symbols.
307136d27abSRui Ueyama     diag();
3081621c20fSPeter Collingbourne     return;
3090fb18e6eSNico Weber   }
3101621c20fSPeter Collingbourne 
3111621c20fSPeter Collingbourne   // Check whether the parent is prevailing. If it is, so are we, and we read
3121621c20fSPeter Collingbourne   // the section; otherwise mark it as discarded.
313136d27abSRui Ueyama   if (parent) {
314136d27abSRui Ueyama     SectionChunk *c = readSection(sectionNumber, def, "");
315136d27abSRui Ueyama     sparseChunks[sectionNumber] = c;
316136d27abSRui Ueyama     if (c) {
317136d27abSRui Ueyama       c->selection = IMAGE_COMDAT_SELECT_ASSOCIATIVE;
318136d27abSRui Ueyama       parent->addAssociative(c);
3195b04e0a3SNico Weber     }
3201621c20fSPeter Collingbourne   } else {
321136d27abSRui Ueyama     sparseChunks[sectionNumber] = nullptr;
3221621c20fSPeter Collingbourne   }
3231621c20fSPeter Collingbourne }
3241621c20fSPeter Collingbourne 
recordPrevailingSymbolForMingw(COFFSymbolRef sym,DenseMap<StringRef,uint32_t> & prevailingSectionMap)32521858a9bSMartin Storsjo void ObjFile::recordPrevailingSymbolForMingw(
326136d27abSRui Ueyama     COFFSymbolRef sym, DenseMap<StringRef, uint32_t> &prevailingSectionMap) {
32721858a9bSMartin Storsjo   // For comdat symbols in executable sections, where this is the copy
32821858a9bSMartin Storsjo   // of the section chunk we actually include instead of discarding it,
32921858a9bSMartin Storsjo   // add the symbol to a map to allow using it for implicitly
33021858a9bSMartin Storsjo   // associating .[px]data$<func> sections to it.
331343ffa70SMartin Storsjö   // Use the suffix from the .text$<func> instead of the leader symbol
332343ffa70SMartin Storsjö   // name, for cases where the names differ (i386 mangling/decorations,
333343ffa70SMartin Storsjö   // cases where the leader is a weak symbol named .weak.func.default*).
334136d27abSRui Ueyama   int32_t sectionNumber = sym.getSectionNumber();
335136d27abSRui Ueyama   SectionChunk *sc = sparseChunks[sectionNumber];
336136d27abSRui Ueyama   if (sc && sc->getOutputCharacteristics() & IMAGE_SCN_MEM_EXECUTE) {
337343ffa70SMartin Storsjö     StringRef name = sc->getSectionName().split('$').second;
338136d27abSRui Ueyama     prevailingSectionMap[name] = sectionNumber;
33921858a9bSMartin Storsjo   }
34021858a9bSMartin Storsjo }
34121858a9bSMartin Storsjo 
maybeAssociateSEHForMingw(COFFSymbolRef sym,const coff_aux_section_definition * def,const DenseMap<StringRef,uint32_t> & prevailingSectionMap)34221858a9bSMartin Storsjo void ObjFile::maybeAssociateSEHForMingw(
343136d27abSRui Ueyama     COFFSymbolRef sym, const coff_aux_section_definition *def,
344136d27abSRui Ueyama     const DenseMap<StringRef, uint32_t> &prevailingSectionMap) {
34577ecf90cSReid Kleckner   StringRef name = check(coffObj->getSymbolName(sym));
346136d27abSRui Ueyama   if (name.consume_front(".pdata$") || name.consume_front(".xdata$") ||
347136d27abSRui Ueyama       name.consume_front(".eh_frame$")) {
348c3b1d730SMartin Storsjo     // For MinGW, treat .[px]data$<func> and .eh_frame$<func> as implicitly
349c3b1d730SMartin Storsjo     // associative to the symbol <func>.
350136d27abSRui Ueyama     auto parentSym = prevailingSectionMap.find(name);
351136d27abSRui Ueyama     if (parentSym != prevailingSectionMap.end())
352136d27abSRui Ueyama       readAssociativeDefinition(sym, def, parentSym->second);
35321858a9bSMartin Storsjo   }
35421858a9bSMartin Storsjo }
35521858a9bSMartin Storsjo 
createRegular(COFFSymbolRef sym)356136d27abSRui Ueyama Symbol *ObjFile::createRegular(COFFSymbolRef sym) {
357136d27abSRui Ueyama   SectionChunk *sc = sparseChunks[sym.getSectionNumber()];
358136d27abSRui Ueyama   if (sym.isExternal()) {
35977ecf90cSReid Kleckner     StringRef name = check(coffObj->getSymbolName(sym));
360136d27abSRui Ueyama     if (sc)
3616f7483b1SAmy Huang       return ctx.symtab.addRegular(this, name, sym.getGeneric(), sc,
362b38f577cSMartin Storsjo                                    sym.getValue());
363cab6dafcSMartin Storsjo     // For MinGW symbols named .weak.* that point to a discarded section,
364cab6dafcSMartin Storsjo     // don't create an Undefined symbol. If nothing ever refers to the symbol,
365cab6dafcSMartin Storsjo     // everything should be fine. If something actually refers to the symbol
366cab6dafcSMartin Storsjo     // (e.g. the undefined weak alias), linking will fail due to undefined
367cab6dafcSMartin Storsjo     // references at the end.
368136d27abSRui Ueyama     if (config->mingw && name.startswith(".weak."))
369cab6dafcSMartin Storsjo       return nullptr;
3706f7483b1SAmy Huang     return ctx.symtab.addUndefined(name, this, false);
3711621c20fSPeter Collingbourne   }
372136d27abSRui Ueyama   if (sc)
3731f3ab98aSNico Weber     return make<DefinedRegular>(this, /*Name*/ "", /*IsCOMDAT*/ false,
374136d27abSRui Ueyama                                 /*IsExternal*/ false, sym.getGeneric(), sc);
3751621c20fSPeter Collingbourne   return nullptr;
376411c6360SRui Ueyama }
377411c6360SRui Ueyama 
initializeSymbols()378e1b48e09SRui Ueyama void ObjFile::initializeSymbols() {
379136d27abSRui Ueyama   uint32_t numSymbols = coffObj->getNumberOfSymbols();
380136d27abSRui Ueyama   symbols.resize(numSymbols);
381216d6834SRui Ueyama 
382136d27abSRui Ueyama   SmallVector<std::pair<Symbol *, uint32_t>, 8> weakAliases;
383136d27abSRui Ueyama   std::vector<uint32_t> pendingIndexes;
384136d27abSRui Ueyama   pendingIndexes.reserve(numSymbols);
3851621c20fSPeter Collingbourne 
386136d27abSRui Ueyama   DenseMap<StringRef, uint32_t> prevailingSectionMap;
387136d27abSRui Ueyama   std::vector<const coff_aux_section_definition *> comdatDefs(
388136d27abSRui Ueyama       coffObj->getNumberOfSections() + 1);
389216d6834SRui Ueyama 
390136d27abSRui Ueyama   for (uint32_t i = 0; i < numSymbols; ++i) {
391136d27abSRui Ueyama     COFFSymbolRef coffSym = check(coffObj->getSymbol(i));
392136d27abSRui Ueyama     bool prevailingComdat;
393136d27abSRui Ueyama     if (coffSym.isUndefined()) {
394136d27abSRui Ueyama       symbols[i] = createUndefined(coffSym);
395136d27abSRui Ueyama     } else if (coffSym.isWeakExternal()) {
396136d27abSRui Ueyama       symbols[i] = createUndefined(coffSym);
397136d27abSRui Ueyama       uint32_t tagIndex = coffSym.getAux<coff_aux_weak_external>()->TagIndex;
398136d27abSRui Ueyama       weakAliases.emplace_back(symbols[i], tagIndex);
399136d27abSRui Ueyama     } else if (Optional<Symbol *> optSym =
400136d27abSRui Ueyama                    createDefined(coffSym, comdatDefs, prevailingComdat)) {
401136d27abSRui Ueyama       symbols[i] = *optSym;
402136d27abSRui Ueyama       if (config->mingw && prevailingComdat)
403136d27abSRui Ueyama         recordPrevailingSymbolForMingw(coffSym, prevailingSectionMap);
404c8477b82SPeter Collingbourne     } else {
4051621c20fSPeter Collingbourne       // createDefined() returns None if a symbol belongs to a section that
4061621c20fSPeter Collingbourne       // was pending at the point when the symbol was read. This can happen in
4071621c20fSPeter Collingbourne       // two cases:
4081621c20fSPeter Collingbourne       // 1) section definition symbol for a comdat leader;
4090fb18e6eSNico Weber       // 2) symbol belongs to a comdat section associated with another section.
4101621c20fSPeter Collingbourne       // In both of these cases, we can expect the section to be resolved by
4111621c20fSPeter Collingbourne       // the time we finish visiting the remaining symbols in the symbol
4121621c20fSPeter Collingbourne       // table. So we postpone the handling of this symbol until that time.
413136d27abSRui Ueyama       pendingIndexes.push_back(i);
414c8477b82SPeter Collingbourne     }
415136d27abSRui Ueyama     i += coffSym.getNumberOfAuxSymbols();
4161621c20fSPeter Collingbourne   }
4171621c20fSPeter Collingbourne 
418136d27abSRui Ueyama   for (uint32_t i : pendingIndexes) {
419136d27abSRui Ueyama     COFFSymbolRef sym = check(coffObj->getSymbol(i));
420136d27abSRui Ueyama     if (const coff_aux_section_definition *def = sym.getSectionDefinition()) {
421136d27abSRui Ueyama       if (def->Selection == IMAGE_COMDAT_SELECT_ASSOCIATIVE)
422136d27abSRui Ueyama         readAssociativeDefinition(sym, def);
423136d27abSRui Ueyama       else if (config->mingw)
424136d27abSRui Ueyama         maybeAssociateSEHForMingw(sym, def, prevailingSectionMap);
42521858a9bSMartin Storsjo     }
426136d27abSRui Ueyama     if (sparseChunks[sym.getSectionNumber()] == pendingComdat) {
42777ecf90cSReid Kleckner       StringRef name = check(coffObj->getSymbolName(sym));
428136d27abSRui Ueyama       log("comdat section " + name +
4296c8cbf6dSMartin Storsjo           " without leader and unassociated, discarding");
4306c8cbf6dSMartin Storsjo       continue;
4316c8cbf6dSMartin Storsjo     }
432136d27abSRui Ueyama     symbols[i] = createRegular(sym);
433411c6360SRui Ueyama   }
434216d6834SRui Ueyama 
435136d27abSRui Ueyama   for (auto &kv : weakAliases) {
436136d27abSRui Ueyama     Symbol *sym = kv.first;
437136d27abSRui Ueyama     uint32_t idx = kv.second;
4386f7483b1SAmy Huang     checkAndSetWeakAlias(&ctx.symtab, this, sym, symbols[idx]);
439216d6834SRui Ueyama   }
44011d1aa0bSReid Kleckner 
44111d1aa0bSReid Kleckner   // Free the memory used by sparseChunks now that symbol loading is finished.
44211d1aa0bSReid Kleckner   decltype(sparseChunks)().swap(sparseChunks);
443411c6360SRui Ueyama }
444411c6360SRui Ueyama 
createUndefined(COFFSymbolRef sym)445136d27abSRui Ueyama Symbol *ObjFile::createUndefined(COFFSymbolRef sym) {
44677ecf90cSReid Kleckner   StringRef name = check(coffObj->getSymbolName(sym));
4476f7483b1SAmy Huang   return ctx.symtab.addUndefined(name, this, sym.isWeakExternal());
44857fe78d3SRui Ueyama }
449dae16614SRui Ueyama 
findSectionDef(COFFObjectFile * obj,int32_t section)450df8f3bf6SMartin Storsjö static const coff_aux_section_definition *findSectionDef(COFFObjectFile *obj,
451df8f3bf6SMartin Storsjö                                                          int32_t section) {
452df8f3bf6SMartin Storsjö   uint32_t numSymbols = obj->getNumberOfSymbols();
453df8f3bf6SMartin Storsjö   for (uint32_t i = 0; i < numSymbols; ++i) {
454df8f3bf6SMartin Storsjö     COFFSymbolRef sym = check(obj->getSymbol(i));
455df8f3bf6SMartin Storsjö     if (sym.getSectionNumber() != section)
456df8f3bf6SMartin Storsjö       continue;
457df8f3bf6SMartin Storsjö     if (const coff_aux_section_definition *def = sym.getSectionDefinition())
458df8f3bf6SMartin Storsjö       return def;
459df8f3bf6SMartin Storsjö   }
460df8f3bf6SMartin Storsjö   return nullptr;
461df8f3bf6SMartin Storsjö }
462df8f3bf6SMartin Storsjö 
handleComdatSelection(COFFSymbolRef sym,COMDATType & selection,bool & prevailing,DefinedRegular * leader,const llvm::object::coff_aux_section_definition * def)463df8f3bf6SMartin Storsjö void ObjFile::handleComdatSelection(
464df8f3bf6SMartin Storsjö     COFFSymbolRef sym, COMDATType &selection, bool &prevailing,
465df8f3bf6SMartin Storsjö     DefinedRegular *leader,
466df8f3bf6SMartin Storsjö     const llvm::object::coff_aux_section_definition *def) {
467136d27abSRui Ueyama   if (prevailing)
46804db8cb9SNico Weber     return;
46904db8cb9SNico Weber   // There's already an existing comdat for this symbol: `Leader`.
47004db8cb9SNico Weber   // Use the comdats's selection field to determine if the new
47104db8cb9SNico Weber   // symbol in `Sym` should be discarded, produce a duplicate symbol
47204db8cb9SNico Weber   // error, etc.
47304db8cb9SNico Weber 
474d07f4364SMartin Storsjö   SectionChunk *leaderChunk = leader->getChunk();
475d07f4364SMartin Storsjö   COMDATType leaderSelection = leaderChunk->selection;
47604db8cb9SNico Weber 
477728cc007SMartin Storsjö   assert(leader->data && "Comdat leader without SectionChunk?");
478d07f4364SMartin Storsjö   if (isa<BitcodeFile>(leader->file)) {
479d07f4364SMartin Storsjö     // If the leader is only a LTO symbol, we don't know e.g. its final size
480d07f4364SMartin Storsjö     // yet, so we can't do the full strict comdat selection checking yet.
481d07f4364SMartin Storsjö     selection = leaderSelection = IMAGE_COMDAT_SELECT_ANY;
482d07f4364SMartin Storsjö   }
48304db8cb9SNico Weber 
484136d27abSRui Ueyama   if ((selection == IMAGE_COMDAT_SELECT_ANY &&
485136d27abSRui Ueyama        leaderSelection == IMAGE_COMDAT_SELECT_LARGEST) ||
486136d27abSRui Ueyama       (selection == IMAGE_COMDAT_SELECT_LARGEST &&
487136d27abSRui Ueyama        leaderSelection == IMAGE_COMDAT_SELECT_ANY)) {
48804db8cb9SNico Weber     // cl.exe picks "any" for vftables when building with /GR- and
48904db8cb9SNico Weber     // "largest" when building with /GR. To be able to link object files
49004db8cb9SNico Weber     // compiled with each flag, "any" and "largest" are merged as "largest".
491136d27abSRui Ueyama     leaderSelection = selection = IMAGE_COMDAT_SELECT_LARGEST;
49204db8cb9SNico Weber   }
49304db8cb9SNico Weber 
4949dbc1ab2SMarkus Böck   // GCCs __declspec(selectany) doesn't actually pick "any" but "same size as".
4959dbc1ab2SMarkus Böck   // Clang on the other hand picks "any". To be able to link two object files
4969dbc1ab2SMarkus Böck   // with a __declspec(selectany) declaration, one compiled with gcc and the
4979dbc1ab2SMarkus Böck   // other with clang, we merge them as proper "same size as"
4989dbc1ab2SMarkus Böck   if (config->mingw && ((selection == IMAGE_COMDAT_SELECT_ANY &&
4999dbc1ab2SMarkus Böck                          leaderSelection == IMAGE_COMDAT_SELECT_SAME_SIZE) ||
5009dbc1ab2SMarkus Böck                         (selection == IMAGE_COMDAT_SELECT_SAME_SIZE &&
5019dbc1ab2SMarkus Böck                          leaderSelection == IMAGE_COMDAT_SELECT_ANY))) {
5029dbc1ab2SMarkus Böck     leaderSelection = selection = IMAGE_COMDAT_SELECT_SAME_SIZE;
5039dbc1ab2SMarkus Böck   }
5049dbc1ab2SMarkus Böck 
50504db8cb9SNico Weber   // Other than that, comdat selections must match.  This is a bit more
50604db8cb9SNico Weber   // strict than link.exe which allows merging "any" and "largest" if "any"
50704db8cb9SNico Weber   // is the first symbol the linker sees, and it allows merging "largest"
50804db8cb9SNico Weber   // with everything (!) if "largest" is the first symbol the linker sees.
50904db8cb9SNico Weber   // Making this symmetric independent of which selection is seen first
51004db8cb9SNico Weber   // seems better though.
51104db8cb9SNico Weber   // (This behavior matches ModuleLinker::getComdatResult().)
512136d27abSRui Ueyama   if (selection != leaderSelection) {
513136d27abSRui Ueyama     log(("conflicting comdat type for " + toString(*leader) + ": " +
514136d27abSRui Ueyama          Twine((int)leaderSelection) + " in " + toString(leader->getFile()) +
515136d27abSRui Ueyama          " and " + Twine((int)selection) + " in " + toString(this))
51604db8cb9SNico Weber             .str());
5176f7483b1SAmy Huang     ctx.symtab.reportDuplicate(leader, this);
51804db8cb9SNico Weber     return;
51904db8cb9SNico Weber   }
52004db8cb9SNico Weber 
521136d27abSRui Ueyama   switch (selection) {
52204db8cb9SNico Weber   case IMAGE_COMDAT_SELECT_NODUPLICATES:
5236f7483b1SAmy Huang     ctx.symtab.reportDuplicate(leader, this);
52404db8cb9SNico Weber     break;
52504db8cb9SNico Weber 
52604db8cb9SNico Weber   case IMAGE_COMDAT_SELECT_ANY:
52704db8cb9SNico Weber     // Nothing to do.
52804db8cb9SNico Weber     break;
52904db8cb9SNico Weber 
53004db8cb9SNico Weber   case IMAGE_COMDAT_SELECT_SAME_SIZE:
531df8f3bf6SMartin Storsjö     if (leaderChunk->getSize() != getSection(sym)->SizeOfRawData) {
532df8f3bf6SMartin Storsjö       if (!config->mingw) {
5336f7483b1SAmy Huang         ctx.symtab.reportDuplicate(leader, this);
534df8f3bf6SMartin Storsjö       } else {
535d07f4364SMartin Storsjö         const coff_aux_section_definition *leaderDef = nullptr;
536d07f4364SMartin Storsjö         if (leaderChunk->file)
537d07f4364SMartin Storsjö           leaderDef = findSectionDef(leaderChunk->file->getCOFFObj(),
538d07f4364SMartin Storsjö                                      leaderChunk->getSectionNumber());
539df8f3bf6SMartin Storsjö         if (!leaderDef || leaderDef->Length != def->Length)
5406f7483b1SAmy Huang           ctx.symtab.reportDuplicate(leader, this);
541df8f3bf6SMartin Storsjö       }
542df8f3bf6SMartin Storsjö     }
54304db8cb9SNico Weber     break;
54404db8cb9SNico Weber 
54504db8cb9SNico Weber   case IMAGE_COMDAT_SELECT_EXACT_MATCH: {
546136d27abSRui Ueyama     SectionChunk newChunk(this, getSection(sym));
54704db8cb9SNico Weber     // link.exe only compares section contents here and doesn't complain
54804db8cb9SNico Weber     // if the two comdat sections have e.g. different alignment.
54904db8cb9SNico Weber     // Match that.
550136d27abSRui Ueyama     if (leaderChunk->getContents() != newChunk.getContents())
5516f7483b1SAmy Huang       ctx.symtab.reportDuplicate(leader, this, &newChunk, sym.getValue());
55204db8cb9SNico Weber     break;
55304db8cb9SNico Weber   }
55404db8cb9SNico Weber 
55504db8cb9SNico Weber   case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
55604db8cb9SNico Weber     // createDefined() is never called for IMAGE_COMDAT_SELECT_ASSOCIATIVE.
55704db8cb9SNico Weber     // (This means lld-link doesn't produce duplicate symbol errors for
55804db8cb9SNico Weber     // associative comdats while link.exe does, but associate comdats
55904db8cb9SNico Weber     // are never extern in practice.)
56004db8cb9SNico Weber     llvm_unreachable("createDefined not called for associative comdats");
56104db8cb9SNico Weber 
56204db8cb9SNico Weber   case IMAGE_COMDAT_SELECT_LARGEST:
563136d27abSRui Ueyama     if (leaderChunk->getSize() < getSection(sym)->SizeOfRawData) {
56404db8cb9SNico Weber       // Replace the existing comdat symbol with the new one.
56577ecf90cSReid Kleckner       StringRef name = check(coffObj->getSymbolName(sym));
56604db8cb9SNico Weber       // FIXME: This is incorrect: With /opt:noref, the previous sections
56704db8cb9SNico Weber       // make it into the final executable as well. Correct handling would
56804db8cb9SNico Weber       // be to undo reading of the whole old section that's being replaced,
56904db8cb9SNico Weber       // or doing one pass that determines what the final largest comdat
57004db8cb9SNico Weber       // is for all IMAGE_COMDAT_SELECT_LARGEST comdats and then reading
57104db8cb9SNico Weber       // only the largest one.
572136d27abSRui Ueyama       replaceSymbol<DefinedRegular>(leader, this, name, /*IsCOMDAT*/ true,
573136d27abSRui Ueyama                                     /*IsExternal*/ true, sym.getGeneric(),
57404db8cb9SNico Weber                                     nullptr);
575136d27abSRui Ueyama       prevailing = true;
57604db8cb9SNico Weber     }
57704db8cb9SNico Weber     break;
57804db8cb9SNico Weber 
57904db8cb9SNico Weber   case IMAGE_COMDAT_SELECT_NEWEST:
58004db8cb9SNico Weber     llvm_unreachable("should have been rejected earlier");
58104db8cb9SNico Weber   }
58204db8cb9SNico Weber }
58304db8cb9SNico Weber 
createDefined(COFFSymbolRef sym,std::vector<const coff_aux_section_definition * > & comdatDefs,bool & prevailing)5841621c20fSPeter Collingbourne Optional<Symbol *> ObjFile::createDefined(
585136d27abSRui Ueyama     COFFSymbolRef sym,
586136d27abSRui Ueyama     std::vector<const coff_aux_section_definition *> &comdatDefs,
587136d27abSRui Ueyama     bool &prevailing) {
588136d27abSRui Ueyama   prevailing = false;
58977ecf90cSReid Kleckner   auto getName = [&]() { return check(coffObj->getSymbolName(sym)); };
5907e95d9e3SRui Ueyama 
591136d27abSRui Ueyama   if (sym.isCommon()) {
592136d27abSRui Ueyama     auto *c = make<CommonChunk>(sym);
593136d27abSRui Ueyama     chunks.push_back(c);
5946f7483b1SAmy Huang     return ctx.symtab.addCommon(this, getName(), sym.getValue(),
5956f7483b1SAmy Huang                                 sym.getGeneric(), c);
596411c6360SRui Ueyama   }
5977e95d9e3SRui Ueyama 
598136d27abSRui Ueyama   if (sym.isAbsolute()) {
599136d27abSRui Ueyama     StringRef name = getName();
6007e95d9e3SRui Ueyama 
6017dc5e7a0SBob Haarman     if (name == "@feat.00")
602802aab5dSVlad Tsyrklevich       feat00Flags = sym.getValue();
6037dc5e7a0SBob Haarman     // Skip special symbols.
6047dc5e7a0SBob Haarman     if (ignoredSymbolName(name))
605802aab5dSVlad Tsyrklevich       return nullptr;
6067e95d9e3SRui Ueyama 
607136d27abSRui Ueyama     if (sym.isExternal())
6086f7483b1SAmy Huang       return ctx.symtab.addAbsolute(name, sym);
609136d27abSRui Ueyama     return make<DefinedAbsolute>(name, sym);
61057fe78d3SRui Ueyama   }
6117e95d9e3SRui Ueyama 
612136d27abSRui Ueyama   int32_t sectionNumber = sym.getSectionNumber();
613136d27abSRui Ueyama   if (sectionNumber == llvm::COFF::IMAGE_SYM_DEBUG)
614c7b685d9SPeter Collingbourne     return nullptr;
615ee5bf526SChandler Carruth 
616136d27abSRui Ueyama   if (llvm::COFF::isReservedSectionNumber(sectionNumber))
617136d27abSRui Ueyama     fatal(toString(this) + ": " + getName() +
618136d27abSRui Ueyama           " should not refer to special section " + Twine(sectionNumber));
619272de1e4SDavid Majnemer 
620136d27abSRui Ueyama   if ((uint32_t)sectionNumber >= sparseChunks.size())
621136d27abSRui Ueyama     fatal(toString(this) + ": " + getName() +
622136d27abSRui Ueyama           " should not refer to non-existent section " + Twine(sectionNumber));
623272de1e4SDavid Majnemer 
62448dc110eSNico Weber   // Comdat handling.
62548dc110eSNico Weber   // A comdat symbol consists of two symbol table entries.
62648dc110eSNico Weber   // The first symbol entry has the name of the section (e.g. .text), fixed
62779a8476dSNico Weber   // values for the other fields, and one auxiliary record.
62848dc110eSNico Weber   // The second symbol entry has the name of the comdat symbol, called the
62948dc110eSNico Weber   // "comdat leader".
63048dc110eSNico Weber   // When this function is called for the first symbol entry of a comdat,
6312e2038b6SFangrui Song   // it sets comdatDefs and returns None, and when it's called for the second
6322e2038b6SFangrui Song   // symbol entry it reads comdatDefs and then sets it back to nullptr.
63348dc110eSNico Weber 
63448dc110eSNico Weber   // Handle comdat leader.
635136d27abSRui Ueyama   if (const coff_aux_section_definition *def = comdatDefs[sectionNumber]) {
636136d27abSRui Ueyama     comdatDefs[sectionNumber] = nullptr;
637136d27abSRui Ueyama     DefinedRegular *leader;
63848dc110eSNico Weber 
639136d27abSRui Ueyama     if (sym.isExternal()) {
640136d27abSRui Ueyama       std::tie(leader, prevailing) =
6416f7483b1SAmy Huang           ctx.symtab.addComdat(this, getName(), sym.getGeneric());
6421621c20fSPeter Collingbourne     } else {
643136d27abSRui Ueyama       leader = make<DefinedRegular>(this, /*Name*/ "", /*IsCOMDAT*/ false,
644136d27abSRui Ueyama                                     /*IsExternal*/ false, sym.getGeneric());
645136d27abSRui Ueyama       prevailing = true;
6461621c20fSPeter Collingbourne     }
6477e95d9e3SRui Ueyama 
648136d27abSRui Ueyama     if (def->Selection < (int)IMAGE_COMDAT_SELECT_NODUPLICATES ||
64948dc110eSNico Weber         // Intentionally ends at IMAGE_COMDAT_SELECT_LARGEST: link.exe
65048dc110eSNico Weber         // doesn't understand IMAGE_COMDAT_SELECT_NEWEST either.
651136d27abSRui Ueyama         def->Selection > (int)IMAGE_COMDAT_SELECT_LARGEST) {
652136d27abSRui Ueyama       fatal("unknown comdat type " + std::to_string((int)def->Selection) +
653136d27abSRui Ueyama             " for " + getName() + " in " + toString(this));
65448dc110eSNico Weber     }
655136d27abSRui Ueyama     COMDATType selection = (COMDATType)def->Selection;
65648dc110eSNico Weber 
657136d27abSRui Ueyama     if (leader->isCOMDAT)
658df8f3bf6SMartin Storsjö       handleComdatSelection(sym, selection, prevailing, leader, def);
65948dc110eSNico Weber 
660136d27abSRui Ueyama     if (prevailing) {
661136d27abSRui Ueyama       SectionChunk *c = readSection(sectionNumber, def, getName());
662136d27abSRui Ueyama       sparseChunks[sectionNumber] = c;
663136d27abSRui Ueyama       c->sym = cast<DefinedRegular>(leader);
664136d27abSRui Ueyama       c->selection = selection;
665136d27abSRui Ueyama       cast<DefinedRegular>(leader)->data = &c->repl;
6661621c20fSPeter Collingbourne     } else {
667136d27abSRui Ueyama       sparseChunks[sectionNumber] = nullptr;
6681621c20fSPeter Collingbourne     }
669136d27abSRui Ueyama     return leader;
6701621c20fSPeter Collingbourne   }
671ee5bf526SChandler Carruth 
6720fb18e6eSNico Weber   // Prepare to handle the comdat leader symbol by setting the section's
6730fb18e6eSNico Weber   // ComdatDefs pointer if we encounter a non-associative comdat.
674136d27abSRui Ueyama   if (sparseChunks[sectionNumber] == pendingComdat) {
675136d27abSRui Ueyama     if (const coff_aux_section_definition *def = sym.getSectionDefinition()) {
676136d27abSRui Ueyama       if (def->Selection != IMAGE_COMDAT_SELECT_ASSOCIATIVE)
677136d27abSRui Ueyama         comdatDefs[sectionNumber] = def;
6781621c20fSPeter Collingbourne     }
6791621c20fSPeter Collingbourne     return None;
6800fb18e6eSNico Weber   }
6811f3ab98aSNico Weber 
682136d27abSRui Ueyama   return createRegular(sym);
683617f5ccbSRui Ueyama }
684411c6360SRui Ueyama 
getMachineType()685e1b48e09SRui Ueyama MachineTypes ObjFile::getMachineType() {
686136d27abSRui Ueyama   if (coffObj)
687136d27abSRui Ueyama     return static_cast<MachineTypes>(coffObj->getMachine());
688ea533cdeSRui Ueyama   return IMAGE_FILE_MACHINE_UNKNOWN;
689ea533cdeSRui Ueyama }
690ea533cdeSRui Ueyama 
getDebugSection(StringRef secName)691136d27abSRui Ueyama ArrayRef<uint8_t> ObjFile::getDebugSection(StringRef secName) {
692136d27abSRui Ueyama   if (SectionChunk *sec = SectionChunk::findByName(debugChunks, secName))
693136d27abSRui Ueyama     return sec->consumeDebugMagic();
694d307c4c4SAlexandre Ganea   return {};
695d307c4c4SAlexandre Ganea }
696d307c4c4SAlexandre Ganea 
69779a8476dSNico Weber // OBJ files systematically store critical information in a .debug$S stream,
698d307c4c4SAlexandre Ganea // even if the TU was compiled with no debug info. At least two records are
699d307c4c4SAlexandre Ganea // always there. S_OBJNAME stores a 32-bit signature, which is loaded into the
700d307c4c4SAlexandre Ganea // PCHSignature member. S_COMPILE3 stores compile-time cmd-line flags. This is
7012e2038b6SFangrui Song // currently used to initialize the hotPatchable member.
initializeFlags()702d307c4c4SAlexandre Ganea void ObjFile::initializeFlags() {
703136d27abSRui Ueyama   ArrayRef<uint8_t> data = getDebugSection(".debug$S");
704136d27abSRui Ueyama   if (data.empty())
705d307c4c4SAlexandre Ganea     return;
706d307c4c4SAlexandre Ganea 
707136d27abSRui Ueyama   DebugSubsectionArray subsections;
708d307c4c4SAlexandre Ganea 
709136d27abSRui Ueyama   BinaryStreamReader reader(data, support::little);
710136d27abSRui Ueyama   ExitOnError exitOnErr;
711136d27abSRui Ueyama   exitOnErr(reader.readArray(subsections, data.size()));
712d307c4c4SAlexandre Ganea 
713136d27abSRui Ueyama   for (const DebugSubsectionRecord &ss : subsections) {
714136d27abSRui Ueyama     if (ss.kind() != DebugSubsectionKind::Symbols)
715d307c4c4SAlexandre Ganea       continue;
716d307c4c4SAlexandre Ganea 
717136d27abSRui Ueyama     unsigned offset = 0;
718d307c4c4SAlexandre Ganea 
719d307c4c4SAlexandre Ganea     // Only parse the first two records. We are only looking for S_OBJNAME
720d307c4c4SAlexandre Ganea     // and S_COMPILE3, and they usually appear at the beginning of the
721d307c4c4SAlexandre Ganea     // stream.
722136d27abSRui Ueyama     for (unsigned i = 0; i < 2; ++i) {
723136d27abSRui Ueyama       Expected<CVSymbol> sym = readSymbolFromStream(ss.getRecordData(), offset);
724136d27abSRui Ueyama       if (!sym) {
725136d27abSRui Ueyama         consumeError(sym.takeError());
726d307c4c4SAlexandre Ganea         return;
727d307c4c4SAlexandre Ganea       }
728136d27abSRui Ueyama       if (sym->kind() == SymbolKind::S_COMPILE3) {
729136d27abSRui Ueyama         auto cs =
730136d27abSRui Ueyama             cantFail(SymbolDeserializer::deserializeAs<Compile3Sym>(sym.get()));
731136d27abSRui Ueyama         hotPatchable =
732136d27abSRui Ueyama             (cs.Flags & CompileSym3Flags::HotPatch) != CompileSym3Flags::None;
733d307c4c4SAlexandre Ganea       }
734136d27abSRui Ueyama       if (sym->kind() == SymbolKind::S_OBJNAME) {
735136d27abSRui Ueyama         auto objName = cantFail(SymbolDeserializer::deserializeAs<ObjNameSym>(
736136d27abSRui Ueyama             sym.get()));
737136d27abSRui Ueyama         pchSignature = objName.Signature;
738d307c4c4SAlexandre Ganea       }
739136d27abSRui Ueyama       offset += sym->length();
740d307c4c4SAlexandre Ganea     }
741d307c4c4SAlexandre Ganea   }
742d307c4c4SAlexandre Ganea }
743d307c4c4SAlexandre Ganea 
744bf55c4e3SAlexandre Ganea // Depending on the compilation flags, OBJs can refer to external files,
745bf55c4e3SAlexandre Ganea // necessary to merge this OBJ into the final PDB. We currently support two
746bf55c4e3SAlexandre Ganea // types of external files: Precomp/PCH OBJs, when compiling with /Yc and /Yu.
747bf55c4e3SAlexandre Ganea // And PDB type servers, when compiling with /Zi. This function extracts these
748bf55c4e3SAlexandre Ganea // dependencies and makes them available as a TpiSource interface (see
749af6bc65dSNico Weber // DebugTypes.h). Both cases only happen with cl.exe: clang-cl produces regular
750af6bc65dSNico Weber // output even with /Yc and /Yu and with /Zi.
initializeDependencies()751bf55c4e3SAlexandre Ganea void ObjFile::initializeDependencies() {
752136d27abSRui Ueyama   if (!config->debug)
753bf55c4e3SAlexandre Ganea     return;
754bf55c4e3SAlexandre Ganea 
755136d27abSRui Ueyama   bool isPCH = false;
756bf55c4e3SAlexandre Ganea 
757136d27abSRui Ueyama   ArrayRef<uint8_t> data = getDebugSection(".debug$P");
758136d27abSRui Ueyama   if (!data.empty())
759136d27abSRui Ueyama     isPCH = true;
760bf55c4e3SAlexandre Ganea   else
761136d27abSRui Ueyama     data = getDebugSection(".debug$T");
762bf55c4e3SAlexandre Ganea 
7631e5b7e91SReid Kleckner   // symbols but no types, make a plain, empty TpiSource anyway, because it
7641e5b7e91SReid Kleckner   // simplifies adding the symbols later.
7651e5b7e91SReid Kleckner   if (data.empty()) {
7661e5b7e91SReid Kleckner     if (!debugChunks.empty())
7676f7483b1SAmy Huang       debugTypesObj = makeTpiSource(ctx, this);
768bf55c4e3SAlexandre Ganea     return;
7691e5b7e91SReid Kleckner   }
770bf55c4e3SAlexandre Ganea 
77154a335a2SReid Kleckner   // Get the first type record. It will indicate if this object uses a type
77254a335a2SReid Kleckner   // server (/Zi) or a PCH file (/Yu).
773136d27abSRui Ueyama   CVTypeArray types;
774136d27abSRui Ueyama   BinaryStreamReader reader(data, support::little);
775136d27abSRui Ueyama   cantFail(reader.readArray(types, reader.getLength()));
776136d27abSRui Ueyama   CVTypeArray::Iterator firstType = types.begin();
777136d27abSRui Ueyama   if (firstType == types.end())
778bf55c4e3SAlexandre Ganea     return;
779bf55c4e3SAlexandre Ganea 
780de3fb1ecSReid Kleckner   // Remember the .debug$T or .debug$P section.
781de3fb1ecSReid Kleckner   debugTypes = data;
782bf55c4e3SAlexandre Ganea 
78354a335a2SReid Kleckner   // This object file is a PCH file that others will depend on.
784136d27abSRui Ueyama   if (isPCH) {
7856f7483b1SAmy Huang     debugTypesObj = makePrecompSource(ctx, this);
786bf55c4e3SAlexandre Ganea     return;
787bf55c4e3SAlexandre Ganea   }
788bf55c4e3SAlexandre Ganea 
78954a335a2SReid Kleckner   // This object file was compiled with /Zi. Enqueue the PDB dependency.
790136d27abSRui Ueyama   if (firstType->kind() == LF_TYPESERVER2) {
791136d27abSRui Ueyama     TypeServer2Record ts = cantFail(
792136d27abSRui Ueyama         TypeDeserializer::deserializeAs<TypeServer2Record>(firstType->data()));
7936f7483b1SAmy Huang     debugTypesObj = makeUseTypeServerSource(ctx, this, ts);
7946f7483b1SAmy Huang     enqueuePdbFile(ts.getName(), this);
795bf55c4e3SAlexandre Ganea     return;
796bf55c4e3SAlexandre Ganea   }
797bf55c4e3SAlexandre Ganea 
79854a335a2SReid Kleckner   // This object was compiled with /Yu. It uses types from another object file
79954a335a2SReid Kleckner   // with a matching signature.
800136d27abSRui Ueyama   if (firstType->kind() == LF_PRECOMP) {
801136d27abSRui Ueyama     PrecompRecord precomp = cantFail(
802136d27abSRui Ueyama         TypeDeserializer::deserializeAs<PrecompRecord>(firstType->data()));
8036f7483b1SAmy Huang     debugTypesObj = makeUsePrecompSource(ctx, this, precomp);
8041b88845cSReid Kleckner     // Drop the LF_PRECOMP record from the input stream.
8051b88845cSReid Kleckner     debugTypes = debugTypes.drop_front(firstType->RecordData.size());
806bf55c4e3SAlexandre Ganea     return;
807bf55c4e3SAlexandre Ganea   }
808bf55c4e3SAlexandre Ganea 
80954a335a2SReid Kleckner   // This is a plain old object file.
8106f7483b1SAmy Huang   debugTypesObj = makeTpiSource(ctx, this);
811bf55c4e3SAlexandre Ganea }
812bf55c4e3SAlexandre Ganea 
81354a335a2SReid Kleckner // Make a PDB path assuming the PDB is in the same folder as the OBJ
getPdbBaseName(ObjFile * file,StringRef tSPath)81454a335a2SReid Kleckner static std::string getPdbBaseName(ObjFile *file, StringRef tSPath) {
81554a335a2SReid Kleckner   StringRef localPath =
81654a335a2SReid Kleckner       !file->parentName.empty() ? file->parentName : file->getName();
81754a335a2SReid Kleckner   SmallString<128> path = sys::path::parent_path(localPath);
81854a335a2SReid Kleckner 
81954a335a2SReid Kleckner   // Currently, type server PDBs are only created by MSVC cl, which only runs
82054a335a2SReid Kleckner   // on Windows, so we can assume type server paths are Windows style.
82154a335a2SReid Kleckner   sys::path::append(path,
82254a335a2SReid Kleckner                     sys::path::filename(tSPath, sys::path::Style::windows));
82354a335a2SReid Kleckner   return std::string(path.str());
82454a335a2SReid Kleckner }
82554a335a2SReid Kleckner 
82654a335a2SReid Kleckner // The casing of the PDB path stamped in the OBJ can differ from the actual path
82754a335a2SReid Kleckner // on disk. With this, we ensure to always use lowercase as a key for the
8286f7483b1SAmy Huang // pdbInputFileInstances map, at least on Windows.
normalizePdbPath(StringRef path)82954a335a2SReid Kleckner static std::string normalizePdbPath(StringRef path) {
83054a335a2SReid Kleckner #if defined(_WIN32)
83154a335a2SReid Kleckner   return path.lower();
83254a335a2SReid Kleckner #else // LINUX
83354a335a2SReid Kleckner   return std::string(path);
83454a335a2SReid Kleckner #endif
83554a335a2SReid Kleckner }
83654a335a2SReid Kleckner 
83754a335a2SReid Kleckner // If existing, return the actual PDB path on disk.
findPdbPath(StringRef pdbPath,ObjFile * dependentFile)83854a335a2SReid Kleckner static Optional<std::string> findPdbPath(StringRef pdbPath,
83954a335a2SReid Kleckner                                          ObjFile *dependentFile) {
84054a335a2SReid Kleckner   // Ensure the file exists before anything else. In some cases, if the path
84154a335a2SReid Kleckner   // points to a removable device, Driver::enqueuePath() would fail with an
84254a335a2SReid Kleckner   // error (EAGAIN, "resource unavailable try again") which we want to skip
84354a335a2SReid Kleckner   // silently.
84454a335a2SReid Kleckner   if (llvm::sys::fs::exists(pdbPath))
84554a335a2SReid Kleckner     return normalizePdbPath(pdbPath);
84654a335a2SReid Kleckner   std::string ret = getPdbBaseName(dependentFile, pdbPath);
84754a335a2SReid Kleckner   if (llvm::sys::fs::exists(ret))
84854a335a2SReid Kleckner     return normalizePdbPath(ret);
84954a335a2SReid Kleckner   return None;
85054a335a2SReid Kleckner }
85154a335a2SReid Kleckner 
PDBInputFile(COFFLinkerContext & ctx,MemoryBufferRef m)8526f7483b1SAmy Huang PDBInputFile::PDBInputFile(COFFLinkerContext &ctx, MemoryBufferRef m)
8536f7483b1SAmy Huang     : InputFile(ctx, PDBKind, m) {}
85454a335a2SReid Kleckner 
85554a335a2SReid Kleckner PDBInputFile::~PDBInputFile() = default;
85654a335a2SReid Kleckner 
findFromRecordPath(const COFFLinkerContext & ctx,StringRef path,ObjFile * fromFile)8576f7483b1SAmy Huang PDBInputFile *PDBInputFile::findFromRecordPath(const COFFLinkerContext &ctx,
8586f7483b1SAmy Huang                                                StringRef path,
85954a335a2SReid Kleckner                                                ObjFile *fromFile) {
86054a335a2SReid Kleckner   auto p = findPdbPath(path.str(), fromFile);
86154a335a2SReid Kleckner   if (!p)
86254a335a2SReid Kleckner     return nullptr;
8636f7483b1SAmy Huang   auto it = ctx.pdbInputFileInstances.find(*p);
8646f7483b1SAmy Huang   if (it != ctx.pdbInputFileInstances.end())
86554a335a2SReid Kleckner     return it->second;
86654a335a2SReid Kleckner   return nullptr;
86754a335a2SReid Kleckner }
86854a335a2SReid Kleckner 
parse()86954a335a2SReid Kleckner void PDBInputFile::parse() {
8706f7483b1SAmy Huang   ctx.pdbInputFileInstances[mb.getBufferIdentifier().str()] = this;
87154a335a2SReid Kleckner 
87254a335a2SReid Kleckner   std::unique_ptr<pdb::IPDBSession> thisSession;
87354a335a2SReid Kleckner   loadErr.emplace(pdb::NativeSession::createFromPdb(
87454a335a2SReid Kleckner       MemoryBuffer::getMemBuffer(mb, false), thisSession));
87554a335a2SReid Kleckner   if (*loadErr)
87654a335a2SReid Kleckner     return; // fail silently at this point - the error will be handled later,
87754a335a2SReid Kleckner             // when merging the debug type stream
87854a335a2SReid Kleckner 
87954a335a2SReid Kleckner   session.reset(static_cast<pdb::NativeSession *>(thisSession.release()));
88054a335a2SReid Kleckner 
88154a335a2SReid Kleckner   pdb::PDBFile &pdbFile = session->getPDBFile();
88254a335a2SReid Kleckner   auto expectedInfo = pdbFile.getPDBInfoStream();
88354a335a2SReid Kleckner   // All PDB Files should have an Info stream.
88454a335a2SReid Kleckner   if (!expectedInfo) {
88554a335a2SReid Kleckner     loadErr.emplace(expectedInfo.takeError());
88654a335a2SReid Kleckner     return;
88754a335a2SReid Kleckner   }
8886f7483b1SAmy Huang   debugTypesObj = makeTypeServerSource(ctx, this);
88954a335a2SReid Kleckner }
89054a335a2SReid Kleckner 
891b38f577cSMartin Storsjo // Used only for DWARF debug info, which is not common (except in MinGW
892b38f577cSMartin Storsjo // environments). This returns an optional pair of file name and line
893b38f577cSMartin Storsjo // number for where the variable was defined.
894b38f577cSMartin Storsjo Optional<std::pair<StringRef, uint32_t>>
getVariableLocation(StringRef var)895b38f577cSMartin Storsjo ObjFile::getVariableLocation(StringRef var) {
896b38f577cSMartin Storsjo   if (!dwarf) {
897908b7809SMartin Storsjo     dwarf = make<DWARFCache>(DWARFContext::create(*getCOFFObj()));
898b38f577cSMartin Storsjo     if (!dwarf)
899b38f577cSMartin Storsjo       return None;
900b38f577cSMartin Storsjo   }
901b38f577cSMartin Storsjo   if (config->machine == I386)
902b38f577cSMartin Storsjo     var.consume_front("_");
903908b7809SMartin Storsjo   Optional<std::pair<std::string, unsigned>> ret = dwarf->getVariableLoc(var);
904908b7809SMartin Storsjo   if (!ret)
905b38f577cSMartin Storsjo     return None;
906*83d59e05SAlexandre Ganea   return std::make_pair(saver().save(ret->first), ret->second);
907b38f577cSMartin Storsjo }
908b38f577cSMartin Storsjo 
90965b1c497SMartin Storsjo // Used only for DWARF debug info, which is not common (except in MinGW
91065b1c497SMartin Storsjo // environments).
getDILineInfo(uint32_t offset,uint32_t sectionIndex)91165b1c497SMartin Storsjo Optional<DILineInfo> ObjFile::getDILineInfo(uint32_t offset,
91265b1c497SMartin Storsjo                                             uint32_t sectionIndex) {
91365b1c497SMartin Storsjo   if (!dwarf) {
91465b1c497SMartin Storsjo     dwarf = make<DWARFCache>(DWARFContext::create(*getCOFFObj()));
91565b1c497SMartin Storsjo     if (!dwarf)
91665b1c497SMartin Storsjo       return None;
91765b1c497SMartin Storsjo   }
91865b1c497SMartin Storsjo 
91965b1c497SMartin Storsjo   return dwarf->getDILineInfo(offset, sectionIndex);
92065b1c497SMartin Storsjo }
92165b1c497SMartin Storsjo 
enqueuePdbFile(StringRef path,ObjFile * fromFile)9226f7483b1SAmy Huang void ObjFile::enqueuePdbFile(StringRef path, ObjFile *fromFile) {
9236f7483b1SAmy Huang   auto p = findPdbPath(path.str(), fromFile);
9246f7483b1SAmy Huang   if (!p)
9256f7483b1SAmy Huang     return;
9266f7483b1SAmy Huang   auto it = ctx.pdbInputFileInstances.emplace(*p, nullptr);
9276f7483b1SAmy Huang   if (!it.second)
9286f7483b1SAmy Huang     return; // already scheduled for load
9296f7483b1SAmy Huang   driver->enqueuePDB(*p);
9306f7483b1SAmy Huang }
9316f7483b1SAmy Huang 
parse()932b835ae8eSRafael Espindola void ImportFile::parse() {
933136d27abSRui Ueyama   const char *buf = mb.getBufferStart();
934136d27abSRui Ueyama   const auto *hdr = reinterpret_cast<const coff_import_header *>(buf);
935411c6360SRui Ueyama 
936411c6360SRui Ueyama   // Check if the total size is valid.
937136d27abSRui Ueyama   if (mb.getBufferSize() != sizeof(*hdr) + hdr->SizeOfData)
93860604793SRui Ueyama     fatal("broken import library");
939411c6360SRui Ueyama 
940411c6360SRui Ueyama   // Read names and create an __imp_ symbol.
941*83d59e05SAlexandre Ganea   StringRef name = saver().save(StringRef(buf + sizeof(*hdr)));
942*83d59e05SAlexandre Ganea   StringRef impName = saver().save("__imp_" + name);
943136d27abSRui Ueyama   const char *nameStart = buf + sizeof(coff_import_header) + name.size() + 1;
944adcd0268SBenjamin Kramer   dllName = std::string(StringRef(nameStart));
945136d27abSRui Ueyama   StringRef extName;
946136d27abSRui Ueyama   switch (hdr->getNameType()) {
9471c79ce9aSRui Ueyama   case IMPORT_ORDINAL:
948136d27abSRui Ueyama     extName = "";
9491c79ce9aSRui Ueyama     break;
9501c79ce9aSRui Ueyama   case IMPORT_NAME:
951136d27abSRui Ueyama     extName = name;
9521c79ce9aSRui Ueyama     break;
9531c79ce9aSRui Ueyama   case IMPORT_NAME_NOPREFIX:
954136d27abSRui Ueyama     extName = ltrim1(name, "?@_");
9551c79ce9aSRui Ueyama     break;
9561c79ce9aSRui Ueyama   case IMPORT_NAME_UNDECORATE:
957136d27abSRui Ueyama     extName = ltrim1(name, "?@_");
958136d27abSRui Ueyama     extName = extName.substr(0, extName.find('@'));
9591c79ce9aSRui Ueyama     break;
9601c79ce9aSRui Ueyama   }
96179a5e6b1SPeter Collingbourne 
962136d27abSRui Ueyama   this->hdr = hdr;
963136d27abSRui Ueyama   externalName = extName;
96479a5e6b1SPeter Collingbourne 
9656f7483b1SAmy Huang   impSym = ctx.symtab.addImportData(impName, this);
96628212dfcSMartin Storsjo   // If this was a duplicate, we logged an error but may continue;
9672e2038b6SFangrui Song   // in this case, impSym is nullptr.
968136d27abSRui Ueyama   if (!impSym)
96928212dfcSMartin Storsjo     return;
9703170ad74SSaleem Abdulrasool 
971136d27abSRui Ueyama   if (hdr->getType() == llvm::COFF::IMPORT_CONST)
9726f7483b1SAmy Huang     static_cast<void>(ctx.symtab.addImportData(name, this));
973411c6360SRui Ueyama 
974411c6360SRui Ueyama   // If type is function, we need to create a thunk which jump to an
975411c6360SRui Ueyama   // address pointed by the __imp_ symbol. (This allows you to call
976411c6360SRui Ueyama   // DLL functions just like regular non-DLL functions.)
977136d27abSRui Ueyama   if (hdr->getType() == llvm::COFF::IMPORT_CODE)
9786f7483b1SAmy Huang     thunkSym = ctx.symtab.addImportThunk(
979136d27abSRui Ueyama         name, cast_or_null<DefinedImportData>(impSym), hdr->Machine);
980411c6360SRui Ueyama }
981411c6360SRui Ueyama 
BitcodeFile(COFFLinkerContext & ctx,MemoryBufferRef mb,StringRef archiveName,uint64_t offsetInArchive,bool lazy)9826f7483b1SAmy Huang BitcodeFile::BitcodeFile(COFFLinkerContext &ctx, MemoryBufferRef mb,
9836f7483b1SAmy Huang                          StringRef archiveName, uint64_t offsetInArchive,
984d496abbeSFangrui Song                          bool lazy)
985d496abbeSFangrui Song     : InputFile(ctx, BitcodeKind, mb, lazy) {
986136d27abSRui Ueyama   std::string path = mb.getBufferIdentifier().str();
9875011b832SBob Haarman   if (config->thinLTOIndexOnly)
9885011b832SBob Haarman     path = replaceThinLTOSuffix(mb.getBufferIdentifier());
9898b1ec798SBob Haarman 
9908b1ec798SBob Haarman   // ThinLTO assumes that all MemoryBufferRefs given to it have a unique
9918b1ec798SBob Haarman   // name. If two archives define two members with the same name, this
9928b1ec798SBob Haarman   // causes a collision which result in only one of the objects being taken
9938b1ec798SBob Haarman   // into consideration at LTO time (which very likely causes undefined
9948b1ec798SBob Haarman   // symbols later in the link stage). So we append file offset to make
9958b1ec798SBob Haarman   // filename unique.
996*83d59e05SAlexandre Ganea   MemoryBufferRef mbref(mb.getBuffer(),
997*83d59e05SAlexandre Ganea                         saver().save(archiveName.empty()
998*83d59e05SAlexandre Ganea                                          ? path
999*83d59e05SAlexandre Ganea                                          : archiveName +
1000*83d59e05SAlexandre Ganea                                                sys::path::filename(path) +
1001497c110eSevgeny                                                utostr(offsetInArchive)));
10028b1ec798SBob Haarman 
1003136d27abSRui Ueyama   obj = check(lto::InputFile::create(mbref));
10048b1ec798SBob Haarman }
10058b1ec798SBob Haarman 
1006f24c3352SReid Kleckner BitcodeFile::~BitcodeFile() = default;
1007f24c3352SReid Kleckner 
100833b71ec9SMartin Storsjö namespace {
100933b71ec9SMartin Storsjö // Convenience class for initializing a coff_section with specific flags.
101033b71ec9SMartin Storsjö class FakeSection {
101133b71ec9SMartin Storsjö public:
FakeSection(int c)101233b71ec9SMartin Storsjö   FakeSection(int c) { section.Characteristics = c; }
101333b71ec9SMartin Storsjö 
101433b71ec9SMartin Storsjö   coff_section section;
101533b71ec9SMartin Storsjö };
101633b71ec9SMartin Storsjö 
1017728cc007SMartin Storsjö // Convenience class for initializing a SectionChunk with specific flags.
1018728cc007SMartin Storsjö class FakeSectionChunk {
1019728cc007SMartin Storsjö public:
FakeSectionChunk(const coff_section * section)1020728cc007SMartin Storsjö   FakeSectionChunk(const coff_section *section) : chunk(nullptr, section) {
1021d07f4364SMartin Storsjö     // Comdats from LTO files can't be fully treated as regular comdats
1022d07f4364SMartin Storsjö     // at this point; we don't know what size or contents they are going to
1023d07f4364SMartin Storsjö     // have, so we can't do proper checking of such aspects of them.
1024728cc007SMartin Storsjö     chunk.selection = IMAGE_COMDAT_SELECT_ANY;
1025728cc007SMartin Storsjö   }
1026728cc007SMartin Storsjö 
1027728cc007SMartin Storsjö   SectionChunk chunk;
1028728cc007SMartin Storsjö };
1029728cc007SMartin Storsjö 
103033b71ec9SMartin Storsjö FakeSection ltoTextSection(IMAGE_SCN_MEM_EXECUTE);
103133b71ec9SMartin Storsjö FakeSection ltoDataSection(IMAGE_SCN_CNT_INITIALIZED_DATA);
1032728cc007SMartin Storsjö FakeSectionChunk ltoTextSectionChunk(&ltoTextSection.section);
1033728cc007SMartin Storsjö FakeSectionChunk ltoDataSectionChunk(&ltoDataSection.section);
103433b71ec9SMartin Storsjö } // namespace
103533b71ec9SMartin Storsjö 
parse()1036b835ae8eSRafael Espindola void BitcodeFile::parse() {
1037*83d59e05SAlexandre Ganea   llvm::StringSaver &saver = lld::saver();
1038136d27abSRui Ueyama   std::vector<std::pair<Symbol *, bool>> comdat(obj->getComdatTable().size());
1039136d27abSRui Ueyama   for (size_t i = 0; i != obj->getComdatTable().size(); ++i)
1040db5e0786SFangrui Song     // FIXME: Check nodeduplicate
1041db5e0786SFangrui Song     comdat[i] =
10426f7483b1SAmy Huang         ctx.symtab.addComdat(this, saver.save(obj->getComdatTable()[i].first));
1043136d27abSRui Ueyama   for (const lto::InputFile::Symbol &objSym : obj->symbols()) {
1044136d27abSRui Ueyama     StringRef symName = saver.save(objSym.getName());
1045136d27abSRui Ueyama     int comdatIndex = objSym.getComdatIndex();
1046136d27abSRui Ueyama     Symbol *sym;
104733b71ec9SMartin Storsjö     SectionChunk *fakeSC = nullptr;
104833b71ec9SMartin Storsjö     if (objSym.isExecutable())
1049728cc007SMartin Storsjö       fakeSC = &ltoTextSectionChunk.chunk;
105033b71ec9SMartin Storsjö     else
1051728cc007SMartin Storsjö       fakeSC = &ltoDataSectionChunk.chunk;
1052136d27abSRui Ueyama     if (objSym.isUndefined()) {
10536f7483b1SAmy Huang       sym = ctx.symtab.addUndefined(symName, this, false);
1054136d27abSRui Ueyama     } else if (objSym.isCommon()) {
10556f7483b1SAmy Huang       sym = ctx.symtab.addCommon(this, symName, objSym.getCommonSize());
1056136d27abSRui Ueyama     } else if (objSym.isWeak() && objSym.isIndirect()) {
1057cde5e5b6SBob Haarman       // Weak external.
10586f7483b1SAmy Huang       sym = ctx.symtab.addUndefined(symName, this, true);
1059adcd0268SBenjamin Kramer       std::string fallback = std::string(objSym.getCOFFWeakExternalFallback());
10606f7483b1SAmy Huang       Symbol *alias = ctx.symtab.addUndefined(saver.save(fallback));
10616f7483b1SAmy Huang       checkAndSetWeakAlias(&ctx.symtab, this, sym, alias);
1062136d27abSRui Ueyama     } else if (comdatIndex != -1) {
1063db5e0786SFangrui Song       if (symName == obj->getComdatTable()[comdatIndex].first) {
1064136d27abSRui Ueyama         sym = comdat[comdatIndex].first;
1065728cc007SMartin Storsjö         if (cast<DefinedRegular>(sym)->data == nullptr)
1066728cc007SMartin Storsjö           cast<DefinedRegular>(sym)->data = &fakeSC->repl;
1067728cc007SMartin Storsjö       } else if (comdat[comdatIndex].second) {
10686f7483b1SAmy Huang         sym = ctx.symtab.addRegular(this, symName, nullptr, fakeSC);
1069728cc007SMartin Storsjö       } else {
10706f7483b1SAmy Huang         sym = ctx.symtab.addUndefined(symName, this, false);
1071728cc007SMartin Storsjö       }
107260c16166SPeter Collingbourne     } else {
10736f7483b1SAmy Huang       sym = ctx.symtab.addRegular(this, symName, nullptr, fakeSC);
107460c16166SPeter Collingbourne     }
1075136d27abSRui Ueyama     symbols.push_back(sym);
1076136d27abSRui Ueyama     if (objSym.isUsed())
1077332fc712SRui Ueyama       config->gcroot.push_back(sym);
107860c16166SPeter Collingbourne   }
1079136d27abSRui Ueyama   directives = obj->getCOFFLinkerOpts();
108060c16166SPeter Collingbourne }
108181b030cbSRui Ueyama 
parseLazy()1082d496abbeSFangrui Song void BitcodeFile::parseLazy() {
1083d496abbeSFangrui Song   for (const lto::InputFile::Symbol &sym : obj->symbols())
1084d496abbeSFangrui Song     if (!sym.isUndefined())
1085d496abbeSFangrui Song       ctx.symtab.addLazyObject(this, sym.getName());
1086d496abbeSFangrui Song }
1087d496abbeSFangrui Song 
getMachineType()1088ea533cdeSRui Ueyama MachineTypes BitcodeFile::getMachineType() {
1089136d27abSRui Ueyama   switch (Triple(obj->getTargetTriple()).getArch()) {
1090ea533cdeSRui Ueyama   case Triple::x86_64:
10915e706b3eSRui Ueyama     return AMD64;
1092ea533cdeSRui Ueyama   case Triple::x86:
10935e706b3eSRui Ueyama     return I386;
1094ea533cdeSRui Ueyama   case Triple::arm:
10955e706b3eSRui Ueyama     return ARMNT;
109694fce509SMartin Storsjo   case Triple::aarch64:
109794fce509SMartin Storsjo     return ARM64;
1098ea533cdeSRui Ueyama   default:
1099ea533cdeSRui Ueyama     return IMAGE_FILE_MACHINE_UNKNOWN;
1100ea533cdeSRui Ueyama   }
1101ea533cdeSRui Ueyama }
11025011b832SBob Haarman 
replaceThinLTOSuffix(StringRef path)11038a310f40SReid Kleckner std::string lld::coff::replaceThinLTOSuffix(StringRef path) {
11045011b832SBob Haarman   StringRef suffix = config->thinLTOObjectSuffixReplace.first;
11055011b832SBob Haarman   StringRef repl = config->thinLTOObjectSuffixReplace.second;
11065011b832SBob Haarman 
11075011b832SBob Haarman   if (path.consume_back(suffix))
11085011b832SBob Haarman     return (path + repl).str();
1109adcd0268SBenjamin Kramer   return std::string(path);
11105011b832SBob Haarman }
1111a9ff1ce1SMartin Storsjö 
isRVACode(COFFObjectFile * coffObj,uint64_t rva,InputFile * file)1112a9ff1ce1SMartin Storsjö static bool isRVACode(COFFObjectFile *coffObj, uint64_t rva, InputFile *file) {
1113a9ff1ce1SMartin Storsjö   for (size_t i = 1, e = coffObj->getNumberOfSections(); i <= e; i++) {
1114a9ff1ce1SMartin Storsjö     const coff_section *sec = CHECK(coffObj->getSection(i), file);
1115a9ff1ce1SMartin Storsjö     if (rva >= sec->VirtualAddress &&
1116a9ff1ce1SMartin Storsjö         rva <= sec->VirtualAddress + sec->VirtualSize) {
1117a9ff1ce1SMartin Storsjö       return (sec->Characteristics & COFF::IMAGE_SCN_CNT_CODE) != 0;
1118a9ff1ce1SMartin Storsjö     }
1119a9ff1ce1SMartin Storsjö   }
1120a9ff1ce1SMartin Storsjö   return false;
1121a9ff1ce1SMartin Storsjö }
1122a9ff1ce1SMartin Storsjö 
parse()1123a9ff1ce1SMartin Storsjö void DLLFile::parse() {
1124a9ff1ce1SMartin Storsjö   // Parse a memory buffer as a PE-COFF executable.
1125a9ff1ce1SMartin Storsjö   std::unique_ptr<Binary> bin = CHECK(createBinary(mb), this);
1126a9ff1ce1SMartin Storsjö 
1127a9ff1ce1SMartin Storsjö   if (auto *obj = dyn_cast<COFFObjectFile>(bin.get())) {
1128a9ff1ce1SMartin Storsjö     bin.release();
1129a9ff1ce1SMartin Storsjö     coffObj.reset(obj);
1130a9ff1ce1SMartin Storsjö   } else {
1131a9ff1ce1SMartin Storsjö     error(toString(this) + " is not a COFF file");
1132a9ff1ce1SMartin Storsjö     return;
1133a9ff1ce1SMartin Storsjö   }
1134a9ff1ce1SMartin Storsjö 
1135a9ff1ce1SMartin Storsjö   if (!coffObj->getPE32Header() && !coffObj->getPE32PlusHeader()) {
1136a9ff1ce1SMartin Storsjö     error(toString(this) + " is not a PE-COFF executable");
1137a9ff1ce1SMartin Storsjö     return;
1138a9ff1ce1SMartin Storsjö   }
1139a9ff1ce1SMartin Storsjö 
1140a9ff1ce1SMartin Storsjö   for (const auto &exp : coffObj->export_directories()) {
1141a9ff1ce1SMartin Storsjö     StringRef dllName, symbolName;
1142a9ff1ce1SMartin Storsjö     uint32_t exportRVA;
1143a9ff1ce1SMartin Storsjö     checkError(exp.getDllName(dllName));
1144a9ff1ce1SMartin Storsjö     checkError(exp.getSymbolName(symbolName));
1145a9ff1ce1SMartin Storsjö     checkError(exp.getExportRVA(exportRVA));
1146a9ff1ce1SMartin Storsjö 
1147a9ff1ce1SMartin Storsjö     if (symbolName.empty())
1148a9ff1ce1SMartin Storsjö       continue;
1149a9ff1ce1SMartin Storsjö 
1150a9ff1ce1SMartin Storsjö     bool code = isRVACode(coffObj.get(), exportRVA, this);
1151a9ff1ce1SMartin Storsjö 
1152a9ff1ce1SMartin Storsjö     Symbol *s = make<Symbol>();
1153a9ff1ce1SMartin Storsjö     s->dllName = dllName;
1154a9ff1ce1SMartin Storsjö     s->symbolName = symbolName;
1155a9ff1ce1SMartin Storsjö     s->importType = code ? ImportType::IMPORT_CODE : ImportType::IMPORT_DATA;
1156a9ff1ce1SMartin Storsjö     s->nameType = ImportNameType::IMPORT_NAME;
1157a9ff1ce1SMartin Storsjö 
1158a9ff1ce1SMartin Storsjö     if (coffObj->getMachine() == I386) {
1159*83d59e05SAlexandre Ganea       s->symbolName = symbolName = saver().save("_" + symbolName);
1160a9ff1ce1SMartin Storsjö       s->nameType = ImportNameType::IMPORT_NAME_NOPREFIX;
1161a9ff1ce1SMartin Storsjö     }
1162a9ff1ce1SMartin Storsjö 
1163*83d59e05SAlexandre Ganea     StringRef impName = saver().save("__imp_" + symbolName);
11646f7483b1SAmy Huang     ctx.symtab.addLazyDLLSymbol(this, s, impName);
1165a9ff1ce1SMartin Storsjö     if (code)
11666f7483b1SAmy Huang       ctx.symtab.addLazyDLLSymbol(this, s, symbolName);
1167a9ff1ce1SMartin Storsjö   }
1168a9ff1ce1SMartin Storsjö }
1169a9ff1ce1SMartin Storsjö 
getMachineType()1170a9ff1ce1SMartin Storsjö MachineTypes DLLFile::getMachineType() {
1171a9ff1ce1SMartin Storsjö   if (coffObj)
1172a9ff1ce1SMartin Storsjö     return static_cast<MachineTypes>(coffObj->getMachine());
1173a9ff1ce1SMartin Storsjö   return IMAGE_FILE_MACHINE_UNKNOWN;
1174a9ff1ce1SMartin Storsjö }
1175a9ff1ce1SMartin Storsjö 
makeImport(DLLFile::Symbol * s)1176a9ff1ce1SMartin Storsjö void DLLFile::makeImport(DLLFile::Symbol *s) {
1177a9ff1ce1SMartin Storsjö   if (!seen.insert(s->symbolName).second)
1178a9ff1ce1SMartin Storsjö     return;
1179a9ff1ce1SMartin Storsjö 
1180a9ff1ce1SMartin Storsjö   size_t impSize = s->dllName.size() + s->symbolName.size() + 2; // +2 for NULs
1181a9ff1ce1SMartin Storsjö   size_t size = sizeof(coff_import_header) + impSize;
1182*83d59e05SAlexandre Ganea   char *buf = bAlloc().Allocate<char>(size);
1183a9ff1ce1SMartin Storsjö   memset(buf, 0, size);
1184a9ff1ce1SMartin Storsjö   char *p = buf;
1185a9ff1ce1SMartin Storsjö   auto *imp = reinterpret_cast<coff_import_header *>(p);
1186a9ff1ce1SMartin Storsjö   p += sizeof(*imp);
1187a9ff1ce1SMartin Storsjö   imp->Sig2 = 0xFFFF;
1188a9ff1ce1SMartin Storsjö   imp->Machine = coffObj->getMachine();
1189a9ff1ce1SMartin Storsjö   imp->SizeOfData = impSize;
1190a9ff1ce1SMartin Storsjö   imp->OrdinalHint = 0; // Only linking by name
1191a9ff1ce1SMartin Storsjö   imp->TypeInfo = (s->nameType << 2) | s->importType;
1192a9ff1ce1SMartin Storsjö 
1193a9ff1ce1SMartin Storsjö   // Write symbol name and DLL name.
1194a9ff1ce1SMartin Storsjö   memcpy(p, s->symbolName.data(), s->symbolName.size());
1195a9ff1ce1SMartin Storsjö   p += s->symbolName.size() + 1;
1196a9ff1ce1SMartin Storsjö   memcpy(p, s->dllName.data(), s->dllName.size());
1197a9ff1ce1SMartin Storsjö   MemoryBufferRef mbref = MemoryBufferRef(StringRef(buf, size), s->dllName);
11986f7483b1SAmy Huang   ImportFile *impFile = make<ImportFile>(ctx, mbref);
11996f7483b1SAmy Huang   ctx.symtab.addFile(impFile);
1200a9ff1ce1SMartin Storsjö }
1201