Re-commit r225674: Convert other drivers to use WrapperNode.
The original commit had an issue with Mac OS dylib files. It didn't
handle fat binary dylib files correctly. This patch includes a fix.
A test for that case has already been committed in r225764.
llvm-svn: 226123
diff --git a/lld/lib/ReaderWriter/ELF/ELFReader.h b/lld/lib/ReaderWriter/ELF/ELFReader.h
index 881cd40..08aa717 100644
--- a/lld/lib/ReaderWriter/ELF/ELFReader.h
+++ b/lld/lib/ReaderWriter/ELF/ELFReader.h
@@ -33,8 +33,8 @@
}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+ std::vector<std::unique_ptr<File>> &result) const override {
std::size_t maxAlignment =
1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
auto f =
@@ -72,8 +72,8 @@
}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+ std::vector<std::unique_ptr<File>> &result) const override {
std::size_t maxAlignment =
1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
auto f =
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h b/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
index aeb424d..95643bc 100644
--- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
+++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
@@ -49,12 +49,12 @@
_flagMerger(flagMerger) {}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
+ std::vector<std::unique_ptr<File>> &result) const override {
auto &hdr = *elfHeader(*mb);
if (std::error_code ec = _flagMerger.merge(hdr.getFileClass(), hdr.e_flags))
return ec;
- return BaseReaderType::parseFile(std::move(mb), registry, result);
+ return BaseReaderType::loadFile(std::move(mb), registry, result);
}
private:
@@ -72,12 +72,12 @@
_flagMerger(flagMerger) {}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
+ std::vector<std::unique_ptr<File>> &result) const override {
auto &hdr = *elfHeader(*mb);
if (std::error_code ec = _flagMerger.merge(hdr.getFileClass(), hdr.e_flags))
return ec;
- return BaseReaderType::parseFile(std::move(mb), registry, result);
+ return BaseReaderType::loadFile(std::move(mb), registry, result);
}
private:
diff --git a/lld/lib/ReaderWriter/FileArchive.cpp b/lld/lib/ReaderWriter/FileArchive.cpp
index 5080c2a..a344fdf 100644
--- a/lld/lib/ReaderWriter/FileArchive.cpp
+++ b/lld/lib/ReaderWriter/FileArchive.cpp
@@ -67,7 +67,9 @@
/// \brief parse each member
std::error_code
- parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
+ parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
+ if (std::error_code ec = parse())
+ return ec;
for (auto mf = _archive->child_begin(), me = _archive->child_end();
mf != me; ++mf) {
std::unique_ptr<File> file;
@@ -152,9 +154,12 @@
mb.getBuffer(), memberPath, false));
std::vector<std::unique_ptr<File>> files;
- _registry.parseFile(std::move(memberMB), files);
+ if (std::error_code ec = _registry.loadFile(std::move(memberMB), files))
+ return ec;
assert(files.size() == 1);
result = std::move(files[0]);
+ if (std::error_code ec = result->parse())
+ return ec;
// The memory buffer is co-owned by the archive file and the children,
// so that the bufffer is deallocated when all the members are destructed.
@@ -232,8 +237,8 @@
}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®,
+ std::vector<std::unique_ptr<File>> &result) const override {
StringRef path = mb->getBufferIdentifier();
std::unique_ptr<FileArchive> file(
new FileArchive(std::move(mb), reg, path, _logLoading));
diff --git a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
index ba2df6c..df0414d 100644
--- a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
+++ b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
@@ -91,7 +91,7 @@
}
std::error_code
- parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
+ parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
return std::error_code();
}
diff --git a/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp b/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
index 9e372d0..c9afbc6 100644
--- a/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
+++ b/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
@@ -12,8 +12,9 @@
#include "File.h"
#include "MachONormalizedFile.h"
#include "MachOPasses.h"
+#include "lld/Core/ArchiveLibraryFile.h"
#include "lld/Core/PassManager.h"
-#include "lld/Driver/DarwinInputGraph.h"
+#include "lld/Driver/Driver.h"
#include "lld/Passes/LayoutPass.h"
#include "lld/Passes/RoundTripYAMLPass.h"
#include "lld/ReaderWriter/Reader.h"
@@ -605,20 +606,19 @@
}
MachODylibFile* MachOLinkingContext::loadIndirectDylib(StringRef path) {
- std::unique_ptr<MachOFileNode> node(new MachOFileNode(path, *this));
- std::error_code ec = node->parse(*this, llvm::errs());
- if (ec)
+ ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr =
+ DarwinLdDriver::getMemoryBuffer(*this, path);
+ if (mbOrErr.getError())
return nullptr;
- assert(node->files().size() == 1 && "expected one file in dylib");
- // lld::File object is owned by MachOFileNode object. This method returns
- // an unowned pointer to the lld::File object.
- MachODylibFile* result = reinterpret_cast<MachODylibFile*>(
- node->files().front().get());
-
+ std::vector<std::unique_ptr<File>> files;
+ if (registry().loadFile(std::move(mbOrErr.get()), files))
+ return nullptr;
+ assert(files.size() == 1 && "expected one file in dylib");
+ files[0]->parse();
+ MachODylibFile* result = reinterpret_cast<MachODylibFile*>(files[0].get());
// Node object now owned by _indirectDylibs vector.
- _indirectDylibs.push_back(std::move(node));
-
+ _indirectDylibs.push_back(std::move(files[0]));
return result;
}
diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
index 84bf400..052b64e 100644
--- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
+++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
@@ -527,8 +527,8 @@
}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
+ std::vector<std::unique_ptr<File>> &result) const override {
auto *file = new MachOFile(std::move(mb), &_ctx);
result.push_back(std::unique_ptr<MachOFile>(file));
return std::error_code();
@@ -554,8 +554,8 @@
}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
+ std::vector<std::unique_ptr<File>> &result) const override {
auto *file = new MachODylibFile(std::move(mb), &_ctx);
result.push_back(std::unique_ptr<MachODylibFile>(file));
return std::error_code();
@@ -580,4 +580,3 @@
} // namespace lld
-
diff --git a/lld/lib/ReaderWriter/Native/ReaderNative.cpp b/lld/lib/ReaderWriter/Native/ReaderNative.cpp
index c6932e6..c73ac2b 100644
--- a/lld/lib/ReaderWriter/Native/ReaderNative.cpp
+++ b/lld/lib/ReaderWriter/Native/ReaderNative.cpp
@@ -999,8 +999,8 @@
}
virtual std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+ std::vector<std::unique_ptr<File>> &result) const override {
auto *file = new lld::native::File(std::move(mb));
result.push_back(std::unique_ptr<File>(file));
return std::error_code();
diff --git a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
index be1d843..994858f 100644
--- a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
+++ b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
@@ -88,7 +88,7 @@
}
std::error_code
- parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
+ parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
return std::error_code();
}
diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
index 574badc..adcee29 100644
--- a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
@@ -1077,8 +1077,8 @@
}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &,
+ std::vector<std::unique_ptr<File>> &result) const override {
// Parse the memory buffer as PECOFF file.
auto *file = new FileCOFF(std::move(mb), _ctx);
result.push_back(std::unique_ptr<File>(file));
diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
index dc158cd..85812d5 100644
--- a/lld/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
@@ -354,7 +354,7 @@
class COFFImportLibraryReader : public Reader {
public:
- COFFImportLibraryReader(MachineTypes machine) : _machine(machine) {}
+ COFFImportLibraryReader(PECOFFLinkingContext &ctx) : _ctx(ctx) {}
bool canParse(file_magic magic, StringRef,
const MemoryBuffer &mb) const override {
@@ -364,22 +364,21 @@
}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File> > &result) const override {
- auto *file = new FileImportLibrary(std::move(mb), _machine);
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+ std::vector<std::unique_ptr<File> > &result) const override {
+ auto *file = new FileImportLibrary(std::move(mb), _ctx.getMachineType());
result.push_back(std::unique_ptr<File>(file));
return std::error_code();
}
private:
- MachineTypes _machine;
+ PECOFFLinkingContext &_ctx;
};
} // end anonymous namespace
void Registry::addSupportCOFFImportLibraries(PECOFFLinkingContext &ctx) {
- MachineTypes machine = ctx.getMachineType();
- add(llvm::make_unique<COFFImportLibraryReader>(machine));
+ add(llvm::make_unique<COFFImportLibraryReader>(ctx));
}
} // end namespace lld
diff --git a/lld/lib/ReaderWriter/Reader.cpp b/lld/lib/ReaderWriter/Reader.cpp
index 8cbaae1..616f475 100644
--- a/lld/lib/ReaderWriter/Reader.cpp
+++ b/lld/lib/ReaderWriter/Reader.cpp
@@ -30,8 +30,8 @@
}
std::error_code
-Registry::parseFile(std::unique_ptr<MemoryBuffer> mb,
- std::vector<std::unique_ptr<File>> &result) const {
+Registry::loadFile(std::unique_ptr<MemoryBuffer> mb,
+ std::vector<std::unique_ptr<File>> &result) const {
// Get file type.
StringRef content(mb->getBufferStart(), mb->getBufferSize());
llvm::sys::fs::file_magic fileType = llvm::sys::fs::identify_magic(content);
@@ -42,11 +42,8 @@
for (const std::unique_ptr<Reader> &reader : _readers) {
if (!reader->canParse(fileType, extension, *mb))
continue;
- if (std::error_code ec = reader->parseFile(std::move(mb), *this, result))
+ if (std::error_code ec = reader->loadFile(std::move(mb), *this, result))
return ec;
- for (std::unique_ptr<File> &file : result)
- if (std::error_code ec = file->parse())
- return ec;
return std::error_code();
}
diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
index 628f8d3..faa5614 100644
--- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
+++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
@@ -648,7 +648,7 @@
}
virtual std::error_code
- parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
+ parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
return std::error_code();
}
@@ -1325,8 +1325,8 @@
}
std::error_code
- parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
+ loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+ std::vector<std::unique_ptr<File>> &result) const override {
// Create YAML Input Reader.
YamlContext yamlContext;
yamlContext._registry = &_registry;
@@ -1343,7 +1343,7 @@
std::shared_ptr<MemoryBuffer> smb(mb.release());
for (const File *file : createdFiles) {
- // Note: parseFile() should return vector of *const* File
+ // Note: loadFile() should return vector of *const* File
File *f = const_cast<File *>(file);
f->setLastError(std::error_code());
f->setSharedMemoryBuffer(smb);