diff options
Diffstat (limited to 'lld/tools')
-rw-r--r-- | lld/tools/lld-core/TestingHelpers.hpp | 55 | ||||
-rw-r--r-- | lld/tools/lld-core/lld-core.cpp | 87 |
2 files changed, 38 insertions, 104 deletions
diff --git a/lld/tools/lld-core/TestingHelpers.hpp b/lld/tools/lld-core/TestingHelpers.hpp index 4c82630a55e..68e7c3a534f 100644 --- a/lld/tools/lld-core/TestingHelpers.hpp +++ b/lld/tools/lld-core/TestingHelpers.hpp @@ -14,7 +14,7 @@ #include "lld/Core/LLVM.h" #include "lld/Core/Pass.h" #include "lld/Core/Resolver.h" -#include "lld/ReaderWriter/WriterYAML.h" +#include "lld/ReaderWriter/Writer.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/Support/CommandLine.h" @@ -246,7 +246,7 @@ private: struct TestingKindMapping { const char *string; - Reference::Kind value; + int32_t value; bool isBranch; bool isGotLoad; bool isGotUse; @@ -270,7 +270,7 @@ public: return true; } - virtual bool isCallSite(Reference::Kind kind) { + virtual bool isCallSite(int32_t kind) { for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) { if (kind == p->value) return p->isBranch; @@ -300,7 +300,7 @@ public: return true; } - virtual bool isGOTAccess(Reference::Kind kind, bool &canBypassGOT) { + virtual bool isGOTAccess(int32_t kind, bool &canBypassGOT) { for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) { if (kind == p->value) { canBypassGOT = p->isGotLoad; @@ -325,51 +325,4 @@ private: TestingPassFile _file; }; -class TestingWriterOptionsYAML : public lld::WriterOptionsYAML { -public: - TestingWriterOptionsYAML(bool stubs, bool got) - : _doStubs(stubs), _doGOT(got) { - } - - virtual StubsPass *stubPass() const { - if (_doStubs) - return const_cast<TestingStubsPass*>(&_stubsPass); - else - return nullptr; - } - - virtual GOTPass *gotPass() const { - if (_doGOT) - return const_cast<TestingGOTPass*>(&_gotPass); - else - return nullptr; - } - - virtual StringRef kindToString(Reference::Kind value) const { - for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) { - if (value == p->value) - return p->string; - } - return StringRef("???"); - } -private: - bool _doStubs; - bool _doGOT; - TestingStubsPass _stubsPass; - TestingGOTPass _gotPass; -}; - -class TestingReaderOptionsYAML : public lld::ReaderOptionsYAML { - virtual Reference::Kind kindFromString(StringRef kindName) const { - for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) { - if (kindName.equals(p->string)) - return p->value; - } - int k; - if (kindName.getAsInteger(0, k)) - k = 0; - return k; - } -}; - #endif // LLD_TOOLS_TESTING_HELPERS_H_ diff --git a/lld/tools/lld-core/lld-core.cpp b/lld/tools/lld-core/lld-core.cpp index d50b9fcf6fa..11431b0e9a5 100644 --- a/lld/tools/lld-core/lld-core.cpp +++ b/lld/tools/lld-core/lld-core.cpp @@ -12,22 +12,15 @@ #include "lld/Core/LLVM.h" #include "lld/Core/Pass.h" #include "lld/Core/Resolver.h" -#include "lld/Core/TargetInfo.h" +#include "lld/ReaderWriter/ELFTargetInfo.h" +#include "lld/ReaderWriter/MachOTargetInfo.h" #include "lld/ReaderWriter/Reader.h" #include "lld/ReaderWriter/ReaderArchive.h" -#include "lld/ReaderWriter/ReaderNative.h" -#include "lld/ReaderWriter/ReaderYAML.h" -#include "lld/ReaderWriter/ReaderELF.h" -#include "lld/ReaderWriter/ReaderPECOFF.h" -#include "lld/ReaderWriter/ReaderMachO.h" #include "lld/ReaderWriter/Writer.h" -#include "lld/ReaderWriter/WriterELF.h" -#include "lld/ReaderWriter/WriterMachO.h" -#include "lld/ReaderWriter/WriterNative.h" -#include "lld/ReaderWriter/WriterPECOFF.h" -#include "lld/ReaderWriter/WriterYAML.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/Triple.h" +#include "llvm/Support/ELF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" @@ -107,7 +100,8 @@ writeSelected("writer", clEnumValN(writeMachO, "mach-o", "link as darwin would"), clEnumValN(writePECOFF, "PECOFF", "link as windows would"), clEnumValN(writeELF, "ELF", "link as linux would"), - clEnumValEnd)); + clEnumValEnd), + llvm::cl::init(writeYAML)); enum ReaderChoice { readerYAML, readerMachO, readerPECOFF, readerELF @@ -120,7 +114,8 @@ readerSelected("reader", clEnumValN(readerMachO, "mach-o", "read as darwin would"), clEnumValN(readerPECOFF, "PECOFF", "read as windows would"), clEnumValN(readerELF, "ELF", "read as linux would"), - clEnumValEnd)); + clEnumValEnd), + llvm::cl::init(readerYAML)); enum ArchChoice { i386 = llvm::ELF::EM_386, @@ -140,7 +135,8 @@ archSelected("arch", "hexagon", "output Hexagon, EM_HEXAGON file"), clEnumValN(ppc, "ppc", "output PowerPC, EM_PPC file"), - clEnumValEnd)); + clEnumValEnd), + llvm::cl::init(i386)); enum endianChoice { @@ -156,7 +152,7 @@ endianSelected("endian", "output little endian format"), clEnumValEnd)); -class TestingTargetInfo LLVM_FINAL : public TargetInfo { +class TestingTargetInfo : public TargetInfo { public: TestingTargetInfo(const LinkerOptions &lo, bool stubs, bool got) : TargetInfo(lo), _doStubs(stubs), _doGOT(got) {} @@ -177,7 +173,7 @@ public: return nullptr; } - virtual ErrorOr<uint32_t> relocKindFromString(StringRef str) const { + virtual ErrorOr<int32_t> relocKindFromString(StringRef str) const { // Try parsing as a number. if (auto kind = TargetInfo::relocKindFromString(str)) return kind; @@ -187,9 +183,9 @@ public: return llvm::make_error_code(llvm::errc::invalid_argument); } - virtual ErrorOr<std::string> stringFromRelocKind(uint32_t kind) const { + virtual ErrorOr<std::string> stringFromRelocKind(int32_t kind) const { for (const TestingKindMapping *p = sKinds; p->string != nullptr; ++p) { - if (kind == static_cast<uint32_t>(p->value)) + if (kind == p->value) return std::string(p->string); } return llvm::make_error_code(llvm::errc::invalid_argument); @@ -244,49 +240,32 @@ int main(int argc, char *argv[]) { TestingTargetInfo tti(lo, cmdLineDoStubsPass, cmdLineDoGotPass); - // create writer for final output, default to i386 if none selected - WriterOptionsELF writerOptionsELF(false, - endianSelected == big - ? llvm::support::big - : llvm::support::little, - llvm::ELF::ET_EXEC, - archSelected.getValue() == 0 - ? i386 - : archSelected); - - TestingWriterOptionsYAML writerOptionsYAML(cmdLineDoStubsPass, - cmdLineDoGotPass); - WriterOptionsMachO writerOptionsMachO; - WriterOptionsPECOFF writerOptionsPECOFF; - - Writer* writer = nullptr; + std::unique_ptr<ELFTargetInfo> eti = ELFTargetInfo::create(lo); + std::unique_ptr<MachOTargetInfo> mti = MachOTargetInfo::create(lo); + std::unique_ptr<Writer> writer; switch ( writeSelected ) { case writeYAML: - writer = createWriterYAML(writerOptionsYAML); + writer = createWriterYAML(tti); break; case writeMachO: - writer = createWriterMachO(writerOptionsMachO); + writer = createWriterMachO(*mti); break; case writePECOFF: - writer = createWriterPECOFF(writerOptionsPECOFF); + writer = createWriterPECOFF(tti); break; case writeELF: - writer = createWriterELF(writerOptionsELF); + writer = createWriterELF(*eti); break; } // create object to mange input files InputFiles inputFiles; - ReaderOptionsArchive readerOptionsArchive(cmdLineForceLoad); - // read input files into in-memory File objects - - TestingReaderOptionsYAML readerOptionsYAML; - Reader *reader = nullptr; + std::unique_ptr<Reader> reader; switch ( readerSelected ) { case readerYAML: - reader = createReaderYAML(readerOptionsYAML); + reader = createReaderYAML(tti); break; #if 0 case readerMachO: @@ -294,15 +273,19 @@ int main(int argc, char *argv[]) { break; #endif case readerPECOFF: - reader = createReaderPECOFF(lld::ReaderOptionsPECOFF()); + reader = createReaderPECOFF(tti, + [&] (const LinkerInput &) -> ErrorOr<Reader&> { + return *reader; + }); break; case readerELF: - reader = createReaderELF(lld::ReaderOptionsELF(), - readerOptionsArchive); - + reader = createReaderELF(*eti, + [&] (const LinkerInput &) -> ErrorOr<Reader&> { + return *reader; + }); break; default: - reader = createReaderYAML(readerOptionsYAML); + reader = createReaderYAML(tti); break; } @@ -342,14 +325,12 @@ int main(int argc, char *argv[]) { } // write as native file - WriterOptionsNative optionsNativeWriter; - Writer *natWriter = createWriterNative(optionsNativeWriter); + std::unique_ptr<Writer> natWriter = createWriterNative(tti); if (error(natWriter->writeFile(mergedMasterFile, tmpNativePath.c_str()))) return 1; // read as native file - ReaderOptionsNative optionsNativeReader; - Reader *natReader = createReaderNative(optionsNativeReader); + std::unique_ptr<Reader> natReader = createReaderNative(tti); std::vector<std::unique_ptr<File>> readNativeFiles; if (error(natReader->readFile(tmpNativePath.c_str(), readNativeFiles))) return 1; |