Skip to content

Commit bf0534e

Browse files
authored
[llvm-lib] [Object] Use ECSYMBOLS section for ARM64EC importlib symbols. (#68328)
1 parent 6cf41ad commit bf0534e

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

llvm/include/llvm/Object/COFFImportFile.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class COFFImportFile : public SymbolicFile {
6363
Data.getBufferStart());
6464
}
6565

66+
uint16_t getMachine() const { return getCOFFImportHeader()->Machine; }
67+
6668
private:
6769
bool isData() const {
6870
return getCOFFImportHeader()->getType() == COFF::IMPORT_DATA;

llvm/lib/Object/ArchiveWriter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/IR/LLVMContext.h"
1919
#include "llvm/Object/Archive.h"
2020
#include "llvm/Object/COFF.h"
21+
#include "llvm/Object/COFFImportFile.h"
2122
#include "llvm/Object/Error.h"
2223
#include "llvm/Object/IRObjectFile.h"
2324
#include "llvm/Object/MachO.h"
@@ -659,6 +660,10 @@ static bool isECObject(object::SymbolicFile &Obj) {
659660
return cast<llvm::object::COFFObjectFile>(&Obj)->getMachine() !=
660661
COFF::IMAGE_FILE_MACHINE_ARM64;
661662

663+
if (Obj.isCOFFImportFile())
664+
return cast<llvm::object::COFFImportFile>(&Obj)->getMachine() !=
665+
COFF::IMAGE_FILE_MACHINE_ARM64;
666+
662667
if (Obj.isIR()) {
663668
Expected<std::string> TripleStr =
664669
getBitcodeTargetTriple(Obj.getMemoryBufferRef());

llvm/lib/Object/COFFImportFile.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,8 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path,
612612

613613
return writeArchive(Path, Members, SymtabWritingMode::NormalSymtab,
614614
MinGW ? object::Archive::K_GNU : object::Archive::K_COFF,
615-
/*Deterministic*/ true, /*Thin*/ false);
615+
/*Deterministic*/ true, /*Thin*/ false,
616+
/*OldArchiveBuf*/ nullptr, isArm64EC(Machine));
616617
}
617618

618619
} // namespace object
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
Test creating ARM64EC importlib.
2+
3+
RUN: split-file %s %t.dir && cd %t.dir
4+
RUN: llvm-lib -machine:arm64ec -def:test.def -out:test.lib
5+
6+
RUN: llvm-nm --print-armap test.lib | FileCheck -check-prefix=ARMAP %s
7+
8+
ARMAP: Archive EC map
9+
ARMAP-NEXT: __IMPORT_DESCRIPTOR_test in test.dll
10+
ARMAP-NEXT: __NULL_IMPORT_DESCRIPTOR in test.dll
11+
ARMAP-NEXT: __imp_dataexp in test.dll
12+
ARMAP-NEXT: __imp_funcexp in test.dll
13+
ARMAP-NEXT: funcexp in test.dll
14+
ARMAP-NEXT: test_NULL_THUNK_DATA in test.dll
15+
16+
RUN: llvm-readobj test.lib | FileCheck -check-prefix=READOBJ %s
17+
18+
READOBJ: File: test.lib(test.dll)
19+
READOBJ-NEXT: Format: COFF-ARM64EC
20+
READOBJ-NEXT: Arch: aarch64
21+
READOBJ-NEXT: AddressSize: 64bit
22+
READOBJ-EMPTY:
23+
READOBJ-NEXT: File: test.lib(test.dll)
24+
READOBJ-NEXT: Format: COFF-ARM64EC
25+
READOBJ-NEXT: Arch: aarch64
26+
READOBJ-NEXT: AddressSize: 64bit
27+
READOBJ-EMPTY:
28+
READOBJ-NEXT: File: test.lib(test.dll)
29+
READOBJ-NEXT: Format: COFF-ARM64
30+
READOBJ-NEXT: Arch: aarch64
31+
READOBJ-NEXT: AddressSize: 64bit
32+
READOBJ-EMPTY:
33+
READOBJ-NEXT: File: test.dll
34+
READOBJ-NEXT: Format: COFF-import-file
35+
READOBJ-NEXT: Type: code
36+
READOBJ-NEXT: Name type: name
37+
READOBJ-NEXT: Symbol: __imp_funcexp
38+
READOBJ-NEXT: Symbol: funcexp
39+
READOBJ-EMPTY:
40+
READOBJ-NEXT: File: test.dll
41+
READOBJ-NEXT: Format: COFF-import-file
42+
READOBJ-NEXT: Type: data
43+
READOBJ-NEXT: Name type: name
44+
READOBJ-NEXT: Symbol: __imp_dataexp
45+
46+
Creating a new lib containing the existing lib:
47+
RUN: llvm-lib -machine:arm64ec test.lib -out:test2.lib
48+
RUN: llvm-nm --print-armap test2.lib | FileCheck -check-prefix=ARMAP %s
49+
50+
#--- test.def
51+
LIBRARY test.dll
52+
EXPORTS
53+
funcexp
54+
dataexp DATA

0 commit comments

Comments
 (0)