summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/include/lld/ReaderWriter/PECOFFLinkingContext.h1
-rw-r--r--lld/lib/ReaderWriter/PECOFF/EdataPass.cpp19
-rw-r--r--lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp14
-rw-r--r--lld/unittests/DriverTests/WinLinkDriverTest.cpp2
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);
}
OpenPOWER on IntegriCloud