From 14798caac6935bec50abac2b6419c75331989f7a Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 1 Oct 2014 01:39:34 +0000 Subject: [PATCH] [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. llvm-svn: 218728 --- lld/lib/ReaderWriter/PECOFF/IdataPass.cpp | 5 +++-- lld/lib/ReaderWriter/PECOFF/IdataPass.h | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp b/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp index afa95ed169a1..2145b803c931 100644 --- a/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp +++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp @@ -51,7 +51,7 @@ std::vector HintNameAtom::assembleRawContent(uint16_t hint, } std::vector -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 ImportDirectoryAtom::createImportTableAtoms( 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 diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.h b/lld/lib/ReaderWriter/PECOFF/IdataPass.h index 9f4f16589511..5fac74dc2cbd 100644 --- a/lld/lib/ReaderWriter/PECOFF/IdataPass.h +++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.h @@ -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 assembleRawContent(uint32_t contents, bool is64); + std::vector assembleRawContent(uint64_t contents, bool is64); StringRef _sectionName; };