Skip to content

Commit c9d1266

Browse files
authored
[llvm-dlltool][llvm-lib][COFF] Don't override NONAME exports with demangled ARM64EC symbols. (#86722)
1 parent cc23ee8 commit c9d1266

File tree

2 files changed

+95
-2
lines changed

2 files changed

+95
-2
lines changed

llvm/lib/Object/COFFImportFile.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -690,12 +690,12 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path,
690690
if (ImportType == IMPORT_CODE && isArm64EC(M)) {
691691
if (std::optional<std::string> MangledName =
692692
getArm64ECMangledFunctionName(Name)) {
693-
if (ExportName.empty()) {
693+
if (!E.Noname && ExportName.empty()) {
694694
NameType = IMPORT_NAME_EXPORTAS;
695695
ExportName.swap(Name);
696696
}
697697
Name = std::move(*MangledName);
698-
} else if (ExportName.empty()) {
698+
} else if (!E.Noname && ExportName.empty()) {
699699
NameType = IMPORT_NAME_EXPORTAS;
700700
ExportName = std::move(*getArm64ECDemangledFunctionName(Name));
701701
}

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

+93
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ ARMAP-NEXT: Archive EC map
1414
ARMAP-NEXT: #expname in test.dll
1515
ARMAP-NEXT: #funcexp in test.dll
1616
ARMAP-NEXT: #mangledfunc in test.dll
17+
ARMAP-NEXT: #manglednonamefunc in test.dll
18+
ARMAP-NEXT: #nonamefunc in test.dll
1719
ARMAP-NEXT: ?test_cpp_func@@$$hYAHPEAX@Z in test.dll
1820
ARMAP-NEXT: ?test_cpp_func@@YAHPEAX@Z in test.dll
1921
ARMAP-NEXT: __IMPORT_DESCRIPTOR_test in test.dll
@@ -23,13 +25,19 @@ ARMAP-NEXT: __imp_aux_?test_cpp_func@@YAHPEAX@Z in test.dll
2325
ARMAP-NEXT: __imp_aux_expname in test.dll
2426
ARMAP-NEXT: __imp_aux_funcexp in test.dll
2527
ARMAP-NEXT: __imp_aux_mangledfunc in test.dll
28+
ARMAP-NEXT: __imp_aux_manglednonamefunc in test.dll
29+
ARMAP-NEXT: __imp_aux_nonamefunc in test.dll
2630
ARMAP-NEXT: __imp_dataexp in test.dll
2731
ARMAP-NEXT: __imp_expname in test.dll
2832
ARMAP-NEXT: __imp_funcexp in test.dll
2933
ARMAP-NEXT: __imp_mangledfunc in test.dll
34+
ARMAP-NEXT: __imp_manglednonamefunc in test.dll
35+
ARMAP-NEXT: __imp_nonamefunc in test.dll
3036
ARMAP-NEXT: expname in test.dll
3137
ARMAP-NEXT: funcexp in test.dll
3238
ARMAP-NEXT: mangledfunc in test.dll
39+
ARMAP-NEXT: manglednonamefunc in test.dll
40+
ARMAP-NEXT: nonamefunc in test.dll
3341
ARMAP-NEXT: test_NULL_THUNK_DATA in test.dll
3442

3543
RUN: llvm-readobj test.lib | FileCheck -check-prefix=READOBJ %s
@@ -95,6 +103,25 @@ READOBJ-NEXT: Type: data
95103
READOBJ-NEXT: Name type: name
96104
READOBJ-NEXT: Export name: dataexp
97105
READOBJ-NEXT: Symbol: __imp_dataexp
106+
READOBJ-EMPTY:
107+
READOBJ-NEXT: File: test.dll
108+
READOBJ-NEXT: Format: COFF-import-file-ARM64EC
109+
READOBJ-NEXT: Type: code
110+
READOBJ-NEXT: Name type: ordinal
111+
READOBJ-NEXT: Symbol: __imp_nonamefunc
112+
READOBJ-NEXT: Symbol: nonamefunc
113+
READOBJ-NEXT: Symbol: __imp_aux_nonamefunc
114+
READOBJ-NEXT: Symbol: #nonamefunc
115+
READOBJ-EMPTY:
116+
READOBJ-NEXT: File: test.dll
117+
READOBJ-NEXT: Format: COFF-import-file-ARM64EC
118+
READOBJ-NEXT: Type: code
119+
READOBJ-NEXT: Name type: ordinal
120+
READOBJ-NEXT: Symbol: __imp_manglednonamefunc
121+
READOBJ-NEXT: Symbol: manglednonamefunc
122+
READOBJ-NEXT: Symbol: __imp_aux_manglednonamefunc
123+
READOBJ-NEXT: Symbol: #manglednonamefunc
124+
98125

99126
Using -machine:arm64x gives the same output.
100127
RUN: llvm-lib -machine:arm64x -def:test.def -out:testx.lib
@@ -112,22 +139,28 @@ RUN: llvm-nm --print-armap testx.lib | FileCheck -check-prefix=ARMAPX %s
112139

113140
ARMAPX: Archive map
114141
ARMAPX-NEXT: #mangledfunc in test.dll
142+
ARMAPX-NEXT: #manglednonamefunc in test.dll
115143
ARMAPX-NEXT: ?test_cpp_func@@YAHPEAX@Z in test.dll
116144
ARMAPX-NEXT: __IMPORT_DESCRIPTOR_test in test.dll
117145
ARMAPX-NEXT: __NULL_IMPORT_DESCRIPTOR in test.dll
118146
ARMAPX-NEXT: __imp_#mangledfunc in test.dll
147+
ARMAPX-NEXT: __imp_#manglednonamefunc in test.dll
119148
ARMAPX-NEXT: __imp_?test_cpp_func@@YAHPEAX@Z in test.dll
120149
ARMAPX-NEXT: __imp_dataexp in test.dll
121150
ARMAPX-NEXT: __imp_expname in test.dll
122151
ARMAPX-NEXT: __imp_funcexp in test.dll
152+
ARMAPX-NEXT: __imp_nonamefunc in test.dll
123153
ARMAPX-NEXT: expname in test.dll
124154
ARMAPX-NEXT: funcexp in test.dll
155+
ARMAPX-NEXT: nonamefunc in test.dll
125156
ARMAPX-NEXT: test_NULL_THUNK_DATA in test.dll
126157
ARMAPX-EMPTY:
127158
ARMAPX-NEXT: Archive EC map
128159
ARMAPX-NEXT: #expname in test.dll
129160
ARMAPX-NEXT: #funcexp in test.dll
130161
ARMAPX-NEXT: #mangledfunc in test.dll
162+
ARMAPX-NEXT: #manglednonamefunc in test.dll
163+
ARMAPX-NEXT: #nonamefunc in test.dll
131164
ARMAPX-NEXT: ?test_cpp_func@@$$hYAHPEAX@Z in test.dll
132165
ARMAPX-NEXT: ?test_cpp_func@@YAHPEAX@Z in test.dll
133166
ARMAPX-NEXT: __IMPORT_DESCRIPTOR_test in test.dll
@@ -137,13 +170,19 @@ ARMAPX-NEXT: __imp_aux_?test_cpp_func@@YAHPEAX@Z in test.dll
137170
ARMAPX-NEXT: __imp_aux_expname in test.dll
138171
ARMAPX-NEXT: __imp_aux_funcexp in test.dll
139172
ARMAPX-NEXT: __imp_aux_mangledfunc in test.dll
173+
ARMAPX-NEXT: __imp_aux_manglednonamefunc in test.dll
174+
ARMAPX-NEXT: __imp_aux_nonamefunc in test.dll
140175
ARMAPX-NEXT: __imp_dataexp in test.dll
141176
ARMAPX-NEXT: __imp_expname in test.dll
142177
ARMAPX-NEXT: __imp_funcexp in test.dll
143178
ARMAPX-NEXT: __imp_mangledfunc in test.dll
179+
ARMAPX-NEXT: __imp_manglednonamefunc in test.dll
180+
ARMAPX-NEXT: __imp_nonamefunc in test.dll
144181
ARMAPX-NEXT: expname in test.dll
145182
ARMAPX-NEXT: funcexp in test.dll
146183
ARMAPX-NEXT: mangledfunc in test.dll
184+
ARMAPX-NEXT: manglednonamefunc in test.dll
185+
ARMAPX-NEXT: nonamefunc in test.dll
147186
ARMAPX-NEXT: test_NULL_THUNK_DATA in test.dll
148187

149188
RUN: llvm-readobj testx.lib | FileCheck -check-prefix=READOBJX %s
@@ -211,6 +250,24 @@ READOBJX-NEXT: Export name: dataexp
211250
READOBJX-NEXT: Symbol: __imp_dataexp
212251
READOBJX-EMPTY:
213252
READOBJX-NEXT: File: test.dll
253+
READOBJX-NEXT: Format: COFF-import-file-ARM64EC
254+
READOBJX-NEXT: Type: code
255+
READOBJX-NEXT: Name type: ordinal
256+
READOBJX-NEXT: Symbol: __imp_nonamefunc
257+
READOBJX-NEXT: Symbol: nonamefunc
258+
READOBJX-NEXT: Symbol: __imp_aux_nonamefunc
259+
READOBJX-NEXT: Symbol: #nonamefunc
260+
READOBJX-EMPTY:
261+
READOBJX-NEXT: File: test.dll
262+
READOBJX-NEXT: Format: COFF-import-file-ARM64EC
263+
READOBJX-NEXT: Type: code
264+
READOBJX-NEXT: Name type: ordinal
265+
READOBJX-NEXT: Symbol: __imp_manglednonamefunc
266+
READOBJX-NEXT: Symbol: manglednonamefunc
267+
READOBJX-NEXT: Symbol: __imp_aux_manglednonamefunc
268+
READOBJX-NEXT: Symbol: #manglednonamefunc
269+
READOBJX-EMPTY:
270+
READOBJX-NEXT: File: test.dll
214271
READOBJX-NEXT: Format: COFF-import-file-ARM64
215272
READOBJX-NEXT: Type: code
216273
READOBJX-NEXT: Name type: name
@@ -248,6 +305,20 @@ READOBJX-NEXT: Type: data
248305
READOBJX-NEXT: Name type: name
249306
READOBJX-NEXT: Export name: dataexp
250307
READOBJX-NEXT: Symbol: __imp_dataexp
308+
READOBJX-EMPTY:
309+
READOBJX-NEXT: File: test.dll
310+
READOBJX-NEXT: Format: COFF-import-file-ARM64
311+
READOBJX-NEXT: Type: code
312+
READOBJX-NEXT: Name type: ordinal
313+
READOBJX-NEXT: Symbol: __imp_nonamefunc
314+
READOBJX-NEXT: Symbol: nonamefunc
315+
READOBJX-EMPTY:
316+
READOBJX-NEXT: File: test.dll
317+
READOBJX-NEXT: Format: COFF-import-file-ARM64
318+
READOBJX-NEXT: Type: code
319+
READOBJX-NEXT: Name type: ordinal
320+
READOBJX-NEXT: Symbol: __imp_#manglednonamefunc
321+
READOBJX-NEXT: Symbol: #manglednonamefunc
251322

252323

253324
RUN: llvm-lib -machine:arm64ec -def:test.def -defArm64Native:test2.def -out:test2.lib
@@ -266,6 +337,8 @@ ARMAPX2-NEXT: Archive EC map
266337
ARMAPX2-NEXT: #expname in test2.dll
267338
ARMAPX2-NEXT: #funcexp in test2.dll
268339
ARMAPX2-NEXT: #mangledfunc in test2.dll
340+
ARMAPX2-NEXT: #manglednonamefunc in test2.dll
341+
ARMAPX2-NEXT: #nonamefunc in test2.dll
269342
ARMAPX2-NEXT: ?test_cpp_func@@$$hYAHPEAX@Z in test2.dll
270343
ARMAPX2-NEXT: ?test_cpp_func@@YAHPEAX@Z in test2.dll
271344
ARMAPX2-NEXT: __IMPORT_DESCRIPTOR_test2 in test2.dll
@@ -275,13 +348,19 @@ ARMAPX2-NEXT: __imp_aux_?test_cpp_func@@YAHPEAX@Z in test2.dll
275348
ARMAPX2-NEXT: __imp_aux_expname in test2.dll
276349
ARMAPX2-NEXT: __imp_aux_funcexp in test2.dll
277350
ARMAPX2-NEXT: __imp_aux_mangledfunc in test2.dll
351+
ARMAPX2-NEXT: __imp_aux_manglednonamefunc in test2.dll
352+
ARMAPX2-NEXT: __imp_aux_nonamefunc in test2.dll
278353
ARMAPX2-NEXT: __imp_dataexp in test2.dll
279354
ARMAPX2-NEXT: __imp_expname in test2.dll
280355
ARMAPX2-NEXT: __imp_funcexp in test2.dll
281356
ARMAPX2-NEXT: __imp_mangledfunc in test2.dll
357+
ARMAPX2-NEXT: __imp_manglednonamefunc in test2.dll
358+
ARMAPX2-NEXT: __imp_nonamefunc in test2.dll
282359
ARMAPX2-NEXT: expname in test2.dll
283360
ARMAPX2-NEXT: funcexp in test2.dll
284361
ARMAPX2-NEXT: mangledfunc in test2.dll
362+
ARMAPX2-NEXT: manglednonamefunc in test2.dll
363+
ARMAPX2-NEXT: nonamefunc in test2.dll
285364
ARMAPX2-NEXT: test2_NULL_THUNK_DATA in test2.dll
286365

287366
ARMAPX2: test2.dll:
@@ -312,6 +391,18 @@ ARMAPX2-NEXT: test2.dll:
312391
ARMAPX2-NEXT: 00000000 D __imp_dataexp
313392
ARMAPX2-EMPTY:
314393
ARMAPX2-NEXT: test2.dll:
394+
ARMAPX2-NEXT: 00000000 T #nonamefunc
395+
ARMAPX2-NEXT: 00000000 T __imp_aux_nonamefunc
396+
ARMAPX2-NEXT: 00000000 T __imp_nonamefunc
397+
ARMAPX2-NEXT: 00000000 T nonamefunc
398+
ARMAPX2-EMPTY:
399+
ARMAPX2-NEXT: test2.dll:
400+
ARMAPX2-NEXT: 00000000 T #manglednonamefunc
401+
ARMAPX2-NEXT: 00000000 T __imp_aux_manglednonamefunc
402+
ARMAPX2-NEXT: 00000000 T __imp_manglednonamefunc
403+
ARMAPX2-NEXT: 00000000 T manglednonamefunc
404+
ARMAPX2-EMPTY:
405+
ARMAPX2-NEXT: test2.dll:
315406
ARMAPX2-NEXT: 00000000 T __imp_otherfunc
316407
ARMAPX2-NEXT: 00000000 T otherfunc
317408

@@ -406,6 +497,8 @@ EXPORTS
406497
?test_cpp_func@@YAHPEAX@Z
407498
expname=impname
408499
dataexp DATA
500+
nonamefunc @1 NONAME
501+
#manglednonamefunc @2 NONAME
409502

410503
#--- test2.def
411504
LIBRARY test2.dll

0 commit comments

Comments
 (0)