diff options
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/OrderPass.h (renamed from lld/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h) | 40 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp | 5 | ||||
-rw-r--r-- | lld/test/pecoff/entry.test | 2 | ||||
-rw-r--r-- | lld/test/pecoff/merge-largest.test | 2 |
4 files changed, 32 insertions, 17 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h b/lld/lib/ReaderWriter/PECOFF/OrderPass.h index ab902eff9ea..8f8b4082421 100644 --- a/lld/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h +++ b/lld/lib/ReaderWriter/PECOFF/OrderPass.h @@ -1,4 +1,4 @@ -//===- lib/ReaderWriter/PECOFF/GroupedSectionsPass.h ----------------------===// +//===- lib/ReaderWriter/PECOFF/OrderPass.h -------------------------------===// // // The LLVM Linker // @@ -26,30 +26,46 @@ /// //===----------------------------------------------------------------------===// -#ifndef LLD_READER_WRITER_PE_COFF_GROUPED_SECTIONS_PASS_H -#define LLD_READER_WRITER_PE_COFF_GROUPED_SECTIONS_PASS_H +#ifndef LLD_READER_WRITER_PE_COFF_ORDER_PASS_H +#define LLD_READER_WRITER_PE_COFF_ORDER_PASS_H #include "Atoms.h" +#include "lld/Core/Parallel.h" #include "lld/Core/Pass.h" #include <algorithm> namespace lld { namespace pecoff { -static bool compare(const DefinedAtom *left, const DefinedAtom *right) { - if (left->sectionChoice() == DefinedAtom::sectionCustomRequired && - right->sectionChoice() == DefinedAtom::sectionCustomRequired) { - return left->customSectionName().compare(right->customSectionName()) < 0; +static bool compareByPosition(const DefinedAtom *lhs, const DefinedAtom *rhs) { + const File *lhsFile = &lhs->file(); + const File *rhsFile = &rhs->file(); + if (lhsFile->ordinal() != rhsFile->ordinal()) + return lhsFile->ordinal() < rhsFile->ordinal(); + return lhs->ordinal() < rhs->ordinal(); +} + +static bool compare(const DefinedAtom *lhs, const DefinedAtom *rhs) { + bool lhsCustom = (lhs->sectionChoice() == DefinedAtom::sectionCustomRequired); + bool rhsCustom = (rhs->sectionChoice() == DefinedAtom::sectionCustomRequired); + if (lhsCustom && rhsCustom) { + int cmp = lhs->customSectionName().compare(rhs->customSectionName()); + if (cmp != 0) + return cmp < 0; + return compareByPosition(lhs, rhs); } - return left->sectionChoice() == DefinedAtom::sectionCustomRequired && - right->sectionChoice() != DefinedAtom::sectionCustomRequired; + if (lhsCustom && !rhsCustom) + return true; + if (!lhsCustom && rhsCustom) + return false; + return compareByPosition(lhs, rhs); } -class GroupedSectionsPass : public lld::Pass { +class OrderPass : public lld::Pass { public: void perform(std::unique_ptr<MutableFile> &file) override { - auto definedAtoms = file->definedAtoms(); - std::stable_sort(definedAtoms.begin(), definedAtoms.end(), compare); + MutableFile::DefinedAtomRange defined = file->definedAtoms(); + parallel_sort(defined.begin(), defined.end(), compare); } }; diff --git a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp index b1159697894..a139e958774 100644 --- a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp +++ b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp @@ -9,11 +9,11 @@ #include "Atoms.h" #include "EdataPass.h" -#include "GroupedSectionsPass.h" #include "IdataPass.h" #include "InferSubsystemPass.h" #include "LinkerGeneratedSymbolFile.h" #include "LoadConfigPass.h" +#include "OrderPass.h" #include "PDBPass.h" #include "lld/Core/PassManager.h" #include "lld/Core/Reader.h" @@ -351,9 +351,8 @@ void PECOFFLinkingContext::addPasses(PassManager &pm) { pm.add(std::unique_ptr<Pass>(new pecoff::PDBPass(*this))); pm.add(std::unique_ptr<Pass>(new pecoff::EdataPass(*this))); pm.add(std::unique_ptr<Pass>(new pecoff::IdataPass(*this))); - pm.add(std::unique_ptr<Pass>(new LayoutPass(registry()))); + pm.add(std::unique_ptr<Pass>(new pecoff::OrderPass())); pm.add(std::unique_ptr<Pass>(new pecoff::LoadConfigPass(*this))); - pm.add(std::unique_ptr<Pass>(new pecoff::GroupedSectionsPass())); pm.add(std::unique_ptr<Pass>(new pecoff::InferSubsystemPass(*this))); } diff --git a/lld/test/pecoff/entry.test b/lld/test/pecoff/entry.test index b48e5a03829..c8338439be2 100644 --- a/lld/test/pecoff/entry.test +++ b/lld/test/pecoff/entry.test @@ -33,7 +33,7 @@ WWINMAIN: _wWinMainCRTStartup # RUN: /alternatename:_mainCRTStartup=_bar -- %t.obj # RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=MAINADDR %s -MAINADDR: AddressOfEntryPoint: 0x1004 +MAINADDR: AddressOfEntryPoint: 0x100C # RUN: lld -flavor link /out:%t.exe /subsystem:console /entry:baz -- %t.obj # RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=MANGLE %s diff --git a/lld/test/pecoff/merge-largest.test b/lld/test/pecoff/merge-largest.test index 9273cf0da4f..c3ee96ca9c5 100644 --- a/lld/test/pecoff/merge-largest.test +++ b/lld/test/pecoff/merge-largest.test @@ -19,6 +19,6 @@ READOBJ-NEXT: Sections [ READOBJ-NEXT: Section { READOBJ-NEXT: Number: 1 READOBJ-NEXT: Name: .text (2E 74 65 78 74 00 00 00) -READOBJ-NEXT: VirtualSize: 0x12 +READOBJ-NEXT: VirtualSize: 0x8 READOBJ-NEXT: VirtualAddress: 0x1000 READOBJ-NEXT: RawDataSize: 512 |