diff options
-rw-r--r-- | lld/include/lld/ReaderWriter/PECOFFLinkingContext.h | 1 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/EdataPass.cpp | 19 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp | 14 | ||||
-rw-r--r-- | lld/unittests/DriverTests/WinLinkDriverTest.cpp | 2 |
4 files changed, 19 insertions, 17 deletions
diff --git a/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h b/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h index 3eadde11f4e..8c51552bf07 100644 --- a/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h +++ b/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h @@ -217,6 +217,7 @@ public: ArrayRef<uint8_t> getDosStub() const { return _dosStub; } void addDllExport(ExportDesc &desc) { _dllExports.push_back(desc); } + std::vector<ExportDesc> &getDllExports() { return _dllExports; } const std::vector<ExportDesc> &getDllExports() const { return _dllExports; } StringRef allocate(StringRef ref) const { diff --git a/lld/lib/ReaderWriter/PECOFF/EdataPass.cpp b/lld/lib/ReaderWriter/PECOFF/EdataPass.cpp index 6903a52244b..5e478f6c0fe 100644 --- a/lld/lib/ReaderWriter/PECOFF/EdataPass.cpp +++ b/lld/lib/ReaderWriter/PECOFF/EdataPass.cpp @@ -52,26 +52,13 @@ static bool getExportedAtoms(const PECOFFLinkingContext &ctx, MutableFile *file, return true; } -static std::pair<int, int> assignOrdinals(std::vector<TableEntry> &entries) { +static std::pair<int, int> getOrdinalBase(std::vector<TableEntry> &entries) { int ordinalBase = INT_MAX; int maxOrdinal = -1; for (TableEntry &e : entries) { - if (e.ordinal > 0) - ordinalBase = std::min(ordinalBase, e.ordinal); + ordinalBase = std::min(ordinalBase, e.ordinal); maxOrdinal = std::max(maxOrdinal, e.ordinal); } - if (ordinalBase == INT_MAX) - ordinalBase = 1; - - if (maxOrdinal == -1) { - int ordinal = 0; - for (TableEntry &e : entries) - e.ordinal = ++ordinal; - return std::pair<int, int>(ordinalBase, ordinal); - } - for (TableEntry &e : entries) - if (e.ordinal == -1) - e.ordinal = ++maxOrdinal; return std::pair<int, int>(ordinalBase, maxOrdinal); } @@ -141,7 +128,7 @@ void EdataPass::perform(std::unique_ptr<MutableFile> &file) { return; int ordinalBase, maxOrdinal; - llvm::tie(ordinalBase, maxOrdinal) = assignOrdinals(entries); + llvm::tie(ordinalBase, maxOrdinal) = getOrdinalBase(entries); std::vector<TableEntry> namedEntries; for (TableEntry &e : entries) diff --git a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp index a4fc74354df..ba5bbfc930f 100644 --- a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp +++ b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp @@ -27,10 +27,21 @@ #include "llvm/Support/Path.h" #include <bitset> +#include <climits> #include <set> namespace lld { +static void assignOrdinals(PECOFFLinkingContext &ctx) { + int maxOrdinal = -1; + for (const PECOFFLinkingContext::ExportDesc &desc : ctx.getDllExports()) + maxOrdinal = std::max(maxOrdinal, desc.ordinal); + int nextOrdinal = (maxOrdinal == -1) ? 1 : (maxOrdinal + 1); + for (PECOFFLinkingContext::ExportDesc &desc : ctx.getDllExports()) + if (desc.ordinal == -1) + desc.ordinal = nextOrdinal++; +} + bool PECOFFLinkingContext::validateImpl(raw_ostream &diagnostics) { if (_stackReserve < _stackCommit) { diagnostics << "Invalid stack size: reserve size must be equal to or " @@ -78,6 +89,9 @@ bool PECOFFLinkingContext::validateImpl(raw_ostream &diagnostics) { return false; } + // Assign default ordinals to export symbols. + assignOrdinals(*this); + _writer = createWriterPECOFF(*this); return true; } diff --git a/lld/unittests/DriverTests/WinLinkDriverTest.cpp b/lld/unittests/DriverTests/WinLinkDriverTest.cpp index 2568da8e819..b1a00c30421 100644 --- a/lld/unittests/DriverTests/WinLinkDriverTest.cpp +++ b/lld/unittests/DriverTests/WinLinkDriverTest.cpp @@ -162,7 +162,7 @@ TEST_F(WinLinkParserTest, Export) { _context.getDllExports(); EXPECT_TRUE(exports.size() == 1); EXPECT_EQ("foo", exports[0].name); - EXPECT_EQ(-1, exports[0].ordinal); + EXPECT_EQ(1, exports[0].ordinal); EXPECT_FALSE(exports[0].noname); EXPECT_FALSE(exports[0].isData); } |