diff options
Diffstat (limited to 'lld/lib/ReaderWriter')
14 files changed, 57 insertions, 38 deletions
diff --git a/lld/lib/ReaderWriter/CoreLinkingContext.cpp b/lld/lib/ReaderWriter/CoreLinkingContext.cpp index ec8962bbce2..3b83d297e48 100644 --- a/lld/lib/ReaderWriter/CoreLinkingContext.cpp +++ b/lld/lib/ReaderWriter/CoreLinkingContext.cpp @@ -12,6 +12,9 @@ #include "lld/Core/Pass.h" #include "lld/Core/PassManager.h" #include "lld/Passes/LayoutPass.h" +#include "lld/Passes/RoundTripNativePass.h" +#include "lld/Passes/RoundTripYAMLPass.h" +#include "lld/ReaderWriter/Simple.h" #include "llvm/ADT/ArrayRef.h" @@ -149,10 +152,10 @@ private: uint32_t _ordinal; }; -class TestingPassFile : public MutableFile { +class TestingPassFile : public SimpleFile { public: TestingPassFile(const LinkingContext &ctx) - : MutableFile(ctx, "Testing pass") {} + : SimpleFile(ctx, "Testing pass") {} virtual void addAtom(const Atom &atom) { if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(&atom)) @@ -277,7 +280,7 @@ bool CoreLinkingContext::validateImpl(raw_ostream &) { return true; } -void CoreLinkingContext::addPasses(PassManager &pm) const { +void CoreLinkingContext::addPasses(PassManager &pm) { for (StringRef name : _passNames) { if (name.equals("layout")) pm.add(std::unique_ptr<Pass>((new LayoutPass()))); @@ -288,6 +291,10 @@ void CoreLinkingContext::addPasses(PassManager &pm) const { else llvm_unreachable("bad pass name"); } +#ifndef NDEBUG + pm.add(std::unique_ptr<Pass>(new RoundTripYAMLPass(*this))); + pm.add(std::unique_ptr<Pass>(new RoundTripNativePass(*this))); +#endif } Writer &CoreLinkingContext::writer() const { return *_writer; } diff --git a/lld/lib/ReaderWriter/ELF/ArrayOrderPass.cpp b/lld/lib/ReaderWriter/ELF/ArrayOrderPass.cpp index 8a721367b9b..be9cd4b167d 100644 --- a/lld/lib/ReaderWriter/ELF/ArrayOrderPass.cpp +++ b/lld/lib/ReaderWriter/ELF/ArrayOrderPass.cpp @@ -13,8 +13,8 @@ namespace lld { namespace elf { -void ArrayOrderPass::perform(MutableFile &f) { - auto definedAtoms = f.definedAtoms(); +void ArrayOrderPass::perform(std::unique_ptr<MutableFile> &f) { + auto definedAtoms = f->definedAtoms(); std::stable_sort(definedAtoms.begin(), definedAtoms.end(), [](const DefinedAtom *left, const DefinedAtom *right) { if (left->sectionChoice() != DefinedAtom::sectionCustomRequired || diff --git a/lld/lib/ReaderWriter/ELF/ArrayOrderPass.h b/lld/lib/ReaderWriter/ELF/ArrayOrderPass.h index 8d40c44fc88..12cce561fbf 100644 --- a/lld/lib/ReaderWriter/ELF/ArrayOrderPass.h +++ b/lld/lib/ReaderWriter/ELF/ArrayOrderPass.h @@ -18,7 +18,7 @@ namespace elf { class ArrayOrderPass : public Pass { public: ArrayOrderPass() : Pass() {} - virtual void perform(MutableFile &mergedFile) LLVM_OVERRIDE; + virtual void perform(std::unique_ptr<MutableFile> &mergedFile) LLVM_OVERRIDE; }; } } diff --git a/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp b/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp index 6d6f6a75794..827d73d2abe 100644 --- a/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp +++ b/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp @@ -16,6 +16,8 @@ #include "lld/Core/Instrumentation.h" #include "lld/Passes/LayoutPass.h" +#include "lld/Passes/RoundTripNativePass.h" +#include "lld/Passes/RoundTripYAMLPass.h" #include "lld/ReaderWriter/ReaderLinkerScript.h" #include "llvm/ADT/Triple.h" @@ -52,10 +54,14 @@ bool ELFLinkingContext::isLittleEndian() const { return true; } -void ELFLinkingContext::addPasses(PassManager &pm) const { +void ELFLinkingContext::addPasses(PassManager &pm) { if (_runLayoutPass) pm.add(std::unique_ptr<Pass>(new LayoutPass())); pm.add(std::unique_ptr<Pass>(new elf::ArrayOrderPass())); +#ifndef NDEBUG + pm.add(std::unique_ptr<Pass>(new RoundTripYAMLPass(*this))); + pm.add(std::unique_ptr<Pass>(new RoundTripNativePass(*this))); +#endif } uint16_t ELFLinkingContext::getOutputMachine() const { diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h index ea3b9c3b513..90379503056 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h @@ -29,7 +29,7 @@ public: virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const; virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const; - virtual void addPasses(PassManager &) const; + virtual void addPasses(PassManager &); virtual bool isDynamicRelocation(const DefinedAtom &, const Reference &r) const { diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp index 7c918877fc2..761471cb06a 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp @@ -157,9 +157,9 @@ public: /// /// After all references are handled, the atoms created during that are all /// added to mf. - virtual void perform(MutableFile &mf) { + virtual void perform(std::unique_ptr<MutableFile> &mf) { // Process all references. - for (const auto &atom : mf.defined()) + for (const auto &atom : mf->defined()) for (const auto &ref : *atom) handleReference(*atom, *ref); @@ -167,23 +167,23 @@ public: uint64_t ordinal = 0; if (_PLT0) { _PLT0->setOrdinal(ordinal++); - mf.addAtom(*_PLT0); + mf->addAtom(*_PLT0); } for (auto &plt : _pltVector) { plt->setOrdinal(ordinal++); - mf.addAtom(*plt); + mf->addAtom(*plt); } if (_null) { _null->setOrdinal(ordinal++); - mf.addAtom(*_null); + mf->addAtom(*_null); } if (_got0) { _got0->setOrdinal(ordinal++); - mf.addAtom(*_got0); + mf->addAtom(*_got0); } for (auto &got : _gotVector) { got->setOrdinal(ordinal++); - mf.addAtom(*got); + mf->addAtom(*got); } } @@ -293,7 +293,7 @@ public: }; } // end anonymous namespace -void elf::HexagonLinkingContext::addPasses(PassManager &pm) const { +void elf::HexagonLinkingContext::addPasses(PassManager &pm) { if (isDynamic()) pm.add(std::unique_ptr<Pass>(new DynamicGOTPLTPass(*this))); ELFLinkingContext::addPasses(pm); diff --git a/lld/lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp b/lld/lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp index 24c38b1e9d0..02f6c21cc17 100644 --- a/lld/lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp +++ b/lld/lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp @@ -21,7 +21,7 @@ using namespace lld; ErrorOr<Reference::Kind> elf::PPCLinkingContext::relocKindFromString(StringRef str) const { int32_t ret = llvm::StringSwitch<int32_t>(str) LLD_CASE(R_PPC_NONE) - LLD_CASE(R_PPC_ADDR32).Default(-1); + LLD_CASE(R_PPC_ADDR32) LLD_CASE(R_PPC_REL24).Default(-1); if (ret == -1) return make_error_code(YamlReaderError::illegal_value); @@ -39,6 +39,7 @@ elf::PPCLinkingContext::stringFromRelocKind(Reference::Kind kind) const { switch (kind) { LLD_CASE(R_PPC_NONE) LLD_CASE(R_PPC_ADDR32) + LLD_CASE(R_PPC_REL24) } return make_error_code(YamlReaderError::illegal_value); diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp b/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp index 5b3a920547c..a5b27e656e5 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp @@ -90,8 +90,7 @@ private: } // end anon namespace - -void elf::X86_64LinkingContext::addPasses(PassManager &pm) const { +void elf::X86_64LinkingContext::addPasses(PassManager &pm) { auto pass = createX86_64RelocationPass(*this); if (pass) pm.add(std::move(pass)); diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h index c7ca812d1da..7877869bf36 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h @@ -33,7 +33,7 @@ public: : ELFLinkingContext(triple, std::unique_ptr<TargetHandlerBase>( new X86_64TargetHandler(*this))) {} - virtual void addPasses(PassManager &) const; + virtual void addPasses(PassManager &); virtual uint64_t getBaseAddress() const { if (_baseAddress == 0) diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp b/lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp index a06b48746ba..3ce6b0873e3 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp @@ -217,10 +217,10 @@ public: /// /// After all references are handled, the atoms created during that are all /// added to mf. - virtual void perform(MutableFile &mf) { + virtual void perform(std::unique_ptr<MutableFile> &mf) { ScopedTask task(getDefaultDomain(), "X86-64 GOT/PLT Pass"); // Process all references. - for (const auto &atom : mf.defined()) + for (const auto &atom : mf->defined()) for (const auto &ref : *atom) handleReference(*atom, *ref); @@ -228,29 +228,29 @@ public: uint64_t ordinal = 0; if (_PLT0) { _PLT0->setOrdinal(ordinal++); - mf.addAtom(*_PLT0); + mf->addAtom(*_PLT0); } for (auto &plt : _pltVector) { plt->setOrdinal(ordinal++); - mf.addAtom(*plt); + mf->addAtom(*plt); } if (_null) { _null->setOrdinal(ordinal++); - mf.addAtom(*_null); + mf->addAtom(*_null); } if (_PLT0) { _got0->setOrdinal(ordinal++); _got1->setOrdinal(ordinal++); - mf.addAtom(*_got0); - mf.addAtom(*_got1); + mf->addAtom(*_got0); + mf->addAtom(*_got1); } for (auto &got : _gotVector) { got->setOrdinal(ordinal++); - mf.addAtom(*got); + mf->addAtom(*got); } for (auto obj : _objectVector) { obj->setOrdinal(ordinal++); - mf.addAtom(*obj); + mf->addAtom(*obj); } } diff --git a/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp b/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp index 69219e5b168..b79fd39a8bc 100644 --- a/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp +++ b/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp @@ -16,6 +16,8 @@ #include "lld/ReaderWriter/Reader.h" #include "lld/ReaderWriter/Writer.h" #include "lld/Passes/LayoutPass.h" +#include "lld/Passes/RoundTripNativePass.h" +#include "lld/Passes/RoundTripYAMLPass.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/Triple.h" @@ -235,10 +237,14 @@ bool MachOLinkingContext::setOS(OS os, StringRef minOSVersion) { return parsePackedVersion(minOSVersion, _osMinVersion); } -void MachOLinkingContext::addPasses(PassManager &pm) const { +void MachOLinkingContext::addPasses(PassManager &pm) { pm.add(std::unique_ptr<Pass>(new mach_o::GOTPass)); pm.add(std::unique_ptr<Pass>(new mach_o::StubsPass(*this))); pm.add(std::unique_ptr<Pass>(new LayoutPass())); +#ifndef NDEBUG + pm.add(std::unique_ptr<Pass>(new RoundTripYAMLPass(*this))); + pm.add(std::unique_ptr<Pass>(new RoundTripNativePass(*this))); +#endif } Writer &MachOLinkingContext::writer() const { diff --git a/lld/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h b/lld/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h index f8836061a07..e3186031b87 100644 --- a/lld/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h +++ b/lld/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h @@ -60,9 +60,9 @@ class GroupedSectionsPass : public lld::Pass { public: GroupedSectionsPass() {} - virtual void perform(MutableFile &mergedFile) { - std::map<StringRef, std::vector<COFFDefinedAtom *>> sectionToHeadAtoms( - filterHeadAtoms(mergedFile)); + virtual void perform(std::unique_ptr<MutableFile> &mergedFile) { + std::map<StringRef, std::vector<COFFDefinedAtom *> > sectionToHeadAtoms( + filterHeadAtoms(*mergedFile)); std::vector<std::vector<COFFDefinedAtom *>> groupedAtomsList( groupBySectionName(sectionToHeadAtoms)); for (auto &groupedAtoms : groupedAtomsList) diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.h b/lld/lib/ReaderWriter/PECOFF/IdataPass.h index d13a718cb47..c3f7e976155 100644 --- a/lld/lib/ReaderWriter/PECOFF/IdataPass.h +++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.h @@ -252,13 +252,13 @@ class IdataPass : public lld::Pass { public: IdataPass(const LinkingContext &ctx) : _dummyFile(ctx) {} - virtual void perform(MutableFile &file) { - if (file.sharedLibrary().size() == 0) + virtual void perform(std::unique_ptr<MutableFile> &file) { + if (file->sharedLibrary().size() == 0) return; - Context context(file, _dummyFile); + Context context(*file, _dummyFile); map<StringRef, vector<COFFSharedLibraryAtom *> > sharedAtoms = - groupByLoadName(file); + groupByLoadName(*file); for (auto i : sharedAtoms) { StringRef loadName = i.first; vector<COFFSharedLibraryAtom *> &atoms = i.second; diff --git a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp index 065a2c07166..252c91cc53a 100644 --- a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp +++ b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp @@ -204,7 +204,7 @@ PECOFFLinkingContext::stringFromRelocKind(Reference::Kind kind) const { return make_error_code(YamlReaderError::illegal_value); } -void PECOFFLinkingContext::addPasses(PassManager &pm) const { +void PECOFFLinkingContext::addPasses(PassManager &pm) { pm.add(std::unique_ptr<Pass>(new pecoff::GroupedSectionsPass())); pm.add(std::unique_ptr<Pass>(new pecoff::IdataPass(*this))); pm.add(std::unique_ptr<Pass>(new LayoutPass())); |