[LLD][COFF] Create COFFObjectFile instance when constructing ObjFile (NFC) (#120144)
This change moves the creation of COFFObjectFile to the construction of ObjFile, instead of delaying it until parsing.
This commit is contained in:
parent
659dbb6329
commit
9c8214ff31
@ -229,7 +229,7 @@ void LinkerDriver::addBuffer(std::unique_ptr<MemoryBuffer> mb,
|
||||
break;
|
||||
case file_magic::coff_object:
|
||||
case file_magic::coff_import_library:
|
||||
ctx.symtab.addFile(make<ObjFile>(ctx, mbref, lazy));
|
||||
ctx.symtab.addFile(ObjFile::create(ctx, mbref, lazy));
|
||||
break;
|
||||
case file_magic::pdb:
|
||||
ctx.symtab.addFile(make<PDBInputFile>(ctx, mbref));
|
||||
@ -312,7 +312,7 @@ void LinkerDriver::addArchiveBuffer(MemoryBufferRef mb, StringRef symName,
|
||||
|
||||
InputFile *obj;
|
||||
if (magic == file_magic::coff_object) {
|
||||
obj = make<ObjFile>(ctx, mb);
|
||||
obj = ObjFile::create(ctx, mb);
|
||||
} else if (magic == file_magic::bitcode) {
|
||||
obj =
|
||||
make<BitcodeFile>(ctx, mb, parentName, offsetInArchive, /*lazy=*/false);
|
||||
@ -1389,7 +1389,7 @@ void LinkerDriver::convertResources() {
|
||||
return;
|
||||
}
|
||||
ObjFile *f =
|
||||
make<ObjFile>(ctx, convertResToCOFF(resources, resourceObjFiles));
|
||||
ObjFile::create(ctx, convertResToCOFF(resources, resourceObjFiles));
|
||||
ctx.symtab.addFile(f);
|
||||
f->includeResourceChunks();
|
||||
}
|
||||
|
@ -162,13 +162,26 @@ lld::coff::getArchiveMembers(COFFLinkerContext &ctx, Archive *file) {
|
||||
return v;
|
||||
}
|
||||
|
||||
ObjFile::ObjFile(COFFLinkerContext &ctx, MemoryBufferRef m, bool lazy)
|
||||
: InputFile(ctx.symtab, ObjectKind, m, lazy) {}
|
||||
ObjFile::ObjFile(SymbolTable &symtab, COFFObjectFile *coffObj, bool lazy)
|
||||
: InputFile(symtab, ObjectKind, coffObj->getMemoryBufferRef(), lazy),
|
||||
coffObj(coffObj) {}
|
||||
|
||||
ObjFile *ObjFile::create(COFFLinkerContext &ctx, MemoryBufferRef m, bool lazy) {
|
||||
// Parse a memory buffer as a COFF file.
|
||||
Expected<std::unique_ptr<Binary>> bin = createBinary(m);
|
||||
if (!bin)
|
||||
Fatal(ctx) << "Could not parse " << m.getBufferIdentifier();
|
||||
|
||||
auto *obj = dyn_cast<COFFObjectFile>(bin->get());
|
||||
if (!obj)
|
||||
Fatal(ctx) << m.getBufferIdentifier() << " is not a COFF file";
|
||||
|
||||
bin->release();
|
||||
return make<ObjFile>(ctx.symtab, obj, lazy);
|
||||
}
|
||||
|
||||
void ObjFile::parseLazy() {
|
||||
// Native object file.
|
||||
std::unique_ptr<Binary> coffObjPtr = CHECK(createBinary(mb), this);
|
||||
COFFObjectFile *coffObj = cast<COFFObjectFile>(coffObjPtr.get());
|
||||
uint32_t numSymbols = coffObj->getNumberOfSymbols();
|
||||
for (uint32_t i = 0; i < numSymbols; ++i) {
|
||||
COFFSymbolRef coffSym = check(coffObj->getSymbol(i));
|
||||
@ -219,16 +232,6 @@ void ObjFile::initializeECThunks() {
|
||||
}
|
||||
|
||||
void ObjFile::parse() {
|
||||
// Parse a memory buffer as a COFF file.
|
||||
std::unique_ptr<Binary> bin = CHECK(createBinary(mb), this);
|
||||
|
||||
if (auto *obj = dyn_cast<COFFObjectFile>(bin.get())) {
|
||||
bin.release();
|
||||
coffObj.reset(obj);
|
||||
} else {
|
||||
Fatal(symtab.ctx) << toString(this) << " is not a COFF file";
|
||||
}
|
||||
|
||||
// Read section and symbol tables.
|
||||
initializeChunks();
|
||||
initializeSymbols();
|
||||
@ -807,9 +810,7 @@ std::optional<Symbol *> ObjFile::createDefined(
|
||||
}
|
||||
|
||||
MachineTypes ObjFile::getMachineType() const {
|
||||
if (coffObj)
|
||||
return static_cast<MachineTypes>(coffObj->getMachine());
|
||||
return IMAGE_FILE_MACHINE_UNKNOWN;
|
||||
return static_cast<MachineTypes>(coffObj->getMachine());
|
||||
}
|
||||
|
||||
ArrayRef<uint8_t> ObjFile::getDebugSection(StringRef secName) {
|
||||
|
@ -136,8 +136,10 @@ private:
|
||||
// .obj or .o file. This may be a member of an archive file.
|
||||
class ObjFile : public InputFile {
|
||||
public:
|
||||
explicit ObjFile(COFFLinkerContext &ctx, MemoryBufferRef m,
|
||||
bool lazy = false);
|
||||
static ObjFile *create(COFFLinkerContext &ctx, MemoryBufferRef mb,
|
||||
bool lazy = false);
|
||||
explicit ObjFile(SymbolTable &symtab, COFFObjectFile *coffObj, bool lazy);
|
||||
|
||||
static bool classof(const InputFile *f) { return f->kind() == ObjectKind; }
|
||||
void parse() override;
|
||||
void parseLazy();
|
||||
|
@ -259,7 +259,7 @@ std::vector<InputFile *> BitcodeCompiler::compile() {
|
||||
if (llvm::is_contained(ctx.config.saveTempsArgs, "prelink") || emitASM)
|
||||
saveBuffer(buf[i].second, ltoObjName);
|
||||
if (!emitASM)
|
||||
ret.push_back(make<ObjFile>(ctx, MemoryBufferRef(objBuf, ltoObjName)));
|
||||
ret.push_back(ObjFile::create(ctx, MemoryBufferRef(objBuf, ltoObjName)));
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
Loading…
x
Reference in New Issue
Block a user