@@ -150,7 +150,7 @@ namespace {
150150class 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
160160public:
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) {
393397NewArchiveMember 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) {
475477NewArchiveMember 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
503506NewArchiveMember 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,
0 commit comments