[lld] r218728 - [PECOFF] Fix x64 export table.

Rui Ueyama ruiu at google.com
Tue Sep 30 18:39:34 PDT 2014


Author: ruiu
Date: Tue Sep 30 20:39:34 2014
New Revision: 218728

URL: http://llvm.org/viewvc/llvm-project?rev=218728&view=rev
Log:
[PECOFF] Fix x64 export table.

Export table entry is 64 bit wide in x64. If MSB is 1, it means it's
imported by ordinal. The shift value was wrong.

Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp
    lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h

Modified: lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp?rev=218728&r1=218727&r2=218728&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp Tue Sep 30 20:39:34 2014
@@ -51,7 +51,7 @@ std::vector<uint8_t> HintNameAtom::assem
 }
 
 std::vector<uint8_t>
-ImportTableEntryAtom::assembleRawContent(uint32_t rva, bool is64) {
+ImportTableEntryAtom::assembleRawContent(uint64_t rva, bool is64) {
   // The element size of the import table is 32 bit in PE and 64 bit
   // in PE+. In PE+, bits 62-31 are filled with zero.
   if (is64) {
@@ -99,7 +99,8 @@ std::vector<ImportTableEntryAtom *> Impo
     ImportTableEntryAtom *entry = nullptr;
     if (atom->importName().empty()) {
       // Import by ordinal
-      uint32_t hint = (1U << 31) | atom->hint();
+      uint64_t hint = atom->hint();
+      hint |= _is64 ? (uint64_t(1) << 63) : (uint64_t(1) << 31);
       entry = new (_alloc) ImportTableEntryAtom(context, hint, sectionName);
     } else {
       // Import by name

Modified: lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h?rev=218728&r1=218727&r2=218728&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h Tue Sep 30 20:39:34 2014
@@ -83,7 +83,7 @@ private:
 
 class ImportTableEntryAtom : public IdataAtom {
 public:
-  ImportTableEntryAtom(Context &ctx, uint32_t contents, StringRef sectionName)
+  ImportTableEntryAtom(Context &ctx, uint64_t contents, StringRef sectionName)
       : IdataAtom(ctx, assembleRawContent(contents, ctx.is64)),
         _sectionName(sectionName) {}
 
@@ -92,7 +92,7 @@ public:
   };
 
 private:
-  std::vector<uint8_t> assembleRawContent(uint32_t contents, bool is64);
+  std::vector<uint8_t> assembleRawContent(uint64_t contents, bool is64);
   StringRef _sectionName;
 };
 





More information about the llvm-commits mailing list