Skip to content

Commit a2e5287

Browse files
authored
[llvm-readobj][Object][COFF] Print COFF import library symbol export name. (#78769)
getExportName implementation is based on lld-link. In its current form, it's mostly about convenience, but it will be more useful for EXPORTAS support, for which export name is not possible to deduce from other printed properties.
1 parent 2e3de99 commit a2e5287

File tree

12 files changed

+64
-0
lines changed

12 files changed

+64
-0
lines changed

lld/test/COFF/def-export-cpp.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
# IMPLIB: File: foo.dll
1212
# IMPLIB: Name type: undecorate
13+
# IMPLIB-NEXT: Export name: GetPathOnDisk
1314
# IMPLIB-NEXT: Symbol: __imp_?GetPathOnDisk@@YA_NPEA_W@Z
1415
# IMPLIB-NEXT: Symbol: ?GetPathOnDisk@@YA_NPEA_W@Z
1516

lld/test/COFF/def-export-stdcall.s

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@
66
# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix UNDECORATED-EXPORTS %s
77

88
# UNDECORATED-IMPLIB: Name type: noprefix
9+
# UNDECORATED-IMPLIB-NEXT: Export name: _underscored
910
# UNDECORATED-IMPLIB-NEXT: __imp___underscored
1011
# UNDECORATED-IMPLIB-NEXT: __underscored
1112
# UNDECORATED-IMPLIB: Name type: undecorate
13+
# UNDECORATED-IMPLIB-NEXT: Export name: fastcall
1214
# UNDECORATED-IMPLIB-NEXT: __imp_@fastcall@8
1315
# UNDECORATED-IMPLIB-NEXT: fastcall@8
1416
# UNDECORATED-IMPLIB: Name type: undecorate
17+
# UNDECORATED-IMPLIB-NEXT: Export name: stdcall
1518
# UNDECORATED-IMPLIB-NEXT: __imp__stdcall@8
1619
# UNDECORATED-IMPLIB-NEXT: _stdcall@8
1720
# UNDECORATED-IMPLIB: Name type: undecorate
21+
# UNDECORATED-IMPLIB-NEXT: Export name: vectorcall
1822
# UNDECORATED-IMPLIB-NEXT: __imp_vectorcall@@8
1923
# UNDECORATED-IMPLIB-NEXT: vectorcall@@8
2024

@@ -30,12 +34,15 @@
3034
# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix DECORATED-EXPORTS %s
3135

3236
# DECORATED-IMPLIB: Name type: name
37+
# DECORATED-IMPLIB-NEXT: Export name: @fastcall@8
3338
# DECORATED-IMPLIB-NEXT: __imp_@fastcall@8
3439
# DECORATED-IMPLIB-NEXT: @fastcall@8
3540
# DECORATED-IMPLIB: Name type: name
41+
# DECORATED-IMPLIB-NEXT: Export name: _stdcall@8
3642
# DECORATED-IMPLIB-NEXT: __imp__stdcall@8
3743
# DECORATED-IMPLIB-NEXT: _stdcall@8
3844
# DECORATED-IMPLIB: Name type: name
45+
# DECORATED-IMPLIB-NEXT: Export name: vectorcall@@8
3946
# DECORATED-IMPLIB-NEXT: __imp_vectorcall@@8
4047
# DECORATED-IMPLIB-NEXT: vectorcall@@8
4148

@@ -51,14 +58,17 @@
5158
# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix DECORATED-MINGW-EXPORTS %s
5259

5360
# DECORATED-MINGW-IMPLIB: Name type: name
61+
# DECORATED-MINGW-IMPLIB-NEXT: Export name: @fastcall@8
5462
# DECORATED-MINGW-IMPLIB-NEXT: __imp_@fastcall@8
5563
# DECORATED-MINGW-IMPLIB-NEXT: fastcall@8
5664
# DECORATED-MINGW-IMPLIB: Name type: noprefix
65+
# DECORATED-MINGW-IMPLIB-NEXT: Export name: stdcall@8
5766
# DECORATED-MINGW-IMPLIB-NEXT: __imp__stdcall@8
5867
# DECORATED-MINGW-IMPLIB-NEXT: _stdcall@8
5968
# GNU tools don't support vectorcall, but this test is just to track that
6069
# lld's behaviour remains consistent over time.
6170
# DECORATED-MINGW-IMPLIB: Name type: name
71+
# DECORATED-MINGW-IMPLIB-NEXT: Export name: vectorcall@@8
6272
# DECORATED-MINGW-IMPLIB-NEXT: __imp_vectorcall@@8
6373
# DECORATED-MINGW-IMPLIB-NEXT: vectorcall@@8
6474

@@ -75,14 +85,17 @@
7585
# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix MINGW-KILL-AT-EXPORTS %s
7686

7787
# MINGW-KILL-AT-IMPLIB: Name type: noprefix
88+
# MINGW-KILL-AT-IMPLIB: Export name: fastcall
7889
# MINGW-KILL-AT-IMPLIB: __imp__fastcall
7990
# MINGW-KILL-AT-IMPLIB-NEXT: _fastcall
8091
# MINGW-KILL-AT-IMPLIB: Name type: noprefix
92+
# MINGW-KILL-AT-IMPLIB-NEXT: Export name: stdcall
8193
# MINGW-KILL-AT-IMPLIB-NEXT: __imp__stdcall
8294
# MINGW-KILL-AT-IMPLIB-NEXT: _stdcall
8395
# GNU tools don't support vectorcall, but this test is just to track that
8496
# lld's behaviour remains consistent over time.
8597
# MINGW-KILL-AT-IMPLIB: Name type: noprefix
98+
# MINGW-KILL-AT-IMPLIB-NEXT: Export name: vectorcall
8699
# MINGW-KILL-AT-IMPLIB-NEXT: __imp__vectorcall
87100
# MINGW-KILL-AT-IMPLIB-NEXT: _vectorcall
88101

lld/test/COFF/dllexport.s

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@
66
# RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix DECORATED-EXPORTS %s
77

88
# DECORATED-IMPLIB: Name type: name
9+
# DECORATED-IMPLIB-NEXT: Export name: @fastcall@8
910
# DECORATED-IMPLIB-NEXT: __imp_@fastcall@8
1011
# DECORATED-IMPLIB-NEXT: @fastcall@8
1112
# DECORATED-IMPLIB: Name type: name
13+
# DECORATED-IMPLIB-NEXT: Export name: _stdcall@8
1214
# DECORATED-IMPLIB-NEXT: __imp__stdcall@8
1315
# DECORATED-IMPLIB-NEXT: _stdcall@8
1416
# DECORATED-IMPLIB: Name type: noprefix
17+
# DECORATED-IMPLIB-NEXT: Export name: _underscored
1518
# DECORATED-IMPLIB-NEXT: __imp___underscored
1619
# DECORATED-IMPLIB-NEXT: __underscored
1720
# DECORATED-IMPLIB: Name type: name
21+
# DECORATED-IMPLIB-NEXT: Export name: vectorcall@@8
1822
# DECORATED-IMPLIB-NEXT: __imp_vectorcall@@8
1923
# DECORATED-IMPLIB-NEXT: vectorcall@@8
2024

llvm/include/llvm/Object/COFFImportFile.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class COFFImportFile : public SymbolicFile {
6666
uint16_t getMachine() const { return getCOFFImportHeader()->Machine; }
6767

6868
StringRef getFileFormatName() const;
69+
StringRef getExportName() const;
6970

7071
private:
7172
bool isData() const {

llvm/lib/Object/COFFImportFile.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,32 @@ StringRef COFFImportFile::getFileFormatName() const {
5252
}
5353
}
5454

55+
StringRef COFFImportFile::getExportName() const {
56+
const coff_import_header *hdr = getCOFFImportHeader();
57+
StringRef name = Data.getBuffer().substr(sizeof(*hdr)).split('\0').first;
58+
59+
auto ltrim1 = [](StringRef s, StringRef chars) {
60+
return !s.empty() && chars.contains(s[0]) ? s.substr(1) : s;
61+
};
62+
63+
switch (hdr->getNameType()) {
64+
case IMPORT_ORDINAL:
65+
name = "";
66+
break;
67+
case IMPORT_NAME_NOPREFIX:
68+
name = ltrim1(name, "?@_");
69+
break;
70+
case IMPORT_NAME_UNDECORATE:
71+
name = ltrim1(name, "?@_");
72+
name = name.substr(0, name.find('@'));
73+
break;
74+
default:
75+
break;
76+
}
77+
78+
return name;
79+
}
80+
5581
static uint16_t getImgRelRelocation(MachineTypes Machine) {
5682
switch (Machine) {
5783
default:

llvm/test/tools/llvm-dlltool/coff-decorated.def

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,32 @@ OtherStdcallExportName@4=CdeclInternalFunction
1414
CdeclExportName=StdcallInternalFunction@4
1515

1616
; CHECK: Name type: noprefix
17+
; CHECK-NEXT: Export name: CdeclFunction
1718
; CHECK-NEXT: Symbol: __imp__CdeclFunction
1819
; CHECK-NEXT: Symbol: _CdeclFunction
1920
; CHECK: Name type: undecorate
21+
; CHECK-NEXT: Export name: StdcallFunction
2022
; CHECK-NEXT: Symbol: __imp__StdcallFunction@4
2123
; CHECK-NEXT: Symbol: _StdcallFunction@4
2224
; CHECK: Name type: undecorate
25+
; CHECK-NEXT: Export name: FastcallFunction
2326
; CHECK-NEXT: Symbol: __imp_@FastcallFunction@4
2427
; CHECK-NEXT: Symbol: @FastcallFunction@4
2528
; CHECK: Name type: name
29+
; CHECK-NEXT: Export name: ??_7exception@@6B@
2630
; CHECK-NEXT: Symbol: __imp_??_7exception@@6B@
2731
; CHECK-NEXT: Symbol: ??_7exception@@6B@
2832
; CHECK-NM: W _StdcallAlias@4
2933
; CHECK-NM: U _StdcallFunction@4
3034
; CHECK: Name type: undecorate
35+
; CHECK-NEXT: Export name: StdcallExportName
3136
; CHECK-NEXT: Symbol: __imp__StdcallExportName@4{{$}}
3237
; CHECK-NEXT: Symbol: _StdcallExportName@4{{$}}
3338
; CHECK: Name type: undecorate
39+
; CHECK-NEXT: Export name: OtherStdcallExportName
3440
; CHECK-NEXT: Symbol: __imp__OtherStdcallExportName@4{{$}}
3541
; CHECK-NEXT: Symbol: _OtherStdcallExportName@4{{$}}
3642
; CHECK: Name type: noprefix
43+
; CHECK-NEXT: Export name: CdeclExportName
3744
; CHECK-NEXT: Symbol: __imp__CdeclExportName
3845
; CHECK-NEXT: Symbol: _CdeclExportName

llvm/test/tools/llvm-dlltool/coff-exports.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ AnotherFunction
1717
; CHECK-ARM64: Format: COFF-import-file-ARM64
1818
; CHECK: Type: code
1919
; CHECK: Name type: name
20+
; CHECK-NEXT: Export name: TestFunction1
2021
; CHECK-NEXT: Symbol: __imp_TestFunction1
2122
; CHECK-NEXT: Symbol: TestFunction1
2223
; CHECK: Name type: name
24+
; CHECK-NEXT: Export name: TestFunction2
2325
; CHECK-NEXT: Symbol: __imp_TestFunction2{{$}}
2426
; CHECK-NEXT: Symbol: TestFunction2{{$}}
2527
; CHECK: Name type: name
28+
; CHECK-NEXT: Export name: TestFunction3
2629
; CHECK-NEXT: Symbol: __imp_TestFunction3{{$}}
2730
; CHECK-NEXT: Symbol: TestFunction3{{$}}
2831

llvm/test/tools/llvm-dlltool/coff-noname.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ ByNameFunction
1212
; CHECK-NEXT: Symbol: __imp__ByOrdinalFunction
1313
; CHECK-NEXT: Symbol: _ByOrdinalFunction
1414
; CHECK: Name type: noprefix
15+
; CHECK-NEXT: Export name: ByNameFunction
1516
; CHECK-NEXT: Symbol: __imp__ByNameFunction
1617
; CHECK-NEXT: Symbol: _ByNameFunction

llvm/test/tools/llvm-dlltool/no-leading-underscore.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ alias == func
99
DecoratedFunction@4
1010

1111
; CHECK: Name type: name
12+
; CHECK-NEXT: Export name: func
1213
; CHECK-NEXT: Symbol: __imp_func
1314
; CHECK-NEXT: Symbol: func
1415
; CHECK: Name type: undecorate
16+
; CHECK-NEXT: Export name: DecoratedFunction
1517
; CHECK-NEXT: Symbol: __imp_DecoratedFunction@4
1618
; CHECK-NEXT: Symbol: DecoratedFunction@4
1719

llvm/test/tools/llvm-lib/arm64ec-implib.test

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ READOBJ-NEXT: File: test.dll
3636
READOBJ-NEXT: Format: COFF-import-file-ARM64EC
3737
READOBJ-NEXT: Type: code
3838
READOBJ-NEXT: Name type: name
39+
READOBJ-NEXT: Export name: funcexp
3940
READOBJ-NEXT: Symbol: __imp_funcexp
4041
READOBJ-NEXT: Symbol: funcexp
4142
READOBJ-EMPTY:
4243
READOBJ-NEXT: File: test.dll
4344
READOBJ-NEXT: Format: COFF-import-file-ARM64EC
4445
READOBJ-NEXT: Type: data
4546
READOBJ-NEXT: Name type: name
47+
READOBJ-NEXT: Export name: dataexp
4648
READOBJ-NEXT: Symbol: __imp_dataexp
4749

4850
Creating a new lib containing the existing lib:

llvm/test/tools/llvm-readobj/COFF/file-headers.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ symbols:
323323
# IMPORTLIB:Format: COFF-import-file-i386
324324
# IMPORTLIB-NEXT:Type: code
325325
# IMPORTLIB-NEXT:Name type: noprefix
326+
# IMPORTLIB-NEXT:Export name: func
326327
# IMPORTLIB-NEXT:Symbol: __imp__func
327328
# IMPORTLIB-NEXT:Symbol: _func
328329
# IMPORTLIB-NOT:{{.}}

llvm/tools/llvm-readobj/COFFImportDumper.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ void dumpCOFFImportFile(const COFFImportFile *File, ScopedPrinter &Writer) {
4747
break;
4848
}
4949

50+
if (H->getNameType() != COFF::IMPORT_ORDINAL)
51+
Writer.printString("Export name", File->getExportName());
52+
5053
for (const object::BasicSymbolRef &Sym : File->symbols()) {
5154
raw_ostream &OS = Writer.startLine();
5255
OS << "Symbol: ";

0 commit comments

Comments
 (0)