summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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.cpp5
-rw-r--r--lld/test/pecoff/entry.test2
-rw-r--r--lld/test/pecoff/merge-largest.test2
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
OpenPOWER on IntegriCloud