Skip to content

Commit d496abb

Browse files
committed
[lld-link] Replace LazyObjFile with lazy ObjFile/BitcodeFile
Similar to ELF 3a5fb57. * previously when a LazyObjFile was extracted, a new ObjFile/BitcodeFile was created; now the file is reused, just with `lazy` cleared * avoid the confusing transfer of `symbols` from LazyObjFile to the new file * simpler code, smaller executable (5200+ bytes smaller on x86-64) * make eager parsing feasible (for parallel section/symbol table initialization) Reviewed By: aganea, rnk Differential Revision: https://reviews.llvm.org/D116434
1 parent 1e1e97a commit d496abb

File tree

6 files changed

+52
-85
lines changed

6 files changed

+52
-85
lines changed

lld/COFF/Driver.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,11 @@ void LinkerDriver::addBuffer(std::unique_ptr<MemoryBuffer> mb,
208208
ctx.symtab.addFile(make<ArchiveFile>(ctx, mbref));
209209
break;
210210
case file_magic::bitcode:
211-
if (lazy)
212-
ctx.symtab.addFile(make<LazyObjFile>(ctx, mbref));
213-
else
214-
ctx.symtab.addFile(make<BitcodeFile>(ctx, mbref, "", 0));
211+
ctx.symtab.addFile(make<BitcodeFile>(ctx, mbref, "", 0, lazy));
215212
break;
216213
case file_magic::coff_object:
217214
case file_magic::coff_import_library:
218-
if (lazy)
219-
ctx.symtab.addFile(make<LazyObjFile>(ctx, mbref));
220-
else
221-
ctx.symtab.addFile(make<ObjFile>(ctx, mbref));
215+
ctx.symtab.addFile(make<ObjFile>(ctx, mbref, lazy));
222216
break;
223217
case file_magic::pdb:
224218
ctx.symtab.addFile(make<PDBInputFile>(ctx, mbref));
@@ -282,7 +276,8 @@ void LinkerDriver::addArchiveBuffer(MemoryBufferRef mb, StringRef symName,
282276
if (magic == file_magic::coff_object) {
283277
obj = make<ObjFile>(ctx, mb);
284278
} else if (magic == file_magic::bitcode) {
285-
obj = make<BitcodeFile>(ctx, mb, parentName, offsetInArchive);
279+
obj =
280+
make<BitcodeFile>(ctx, mb, parentName, offsetInArchive, /*lazy=*/false);
286281
} else {
287282
error("unknown file type: " + mb.getBufferIdentifier());
288283
return;

lld/COFF/InputFiles.cpp

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -135,31 +135,7 @@ std::vector<MemoryBufferRef> lld::coff::getArchiveMembers(Archive *file) {
135135
return v;
136136
}
137137

138-
void LazyObjFile::fetch() {
139-
if (mb.getBuffer().empty())
140-
return;
141-
142-
InputFile *file;
143-
if (isBitcode(mb))
144-
file = make<BitcodeFile>(ctx, mb, "", 0, std::move(symbols));
145-
else
146-
file = make<ObjFile>(ctx, mb, std::move(symbols));
147-
mb = {};
148-
ctx.symtab.addFile(file);
149-
}
150-
151-
void LazyObjFile::parse() {
152-
if (isBitcode(this->mb)) {
153-
// Bitcode file.
154-
std::unique_ptr<lto::InputFile> obj =
155-
CHECK(lto::InputFile::create(this->mb), this);
156-
for (const lto::InputFile::Symbol &sym : obj->symbols()) {
157-
if (!sym.isUndefined())
158-
ctx.symtab.addLazyObject(this, sym.getName());
159-
}
160-
return;
161-
}
162-
138+
void ObjFile::parseLazy() {
163139
// Native object file.
164140
std::unique_ptr<Binary> coffObjPtr = CHECK(createBinary(mb), this);
165141
COFFObjectFile *coffObj = cast<COFFObjectFile>(coffObjPtr.get());
@@ -1005,14 +981,10 @@ void ImportFile::parse() {
1005981
name, cast_or_null<DefinedImportData>(impSym), hdr->Machine);
1006982
}
1007983

1008-
BitcodeFile::BitcodeFile(COFFLinkerContext &ctx, MemoryBufferRef mb,
1009-
StringRef archiveName, uint64_t offsetInArchive)
1010-
: BitcodeFile(ctx, mb, archiveName, offsetInArchive, {}) {}
1011-
1012984
BitcodeFile::BitcodeFile(COFFLinkerContext &ctx, MemoryBufferRef mb,
1013985
StringRef archiveName, uint64_t offsetInArchive,
1014-
std::vector<Symbol *> &&symbols)
1015-
: InputFile(ctx, BitcodeKind, mb), symbols(std::move(symbols)) {
986+
bool lazy)
987+
: InputFile(ctx, BitcodeKind, mb, lazy) {
1016988
std::string path = mb.getBufferIdentifier().str();
1017989
if (config->thinLTOIndexOnly)
1018990
path = replaceThinLTOSuffix(mb.getBufferIdentifier());
@@ -1107,6 +1079,13 @@ void BitcodeFile::parse() {
11071079
directives = obj->getCOFFLinkerOpts();
11081080
}
11091081

1082+
void BitcodeFile::parseLazy() {
1083+
std::unique_ptr<lto::InputFile> obj = CHECK(lto::InputFile::create(mb), this);
1084+
for (const lto::InputFile::Symbol &sym : obj->symbols())
1085+
if (!sym.isUndefined())
1086+
ctx.symtab.addLazyObject(this, sym.getName());
1087+
}
1088+
11101089
MachineTypes BitcodeFile::getMachineType() {
11111090
switch (Triple(obj->getTargetTriple()).getArch()) {
11121091
case Triple::x86_64:

lld/COFF/InputFiles.h

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,17 @@ class InputFile {
9595
COFFLinkerContext &ctx;
9696

9797
protected:
98-
InputFile(COFFLinkerContext &c, Kind k, MemoryBufferRef m)
99-
: mb(m), ctx(c), fileKind(k) {}
98+
InputFile(COFFLinkerContext &c, Kind k, MemoryBufferRef m, bool lazy = false)
99+
: mb(m), ctx(c), fileKind(k), lazy(lazy) {}
100100

101101
StringRef directives;
102102

103103
private:
104104
const Kind fileKind;
105+
106+
public:
107+
// True if this is a lazy ObjFile or BitcodeFile.
108+
bool lazy = false;
105109
};
106110

107111
// .lib or .a file.
@@ -121,33 +125,14 @@ class ArchiveFile : public InputFile {
121125
llvm::DenseSet<uint64_t> seen;
122126
};
123127

124-
// .obj or .o file between -start-lib and -end-lib.
125-
class LazyObjFile : public InputFile {
126-
public:
127-
explicit LazyObjFile(COFFLinkerContext &ctx, MemoryBufferRef m)
128-
: InputFile(ctx, LazyObjectKind, m) {}
129-
static bool classof(const InputFile *f) {
130-
return f->kind() == LazyObjectKind;
131-
}
132-
// Makes this object file part of the link.
133-
void fetch();
134-
// Adds the symbols in this file to the symbol table as LazyObject symbols.
135-
void parse() override;
136-
137-
private:
138-
std::vector<Symbol *> symbols;
139-
};
140-
141128
// .obj or .o file. This may be a member of an archive file.
142129
class ObjFile : public InputFile {
143130
public:
144-
explicit ObjFile(COFFLinkerContext &ctx, MemoryBufferRef m)
145-
: InputFile(ctx, ObjectKind, m) {}
146-
explicit ObjFile(COFFLinkerContext &ctx, MemoryBufferRef m,
147-
std::vector<Symbol *> &&symbols)
148-
: InputFile(ctx, ObjectKind, m), symbols(std::move(symbols)) {}
131+
explicit ObjFile(COFFLinkerContext &ctx, MemoryBufferRef m, bool lazy = false)
132+
: InputFile(ctx, ObjectKind, m, lazy) {}
149133
static bool classof(const InputFile *f) { return f->kind() == ObjectKind; }
150134
void parse() override;
135+
void parseLazy();
151136
MachineTypes getMachineType() override;
152137
ArrayRef<Chunk *> getChunks() { return chunks; }
153138
ArrayRef<SectionChunk *> getDebugChunks() { return debugChunks; }
@@ -380,15 +365,14 @@ class ImportFile : public InputFile {
380365
// Used for LTO.
381366
class BitcodeFile : public InputFile {
382367
public:
383-
BitcodeFile(COFFLinkerContext &ctx, MemoryBufferRef mb, StringRef archiveName,
384-
uint64_t offsetInArchive);
385-
explicit BitcodeFile(COFFLinkerContext &ctx, MemoryBufferRef m,
368+
explicit BitcodeFile(COFFLinkerContext &ctx, MemoryBufferRef mb,
386369
StringRef archiveName, uint64_t offsetInArchive,
387-
std::vector<Symbol *> &&symbols);
370+
bool lazy);
388371
~BitcodeFile();
389372
static bool classof(const InputFile *f) { return f->kind() == BitcodeKind; }
390373
ArrayRef<Symbol *> getSymbols() { return symbols; }
391374
MachineTypes getMachineType() override;
375+
void parseLazy();
392376
std::unique_ptr<llvm::lto::InputFile> obj;
393377

394378
private:

lld/COFF/SymbolTable.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,21 @@ StringRef ltrim1(StringRef s, const char *chars) {
3737

3838
void SymbolTable::addFile(InputFile *file) {
3939
log("Reading " + toString(file));
40-
file->parse();
40+
if (file->lazy) {
41+
if (auto *f = dyn_cast<BitcodeFile>(file))
42+
f->parseLazy();
43+
else
44+
cast<ObjFile>(file)->parseLazy();
45+
} else {
46+
file->parse();
47+
if (auto *f = dyn_cast<ObjFile>(file)) {
48+
ctx.objFileInstances.push_back(f);
49+
} else if (auto *f = dyn_cast<BitcodeFile>(file)) {
50+
ctx.bitcodeFileInstances.push_back(f);
51+
} else if (auto *f = dyn_cast<ImportFile>(file)) {
52+
ctx.importFileInstances.push_back(f);
53+
}
54+
}
4155

4256
MachineTypes mt = file->getMachineType();
4357
if (config->machine == IMAGE_FILE_MACHINE_UNKNOWN) {
@@ -48,14 +62,6 @@ void SymbolTable::addFile(InputFile *file) {
4862
return;
4963
}
5064

51-
if (auto *f = dyn_cast<ObjFile>(file)) {
52-
ctx.objFileInstances.push_back(f);
53-
} else if (auto *f = dyn_cast<BitcodeFile>(file)) {
54-
ctx.bitcodeFileInstances.push_back(f);
55-
} else if (auto *f = dyn_cast<ImportFile>(file)) {
56-
ctx.importFileInstances.push_back(f);
57-
}
58-
5965
driver->parseDirectives(file);
6066
}
6167

@@ -75,9 +81,11 @@ static void forceLazy(Symbol *s) {
7581
l->file->addMember(l->sym);
7682
break;
7783
}
78-
case Symbol::Kind::LazyObjectKind:
79-
cast<LazyObject>(s)->file->fetch();
84+
case Symbol::Kind::LazyObjectKind: {
85+
InputFile *file = cast<LazyObject>(s)->file;
86+
file->ctx.symtab.addFile(file);
8087
break;
88+
}
8189
case Symbol::Kind::LazyDLLSymbolKind: {
8290
auto *l = cast<LazyDLLSymbol>(s);
8391
l->file->makeImport(l->sym);
@@ -562,7 +570,8 @@ void SymbolTable::addLazyArchive(ArchiveFile *f, const Archive::Symbol &sym) {
562570
f->addMember(sym);
563571
}
564572

565-
void SymbolTable::addLazyObject(LazyObjFile *f, StringRef n) {
573+
void SymbolTable::addLazyObject(InputFile *f, StringRef n) {
574+
assert(f->lazy);
566575
Symbol *s;
567576
bool wasInserted;
568577
std::tie(s, wasInserted) = insert(n, f);
@@ -574,7 +583,8 @@ void SymbolTable::addLazyObject(LazyObjFile *f, StringRef n) {
574583
if (!u || u->weakAlias || s->pendingArchiveLoad)
575584
return;
576585
s->pendingArchiveLoad = true;
577-
f->fetch();
586+
f->lazy = false;
587+
addFile(f);
578588
}
579589

580590
void SymbolTable::addLazyDLLSymbol(DLLFile *f, DLLFile::Symbol *sym,

lld/COFF/SymbolTable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class SymbolTable {
9191

9292
Symbol *addUndefined(StringRef name, InputFile *f, bool isWeakAlias);
9393
void addLazyArchive(ArchiveFile *f, const Archive::Symbol &sym);
94-
void addLazyObject(LazyObjFile *f, StringRef n);
94+
void addLazyObject(InputFile *f, StringRef n);
9595
void addLazyDLLSymbol(DLLFile *f, DLLFile::Symbol *sym, StringRef n);
9696
Symbol *addAbsolute(StringRef n, COFFSymbolRef s);
9797
Symbol *addRegular(InputFile *f, StringRef n,

lld/COFF/Symbols.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,9 @@ class LazyArchive : public Symbol {
305305

306306
class LazyObject : public Symbol {
307307
public:
308-
LazyObject(LazyObjFile *f, StringRef n)
309-
: Symbol(LazyObjectKind, n), file(f) {}
308+
LazyObject(InputFile *f, StringRef n) : Symbol(LazyObjectKind, n), file(f) {}
310309
static bool classof(const Symbol *s) { return s->kind() == LazyObjectKind; }
311-
LazyObjFile *file;
310+
InputFile *file;
312311
};
313312

314313
// MinGW only.

0 commit comments

Comments
 (0)