<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Dec 26, 2013 at 11:24 AM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">This... is ridiculous.</div></blockquote><div><br></div><div>And now, for your pleasure this fancy trick (must be run with CL for x86):</div><div><br></div><div>> type magic.cpp</div><div><br></div><div>
extern "C" int magic(int i) {</div><div>  return i + 32;</div><div>}</div><div><br></div><div>#pragma comment(linker, "/export:magic")</div><div><br></div><div>> cl /nologo /MD magic.cpp /link /DLL /OUT:magic.dll /export:magic</div>
<div><br></div><div>Note that the pragma is incorrect as it doesn't account for the global leader prefix, and that the command line is correct because it will be prefixed.  The linker will then whine and then will actually create the DLL.</div>
<div><br></div><div>Command line arguments take precedence, the duplicated export is fixed up as a result of the command line parsing, and you just get a warning that you specified the same symbol for exporting multiple times.</div>
<div><br></div><div>Yes, I am a bad person for pointing out this perverse behaviour :-).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb">
<div class="h5"><div class="gmail_extra"><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" target="_blank">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>
</div></div><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>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org
</div></div>