Skip to content

Commit 80fcf48

Browse files
authored
[llvm-lib][Object][COFF] Use ARM64 machine type for import library descriptor objects. (#78537)
1 parent 5c150e7 commit 80fcf48

File tree

2 files changed

+42
-31
lines changed

2 files changed

+42
-31
lines changed

llvm/lib/Object/COFFImportFile.cpp

+35-26
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ namespace {
150150
class ObjectFactory {
151151
using u16 = support::ulittle16_t;
152152
using u32 = support::ulittle32_t;
153-
MachineTypes Machine;
153+
MachineTypes NativeMachine;
154154
BumpPtrAllocator Alloc;
155155
StringRef ImportName;
156156
StringRef Library;
@@ -159,7 +159,7 @@ class ObjectFactory {
159159

160160
public:
161161
ObjectFactory(StringRef S, MachineTypes M)
162-
: Machine(M), ImportName(S), Library(llvm::sys::path::stem(S)),
162+
: NativeMachine(M), ImportName(S), Library(llvm::sys::path::stem(S)),
163163
ImportDescriptorSymbolName(("__IMPORT_DESCRIPTOR_" + Library).str()),
164164
NullThunkSymbolName(("\x7f" + Library + "_NULL_THUNK_DATA").str()) {}
165165

@@ -182,10 +182,14 @@ class ObjectFactory {
182182
// Create a short import file which is described in PE/COFF spec 7. Import
183183
// Library Format.
184184
NewArchiveMember createShortImport(StringRef Sym, uint16_t Ordinal,
185-
ImportType Type, ImportNameType NameType);
185+
ImportType Type, ImportNameType NameType,
186+
MachineTypes Machine);
186187

187188
// Create a weak external file which is described in PE/COFF Aux Format 3.
188-
NewArchiveMember createWeakExternal(StringRef Sym, StringRef Weak, bool Imp);
189+
NewArchiveMember createWeakExternal(StringRef Sym, StringRef Weak, bool Imp,
190+
MachineTypes Machine);
191+
192+
bool is64Bit() const { return COFF::is64Bit(NativeMachine); }
189193
};
190194
} // namespace
191195

@@ -197,7 +201,7 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) {
197201

198202
// COFF Header
199203
coff_file_header Header{
200-
u16(Machine),
204+
u16(NativeMachine),
201205
u16(NumberOfSections),
202206
u32(0),
203207
u32(sizeof(Header) + (NumberOfSections * sizeof(coff_section)) +
@@ -208,7 +212,7 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) {
208212
(ImportName.size() + 1)),
209213
u32(NumberOfSymbols),
210214
u16(0),
211-
u16(is64Bit(Machine) ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
215+
u16(is64Bit() ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
212216
};
213217
append(Buffer, Header);
214218

@@ -250,11 +254,11 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) {
250254

251255
const coff_relocation RelocationTable[NumberOfRelocations] = {
252256
{u32(offsetof(coff_import_directory_table_entry, NameRVA)), u32(2),
253-
u16(getImgRelRelocation(Machine))},
257+
u16(getImgRelRelocation(NativeMachine))},
254258
{u32(offsetof(coff_import_directory_table_entry, ImportLookupTableRVA)),
255-
u32(3), u16(getImgRelRelocation(Machine))},
259+
u32(3), u16(getImgRelRelocation(NativeMachine))},
256260
{u32(offsetof(coff_import_directory_table_entry, ImportAddressTableRVA)),
257-
u32(4), u16(getImgRelRelocation(Machine))},
261+
u32(4), u16(getImgRelRelocation(NativeMachine))},
258262
};
259263
append(Buffer, RelocationTable);
260264

@@ -336,15 +340,15 @@ ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) {
336340

337341
// COFF Header
338342
coff_file_header Header{
339-
u16(Machine),
343+
u16(NativeMachine),
340344
u16(NumberOfSections),
341345
u32(0),
342346
u32(sizeof(Header) + (NumberOfSections * sizeof(coff_section)) +
343347
// .idata$3
344348
sizeof(coff_import_directory_table_entry)),
345349
u32(NumberOfSymbols),
346350
u16(0),
347-
u16(is64Bit(Machine) ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
351+
u16(is64Bit() ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
348352
};
349353
append(Buffer, Header);
350354

@@ -393,11 +397,11 @@ ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) {
393397
NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
394398
const uint32_t NumberOfSections = 2;
395399
const uint32_t NumberOfSymbols = 1;
396-
uint32_t VASize = is64Bit(Machine) ? 8 : 4;
400+
uint32_t VASize = is64Bit() ? 8 : 4;
397401

398402
// COFF Header
399403
coff_file_header Header{
400-
u16(Machine),
404+
u16(NativeMachine),
401405
u16(NumberOfSections),
402406
u32(0),
403407
u32(sizeof(Header) + (NumberOfSections * sizeof(coff_section)) +
@@ -407,7 +411,7 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
407411
VASize),
408412
u32(NumberOfSymbols),
409413
u16(0),
410-
u16(is64Bit(Machine) ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
414+
u16(is64Bit() ? C_Invalid : IMAGE_FILE_32BIT_MACHINE),
411415
};
412416
append(Buffer, Header);
413417

@@ -422,8 +426,7 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
422426
u32(0),
423427
u16(0),
424428
u16(0),
425-
u32((is64Bit(Machine) ? IMAGE_SCN_ALIGN_8BYTES
426-
: IMAGE_SCN_ALIGN_4BYTES) |
429+
u32((is64Bit() ? IMAGE_SCN_ALIGN_8BYTES : IMAGE_SCN_ALIGN_4BYTES) |
427430
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
428431
IMAGE_SCN_MEM_WRITE)},
429432
{{'.', 'i', 'd', 'a', 't', 'a', '$', '4'},
@@ -436,21 +439,20 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
436439
u32(0),
437440
u16(0),
438441
u16(0),
439-
u32((is64Bit(Machine) ? IMAGE_SCN_ALIGN_8BYTES
440-
: IMAGE_SCN_ALIGN_4BYTES) |
442+
u32((is64Bit() ? IMAGE_SCN_ALIGN_8BYTES : IMAGE_SCN_ALIGN_4BYTES) |
441443
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
442444
IMAGE_SCN_MEM_WRITE)},
443445
};
444446
append(Buffer, SectionTable);
445447

446448
// .idata$5, ILT
447449
append(Buffer, u32(0));
448-
if (is64Bit(Machine))
450+
if (is64Bit())
449451
append(Buffer, u32(0));
450452

451453
// .idata$4, IAT
452454
append(Buffer, u32(0));
453-
if (is64Bit(Machine))
455+
if (is64Bit())
454456
append(Buffer, u32(0));
455457

456458
// Symbol Table
@@ -475,7 +477,8 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
475477
NewArchiveMember ObjectFactory::createShortImport(StringRef Sym,
476478
uint16_t Ordinal,
477479
ImportType ImportType,
478-
ImportNameType NameType) {
480+
ImportNameType NameType,
481+
MachineTypes Machine) {
479482
size_t ImpSize = ImportName.size() + Sym.size() + 2; // +2 for NULs
480483
size_t Size = sizeof(coff_import_header) + ImpSize;
481484
char *Buf = Alloc.Allocate<char>(Size);
@@ -501,7 +504,8 @@ NewArchiveMember ObjectFactory::createShortImport(StringRef Sym,
501504
}
502505

503506
NewArchiveMember ObjectFactory::createWeakExternal(StringRef Sym,
504-
StringRef Weak, bool Imp) {
507+
StringRef Weak, bool Imp,
508+
MachineTypes Machine) {
505509
std::vector<uint8_t> Buffer;
506510
const uint32_t NumberOfSections = 1;
507511
const uint32_t NumberOfSymbols = 5;
@@ -585,8 +589,11 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path,
585589
ArrayRef<COFFShortExport> Exports,
586590
MachineTypes Machine, bool MinGW) {
587591

592+
MachineTypes NativeMachine =
593+
isArm64EC(Machine) ? IMAGE_FILE_MACHINE_ARM64 : Machine;
594+
588595
std::vector<NewArchiveMember> Members;
589-
ObjectFactory OF(llvm::sys::path::filename(ImportName), Machine);
596+
ObjectFactory OF(llvm::sys::path::filename(ImportName), NativeMachine);
590597

591598
std::vector<uint8_t> ImportDescriptor;
592599
Members.push_back(OF.createImportDescriptor(ImportDescriptor));
@@ -620,13 +627,15 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path,
620627
return Name.takeError();
621628

622629
if (!E.AliasTarget.empty() && *Name != E.AliasTarget) {
623-
Members.push_back(OF.createWeakExternal(E.AliasTarget, *Name, false));
624-
Members.push_back(OF.createWeakExternal(E.AliasTarget, *Name, true));
630+
Members.push_back(
631+
OF.createWeakExternal(E.AliasTarget, *Name, false, Machine));
632+
Members.push_back(
633+
OF.createWeakExternal(E.AliasTarget, *Name, true, Machine));
625634
continue;
626635
}
627636

628637
Members.push_back(
629-
OF.createShortImport(*Name, E.Ordinal, ImportType, NameType));
638+
OF.createShortImport(*Name, E.Ordinal, ImportType, NameType, Machine));
630639
}
631640

632641
return writeArchive(Path, Members, SymtabWritingMode::NormalSymtab,

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

+7-5
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,30 @@ RUN: llvm-lib -machine:arm64ec -def:test.def -out:test.lib
55

66
RUN: llvm-nm --print-armap test.lib | FileCheck -check-prefix=ARMAP %s
77

8-
ARMAP: Archive EC map
8+
ARMAP: Archive map
99
ARMAP-NEXT: __IMPORT_DESCRIPTOR_test in test.dll
1010
ARMAP-NEXT: __NULL_IMPORT_DESCRIPTOR in test.dll
11+
ARMAP-NEXT: test_NULL_THUNK_DATA in test.dll
12+
ARMAP-EMPTY:
13+
ARMAP-NEXT: Archive EC map
1114
ARMAP-NEXT: __imp_dataexp in test.dll
1215
ARMAP-NEXT: __imp_funcexp in test.dll
1316
ARMAP-NEXT: funcexp in test.dll
14-
ARMAP-NEXT: test_NULL_THUNK_DATA in test.dll
1517

1618
RUN: llvm-readobj test.lib | FileCheck -check-prefix=READOBJ %s
1719

1820
READOBJ: File: test.lib(test.dll)
19-
READOBJ-NEXT: Format: COFF-ARM64EC
21+
READOBJ-NEXT: Format: COFF-ARM64{{$}}
2022
READOBJ-NEXT: Arch: aarch64
2123
READOBJ-NEXT: AddressSize: 64bit
2224
READOBJ-EMPTY:
2325
READOBJ-NEXT: File: test.lib(test.dll)
24-
READOBJ-NEXT: Format: COFF-ARM64EC
26+
READOBJ-NEXT: Format: COFF-ARM64{{$}}
2527
READOBJ-NEXT: Arch: aarch64
2628
READOBJ-NEXT: AddressSize: 64bit
2729
READOBJ-EMPTY:
2830
READOBJ-NEXT: File: test.lib(test.dll)
29-
READOBJ-NEXT: Format: COFF-ARM64EC
31+
READOBJ-NEXT: Format: COFF-ARM64{{$}}
3032
READOBJ-NEXT: Arch: aarch64
3133
READOBJ-NEXT: AddressSize: 64bit
3234
READOBJ-EMPTY:

0 commit comments

Comments
 (0)