diff --git a/lld/test/COFF/export.test b/lld/test/COFF/export.test --- a/lld/test/COFF/export.test +++ b/lld/test/COFF/export.test @@ -15,10 +15,6 @@ CHECK2: Export Table: CHECK2: DLL name: export.test.tmp.dll CHECK2: Ordinal RVA Name -CHECK2-NEXT: 1 0 -CHECK2-NEXT: 2 0 -CHECK2-NEXT: 3 0 -CHECK2-NEXT: 4 0 CHECK2-NEXT: 5 0x1008 exportfn1 CHECK2-NEXT: 6 0x1010 exportfn2 CHECK2-NEXT: 7 0x1010 exportfn3 @@ -29,10 +25,6 @@ CHECK3: Export Table: CHECK3: DLL name: export.test.tmp.dll CHECK3: Ordinal RVA Name -CHECK3-NEXT: 1 0 -CHECK3-NEXT: 2 0 -CHECK3-NEXT: 3 0 -CHECK3-NEXT: 4 0 CHECK3-NEXT: 5 0x1008 CHECK3-NEXT: 6 0x1010 exportfn2 @@ -57,7 +49,6 @@ CHECK5: Export Table: CHECK5: DLL name: export.test.tmp.dll CHECK5: Ordinal RVA Name -CHECK5-NEXT: 1 0 CHECK5-NEXT: 2 0x1010 fn2 CHECK5-NEXT: 3 0x1008 exportfn1 CHECK5-NEXT: 4 0x1010 exportfn3 diff --git a/lld/test/COFF/export32.test b/lld/test/COFF/export32.test --- a/lld/test/COFF/export32.test +++ b/lld/test/COFF/export32.test @@ -26,10 +26,6 @@ # CHECK2: Export Table: # CHECK2: DLL name: export32.test.tmp.dll # CHECK2: Ordinal RVA Name -# CHECK2-NEXT: 1 0 -# CHECK2-NEXT: 2 0 -# CHECK2-NEXT: 3 0 -# CHECK2-NEXT: 4 0 # CHECK2-NEXT: 5 0x1008 exportfn1 # CHECK2-NEXT: 6 0x1010 exportfn2 # CHECK2-NEXT: 7 0x1010 exportfn3 @@ -41,10 +37,6 @@ # CHECK3: Export Table: # CHECK3: DLL name: export32.test.tmp.dll # CHECK3: Ordinal RVA Name -# CHECK3-NEXT: 1 0 -# CHECK3-NEXT: 2 0 -# CHECK3-NEXT: 3 0 -# CHECK3-NEXT: 4 0 # CHECK3-NEXT: 5 0x1008 # CHECK3-NEXT: 6 0x1010 exportfn2 @@ -71,7 +63,6 @@ # CHECK5: Export Table: # CHECK5: DLL name: export32.test.tmp.dll # CHECK5: Ordinal RVA Name -# CHECK5-NEXT: 1 0 # CHECK5-NEXT: 2 0x1010 fn2 # CHECK5-NEXT: 3 0x1008 exportfn1 # CHECK5-NEXT: 4 0x1010 exportfn3 @@ -89,7 +80,7 @@ # CHECK7: Export Table: # CHECK7: DLL name: export32.test.tmp.dll # CHECK7: Ordinal RVA Name -# CHECK7-NEXT: 1 0 +# CHECK7-NEXT: 1 0x1010 exportfn3 # CHECK7-NEXT: 2 0x1010 foo --- !COFF diff --git a/llvm/include/llvm/Object/COFF.h b/llvm/include/llvm/Object/COFF.h --- a/llvm/include/llvm/Object/COFF.h +++ b/llvm/include/llvm/Object/COFF.h @@ -1177,6 +1177,8 @@ bool operator==(const ExportDirectoryEntryRef &Other) const; void moveNext(); + Error isEmpty(bool &Result) const; + Error getDllName(StringRef &Result) const; Error getOrdinalBase(uint32_t &Result) const; Error getOrdinal(uint32_t &Result) const; diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -1559,6 +1559,17 @@ ++Index; } +Error ExportDirectoryEntryRef::isEmpty(bool &Result) const { + uint32_t RVA; + if (Error EC = getExportRVA(RVA)) + return EC; + uintptr_t IntPtr = 0; + Error E = OwningObject->getRvaPtr(RVA, IntPtr); + Result = (bool)E; + consumeError(std::move(E)); + return Error::success(); +} + // Returns the name of the current export symbol. If the symbol is exported only // by ordinal, the empty string is set as a result. Error ExportDirectoryEntryRef::getDllName(StringRef &Result) const { diff --git a/llvm/tools/llvm-objdump/COFFDump.cpp b/llvm/tools/llvm-objdump/COFFDump.cpp --- a/llvm/tools/llvm-objdump/COFFDump.cpp +++ b/llvm/tools/llvm-objdump/COFFDump.cpp @@ -545,6 +545,11 @@ outs() << " Ordinal base: " << OrdinalBase << "\n"; outs() << " Ordinal RVA Name\n"; for (; I != E; I = ++I) { + bool Empty; + if (I->isEmpty(Empty)) + return; + if (Empty) + continue; uint32_t Ordinal; if (I->getOrdinal(Ordinal)) return; @@ -559,9 +564,9 @@ // Export table entries can be used to re-export symbols that // this COFF file is imported from some DLLs. This is rare. // In most cases IsForwarder is false. - outs() << format(" % 4d ", Ordinal); + outs() << format(" %5d ", Ordinal); } else { - outs() << format(" % 4d %# 8x", Ordinal, RVA); + outs() << format(" %5d %# 8x", Ordinal, RVA); } StringRef Name;