[lld] r197797 - [PECOFF] Assign default export ordinals in LinkingContext::verify().

Rui Ueyama ruiu at google.com
Fri Dec 20 02:02:59 PST 2013


Author: ruiu
Date: Fri Dec 20 04:02:59 2013
New Revision: 197797

URL: http://llvm.org/viewvc/llvm-project?rev=197797&view=rev
Log:
[PECOFF] Assign default export ordinals in LinkingContext::verify().

Default ordinals were assigned in EdataPass, and the assigned values were
then discarded in the pass. No code other than EdataPass would not be able
to get all of the information about ordinals. That's not ideal since I'm
writing code to emit an Import Library file, which also needs ordinals.

This is a patch to move the code to assign default ordinals from EdataPass
to LinkingContext::verify(), so that assigned ordinals will be available
anywhere.

No functionality change.

Modified:
    lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
    lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp
    lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
    lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp

Modified: lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=197797&r1=197796&r2=197797&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h (original)
+++ lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h Fri Dec 20 04:02:59 2013
@@ -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 {

Modified: lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp?rev=197797&r1=197796&r2=197797&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp Fri Dec 20 04:02:59 2013
@@ -52,26 +52,13 @@ static bool getExportedAtoms(const PECOF
   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<
     return;
 
   int ordinalBase, maxOrdinal;
-  llvm::tie(ordinalBase, maxOrdinal) = assignOrdinals(entries);
+  llvm::tie(ordinalBase, maxOrdinal) = getOrdinalBase(entries);
 
   std::vector<TableEntry> namedEntries;
   for (TableEntry &e : entries)

Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=197797&r1=197796&r2=197797&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Fri Dec 20 04:02:59 2013
@@ -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(
     return false;
   }
 
+  // Assign default ordinals to export symbols.
+  assignOrdinals(*this);
+
   _writer = createWriterPECOFF(*this);
   return true;
 }

Modified: lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=197797&r1=197796&r2=197797&view=diff
==============================================================================
--- lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp (original)
+++ lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp Fri Dec 20 04:02:59 2013
@@ -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);
 }





More information about the llvm-commits mailing list