[lld] r197307 - [PECOFF] Export undecorated symbols from DLL.

Rui Ueyama ruiu at google.com
Fri Dec 13 20:32:30 PST 2013


Author: ruiu
Date: Fri Dec 13 22:32:29 2013
New Revision: 197307

URL: http://llvm.org/viewvc/llvm-project?rev=197307&view=rev
Log:
[PECOFF] Export undecorated symbols from DLL.

Symbol names exported from a DLL should be undecorated, not prefixed by
an underscore ones.

Modified:
    lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
    lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.cpp
    lld/trunk/lib/ReaderWriter/PECOFF/EdataPass.h
    lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
    lld/trunk/test/pecoff/export.test

Modified: lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=197307&r1=197306&r2=197307&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h (original)
+++ lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h Fri Dec 13 22:32:29 2013
@@ -99,16 +99,8 @@ public:
 
   StringRef searchLibraryFile(StringRef path) const;
 
-  /// Returns the decorated name of the given symbol name. On 32-bit x86, it
-  /// adds "_" at the beginning of the string. On other architectures, the
-  /// return value is the same as the argument.
-  StringRef decorateSymbol(StringRef name) const {
-    if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)
-      return name;
-    std::string str = "_";
-    str.append(name);
-    return allocate(str);
-  }
+  StringRef decorateSymbol(StringRef name) const;
+  StringRef undecorateSymbol(StringRef name) const;
 
   void setEntrySymbolName(StringRef name) {
     if (!name.empty())

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

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

Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=197307&r1=197306&r2=197307&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Fri Dec 13 22:32:29 2013
@@ -183,6 +183,24 @@ StringRef PECOFFLinkingContext::searchLi
   return filename;
 }
 
+/// Returns the decorated name of the given symbol name. On 32-bit x86, it
+/// adds "_" at the beginning of the string. On other architectures, the
+/// return value is the same as the argument.
+StringRef PECOFFLinkingContext::decorateSymbol(StringRef name) const {
+  if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)
+    return name;
+  std::string str = "_";
+  str.append(name);
+  return allocate(str);
+}
+
+StringRef PECOFFLinkingContext::undecorateSymbol(StringRef name) const {
+  if (_machineType != llvm::COFF::IMAGE_FILE_MACHINE_I386)
+    return name;
+  assert(name.startswith("_"));
+  return name.substr(1);
+}
+
 Writer &PECOFFLinkingContext::writer() const { return *_writer; }
 
 ErrorOr<Reference::Kind>

Modified: lld/trunk/test/pecoff/export.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/export.test?rev=197307&r1=197306&r2=197307&view=diff
==============================================================================
--- lld/trunk/test/pecoff/export.test (original)
+++ lld/trunk/test/pecoff/export.test Fri Dec 13 22:32:29 2013
@@ -8,7 +8,7 @@ CHECK:      Contents of section .edata:
 CHECK-NEXT:  1000 00000000 {{........}} 00000000 3c100000
 CHECK-NEXT:  1010 01000000 02000000 02000000 28100000
 CHECK-NEXT:  1020 30100000 38100000 08200000 10200000
-CHECK-NEXT:  1030 50100000 5b100000 00000100 6578706f
+CHECK-NEXT:  1030 50100000 5a100000 00000100 6578706f
 CHECK-NEXT:  1040 72742e74 6573742e 746d702e 646c6c00
-CHECK-NEXT:  1050 5f657870 6f727466 6e31005f 6578706f
-CHECK-NEXT:  1060 7274666e 3200
+CHECK-NEXT:  1050 6578706f 7274666e 31006578 706f7274
+CHECK-NEXT:  1060 666e3200





More information about the llvm-commits mailing list