[lld] r197373 - [PECOFF] Add a check for duplicate export ordinals.

Rui Ueyama ruiu at google.com
Mon Dec 16 01:15:58 PST 2013


Author: ruiu
Date: Mon Dec 16 03:15:58 2013
New Revision: 197373

URL: http://llvm.org/viewvc/llvm-project?rev=197373&view=rev
Log:
[PECOFF] Add a check for duplicate export ordinals.

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

Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=197373&r1=197372&r2=197373&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Mon Dec 16 03:15:58 2013
@@ -53,6 +53,18 @@ bool PECOFFLinkingContext::validateImpl(
     return false;
   }
 
+  // Check for duplicate export ordinals.
+  std::set<int> exports;
+  for (const PECOFFLinkingContext::ExportDesc &desc : getDllExports()) {
+    if (desc.ordinal == -1)
+      continue;
+    if (exports.count(desc.ordinal) == 1) {
+      diagnostics << "Duplicate export ordinals: " << desc.ordinal << "\n";
+      return false;
+    }
+    exports.insert(desc.ordinal);
+  }
+
   std::bitset<64> alignment(_sectionDefaultAlignment);
   if (alignment.count() != 1) {
     diagnostics << "Section alignment must be a power of 2, but got "

Modified: lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=197373&r1=197372&r2=197373&view=diff
==============================================================================
--- lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp (original)
+++ lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp Mon Dec 16 03:15:58 2013
@@ -183,6 +183,11 @@ TEST_F(WinLinkParserTest, ExportWithOpti
   EXPECT_TRUE(exports[1].isData);
 }
 
+TEST_F(WinLinkParserTest, ExportDuplicates) {
+  EXPECT_FALSE(
+      parse("link.exe", "/export:foo, at 1", "/export:bar, at 1", "a.out", nullptr));
+}
+
 TEST_F(WinLinkParserTest, ExportInvalid1) {
   EXPECT_FALSE(parse("link.exe", "/export:foo, at 0", "a.out", nullptr));
 }





More information about the llvm-commits mailing list