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(<oTextSection.section);
1033728cc007SMartin Storsjö FakeSectionChunk ltoDataSectionChunk(<oDataSection.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 = <oTextSectionChunk.chunk;
105033b71ec9SMartin Storsjö else
1051728cc007SMartin Storsjö fakeSC = <oDataSectionChunk.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