<div dir="ltr">This... is ridiculous.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Dec 24, 2013 at 1:15 AM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ruiu<br>
Date: Tue Dec 24 03:15:57 2013<br>
New Revision: 197970<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=197970&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=197970&view=rev</a><br>
Log:<br>
[PECOFF] Fix /export option in the .drectve section.<br>
<br>
/EXPORT option has slightly different semantics if it appears in the .drectve<br>
section. This patch implements it.<br>
<br>
Modified:<br>
    lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h<br>
    lld/trunk/lib/Driver/WinLinkDriver.cpp<br>
    lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp<br>
    lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp<br>
    lld/trunk/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp<br>
    lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp<br>
<br>
Modified: lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=197970&r1=197969&r2=197970&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=197970&r1=197969&r2=197970&view=diff</a><br>

==============================================================================<br>
--- lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h Tue Dec 24 03:15:57 2013<br>
@@ -98,6 +98,7 @@ public:<br>
   StringRef searchLibraryFile(StringRef path) const;<br>
<br>
   StringRef decorateSymbol(StringRef name) const;<br>
+  StringRef undecorateSymbol(StringRef name) const;<br>
<br>
   void setEntrySymbolName(StringRef name) {<br>
     if (!name.empty())<br>
<br>
Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=197970&r1=197969&r2=197970&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=197970&r1=197969&r2=197970&view=diff</a><br>

==============================================================================<br>
--- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)<br>
+++ lld/trunk/lib/Driver/WinLinkDriver.cpp Tue Dec 24 03:15:57 2013<br>
@@ -892,6 +892,15 @@ WinLinkDriver::parse(int argc, const cha<br>
                     << inputArg->getValue() << "\n";<br>
         return false;<br>
       }<br>
+<br>
+      // Mangle the symbol name only if it is reading user-supplied command line<br>
+      // arguments. Because the symbol name in the .drectve section is already<br>
+      // mangled by the compiler, we shouldn't add a leading undescore here.<br>
+      // It's odd that the command line option has different semantics in the<br>
+      // .drectve section, but this behavior is needed for compatibility with<br>
+      // MSVC's link.exe.<br>
+      if (!isReadingDirectiveSection)<br>
+        <a href="http://desc.name" target="_blank">desc.name</a> = ctx.decorateSymbol(<a href="http://desc.name" target="_blank">desc.name</a>);<br>
       ctx.addDllExport(desc);<br>
       break;<br>
     }<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp?rev=197970&r1=197969&r2=197970&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp?rev=197970&r1=197969&r2=197970&view=diff</a><br>

==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp Tue Dec 24 03:15:57 2013<br>
@@ -39,7 +39,7 @@ static bool getExportedAtoms(const PECOF<br>
     definedAtoms[atom->name()] = atom;<br>
<br>
   for (const PECOFFLinkingContext::ExportDesc &desc : ctx.getDllExports()) {<br>
-    auto it = definedAtoms.find(ctx.decorateSymbol(<a href="http://desc.name" target="_blank">desc.name</a>));<br>
+    auto it = definedAtoms.find(<a href="http://desc.name" target="_blank">desc.name</a>);<br>
     if (it == definedAtoms.end()) {<br>
       llvm::errs() << "Symbol <" << <a href="http://desc.name" target="_blank">desc.name</a><br>
                    << "> is exported but not defined.\n";<br>
@@ -86,8 +86,8 @@ EdataPass::createNamePointerTable(const<br>
<br>
   size_t offset = 0;<br>
   for (const TableEntry &e : entries) {<br>
-    auto *stringAtom = new (_alloc)<br>
-        COFFStringAtom(_file, _stringOrdinal++, ".edata", e.exportName);<br>
+    auto *stringAtom = new (_alloc) COFFStringAtom(<br>
+        _file, _stringOrdinal++, ".edata", ctx.undecorateSymbol(e.exportName));<br>
     file->addAtom(*stringAtom);<br>
     addDir32NBReloc(table, stringAtom, offset);<br>
     offset += sizeof(uint32_t);<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=197970&r1=197969&r2=197970&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=197970&r1=197969&r2=197970&view=diff</a><br>

==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Tue Dec 24 03:15:57 2013<br>
@@ -219,6 +219,13 @@ StringRef PECOFFLinkingContext::decorate<br>
   return allocate(str);<br>
 }<br>
<br>
+StringRef PECOFFLinkingContext::undecorateSymbol(StringRef name) const {<br>
+  if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)<br>
+    return name;<br>
+  assert(name.startswith("_"));<br>
+  return name.substr(1);<br>
+}<br>
+<br>
 Writer &PECOFFLinkingContext::writer() const { return *_writer; }<br>
<br>
<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp?rev=197970&r1=197969&r2=197970&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp?rev=197970&r1=197969&r2=197970&view=diff</a><br>

==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterImportLibrary.cpp Tue Dec 24 03:15:57 2013<br>
@@ -42,7 +42,7 @@ createModuleDefinitionFile(const PECOFFL<br>
      << "EXPORTS\n";<br>
<br>
   for (const PECOFFLinkingContext::ExportDesc &desc : ctx.getDllExports()) {<br>
-    os << "  " << <a href="http://desc.name" target="_blank">desc.name</a> << " @" << desc.ordinal;<br>
+    os << "  " << ctx.undecorateSymbol(<a href="http://desc.name" target="_blank">desc.name</a>) << " @" << desc.ordinal;<br>
     if (desc.noname)<br>
       os << " NONAME";<br>
     if (desc.isData)<br>
<br>
Modified: lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=197970&r1=197969&r2=197970&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=197970&r1=197969&r2=197970&view=diff</a><br>

==============================================================================<br>
--- lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp (original)<br>
+++ lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp Tue Dec 24 03:15:57 2013<br>
@@ -161,7 +161,7 @@ TEST_F(WinLinkParserTest, Export) {<br>
   const std::vector<PECOFFLinkingContext::ExportDesc> &exports =<br>
       _context.getDllExports();<br>
   EXPECT_TRUE(exports.size() == 1);<br>
-  EXPECT_EQ("foo", exports[0].name);<br>
+  EXPECT_EQ("_foo", exports[0].name);<br>
   EXPECT_EQ(1, exports[0].ordinal);<br>
   EXPECT_FALSE(exports[0].noname);<br>
   EXPECT_FALSE(exports[0].isData);<br>
@@ -173,11 +173,11 @@ TEST_F(WinLinkParserTest, ExportWithOpti<br>
   const std::vector<PECOFFLinkingContext::ExportDesc> &exports =<br>
       _context.getDllExports();<br>
   EXPECT_TRUE(exports.size() == 2);<br>
-  EXPECT_EQ("foo", exports[0].name);<br>
+  EXPECT_EQ("_foo", exports[0].name);<br>
   EXPECT_EQ(8, exports[0].ordinal);<br>
   EXPECT_TRUE(exports[0].noname);<br>
   EXPECT_TRUE(exports[0].isData);<br>
-  EXPECT_EQ("bar", exports[1].name);<br>
+  EXPECT_EQ("_bar", exports[1].name);<br>
   EXPECT_EQ(10, exports[1].ordinal);<br>
   EXPECT_FALSE(exports[1].noname);<br>
   EXPECT_TRUE(exports[1].isData);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>