<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Dec 14, 2013 at 11:36 PM, 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">
<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="h5">On Sun, Dec 15, 2013 at 3:27 PM, Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</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"><div class="gmail_extra"><div class="gmail_quote"><div><div>On Fri, Dec 13, 2013 at 8:32 PM, 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: Fri Dec 13 22:32:29 2013<br>
New Revision: 197307<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=197307&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=197307&view=rev</a><br>
Log:<br>
[PECOFF] Export undecorated symbols from DLL.<br>
<br>
Symbol names exported from a DLL should be undecorated, not prefixed by<br>
an underscore ones.<br>
<br>
Modified:<br>
    lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h<br>
    lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp<br>
    lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h<br>
    lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp<br>
    lld/trunk/test/pecoff/export.test<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=197307&r1=197306&r2=197307&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=197307&r1=197306&r2=197307&view=diff</a><br>




==============================================================================<br>
--- lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h Fri Dec 13 22:32:29 2013<br>
@@ -99,16 +99,8 @@ public:<br>
<br>
   StringRef searchLibraryFile(StringRef path) const;<br>
<br>
-  /// Returns the decorated name of the given symbol name. On 32-bit x86, it<br>
-  /// adds "_" at the beginning of the string. On other architectures, the<br>
-  /// return value is the same as the argument.<br>
-  StringRef decorateSymbol(StringRef name) const {<br>
-    if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)<br>
-      return name;<br>
-    std::string str = "_";<br>
-    str.append(name);<br>
-    return allocate(str);<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/ReaderWriter/PECOFF/EdataPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp?rev=197307&r1=197306&r2=197307&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp?rev=197307&r1=197306&r2=197307&view=diff</a><br>




==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp Fri Dec 13 22:32:29 2013<br>
@@ -62,15 +62,16 @@ EdataPass::createAddressTable(const std:<br>
 }<br>
<br>
 edata::EdataAtom *<br>
-EdataPass::createNamePointerTable(const std::vector<const DefinedAtom *> &atoms,<br>
+EdataPass::createNamePointerTable(const PECOFFLinkingContext &ctx,<br>
+                                  const std::vector<const DefinedAtom *> &atoms,<br>
                                   MutableFile *file) {<br>
   EdataAtom *table =<br>
       new (_alloc) EdataAtom(_file, sizeof(uint32_t) * atoms.size());<br>
<br>
   size_t offset = 0;<br>
   for (const DefinedAtom *atom : atoms) {<br>
-    COFFStringAtom *stringAtom = new (_alloc)<br>
-        COFFStringAtom(_file, _stringOrdinal++, ".edata", atom->name());<br>
+    auto *stringAtom = new (_alloc) COFFStringAtom(<br>
+        _file, _stringOrdinal++, ".edata", ctx.undecorateSymbol(atom->name()));<br>
     file->addAtom(*stringAtom);<br>
     addDir32NBReloc(table, stringAtom, offset);<br>
     offset += sizeof(uint32_t);<br>
@@ -121,7 +122,7 @@ void EdataPass::perform(std::unique_ptr<<br>
   addDir32NBReloc(table, addressTable, offsetof(export_directory_table_entry,<br>
                                                 ExportAddressTableRVA));<br>
<br>
-  EdataAtom *namePointerTable = createNamePointerTable(atoms, file.get());<br>
+  EdataAtom *namePointerTable = createNamePointerTable(_ctx, atoms, file.get());<br>
   file->addAtom(*namePointerTable);<br>
   addDir32NBReloc(table, namePointerTable,<br>
                   offsetof(export_directory_table_entry, NamePointerRVA));<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h?rev=197307&r1=197306&r2=197307&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h?rev=197307&r1=197306&r2=197307&view=diff</a><br>




==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h Fri Dec 13 22:32:29 2013<br>
@@ -66,7 +66,8 @@ private:<br>
   edata::EdataAtom *<br>
   createAddressTable(const std::vector<const DefinedAtom *> &atoms);<br>
   edata::EdataAtom *<br>
-  createNamePointerTable(const std::vector<const DefinedAtom *> &atoms,<br>
+  createNamePointerTable(const PECOFFLinkingContext &ctx,<br>
+                         const std::vector<const DefinedAtom *> &atoms,<br>
                          MutableFile *file);<br>
   edata::EdataAtom *<br>
   createOrdinalTable(const std::vector<const DefinedAtom *> &atoms);<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=197307&r1=197306&r2=197307&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=197307&r1=197306&r2=197307&view=diff</a><br>




==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Fri Dec 13 22:32:29 2013<br>
@@ -183,6 +183,24 @@ StringRef PECOFFLinkingContext::searchLi<br>
   return filename;<br>
 }<br>
<br>
+/// Returns the decorated name of the given symbol name. On 32-bit x86, it<br>
+/// adds "_" at the beginning of the string. On other architectures, the<br>
+/// return value is the same as the argument.<br>
+StringRef PECOFFLinkingContext::decorateSymbol(StringRef name) const {<br>
+  if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)<br>
+    return name;<br>
+  std::string str = "_";<br>
+  str.append(name);<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></blockquote><div><br></div></div></div><div>While this is entirely correct, Im left wondering if this can cause a subtle bug in the export table.  Assume that I have a symbol call _symbol.  When decorated on x86, it would be __symbol.  However, if undecorateSymbol is invoked on this symbol, it would happily mangle _symbol to symbol, resulting in an invalid export.  Do you think a class to wrap a StringRef and a flag set would be too expensive to avoid a situation like this?</div>


</div></div></div></blockquote><div><br></div></div></div><div>When the control reached that code, it's guaranteed that an underscore has always been added to a symbol, so it wouldn't happen that <i>_symbol</i> would accidentally be mangled to <i>symbol</i>.</div>
</div></div></div></blockquote><div><br></div><div>Right.  I was thinking more about an accidental incorrect usage (or did I miss something and is it not possible to accidentally pass the undecorated symbol to it?).  I was merely thinking out loud about the idea of enforcing that via a wrapper since I couldn't think of a quick way of enforcing that via the type system.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


 Writer &PECOFFLinkingContext::writer() const { return *_writer; }<br>
<br>
 ErrorOr<Reference::Kind><br>
<br>
Modified: lld/trunk/test/pecoff/export.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/export.test?rev=197307&r1=197306&r2=197307&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/export.test?rev=197307&r1=197306&r2=197307&view=diff</a><br>




==============================================================================<br>
--- lld/trunk/test/pecoff/export.test (original)<br>
+++ lld/trunk/test/pecoff/export.test Fri Dec 13 22:32:29 2013<br>
@@ -8,7 +8,7 @@ CHECK:      Contents of section .edata:<br>
 CHECK-NEXT:  1000 00000000 {{........}} 00000000 3c100000<br>
 CHECK-NEXT:  1010 01000000 02000000 02000000 28100000<br>
 CHECK-NEXT:  1020 30100000 38100000 08200000 10200000<br>
-CHECK-NEXT:  1030 50100000 5b100000 00000100 6578706f<br>
+CHECK-NEXT:  1030 50100000 5a100000 00000100 6578706f<br>
 CHECK-NEXT:  1040 72742e74 6573742e 746d702e 646c6c00<br>
-CHECK-NEXT:  1050 5f657870 6f727466 6e31005f 6578706f<br>
-CHECK-NEXT:  1060 7274666e 3200<br>
+CHECK-NEXT:  1050 6578706f 7274666e 31006578 706f7274<br>
+CHECK-NEXT:  1060 666e3200<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></div><span><font color="#888888"><br><br clear="all"><div><br></div>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org
</font></span></div></div>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org
</div></div>