Skip to content

Commit c97478c

Browse files
authored
[LLD][COFF] Emit tail merge pdata for delay load thunks on ARM64EC (#116810)
1 parent a9b3ec1 commit c97478c

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

lld/COFF/DLL.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ class TailMergePDataChunkX64 : public NonSectionChunk {
395395
}
396396

397397
size_t getSize() const override { return 3 * sizeof(uint32_t); }
398+
MachineTypes getMachine() const override { return AMD64; }
398399

399400
void writeTo(uint8_t *buf) const override {
400401
write32le(buf + 0, tm->getRVA()); // TailMergeChunk start RVA
@@ -415,6 +416,7 @@ class TailMergeUnwindInfoX64 : public NonSectionChunk {
415416
}
416417

417418
size_t getSize() const override { return sizeof(tailMergeUnwindInfoX64); }
419+
MachineTypes getMachine() const override { return AMD64; }
418420

419421
void writeTo(uint8_t *buf) const override {
420422
memcpy(buf, tailMergeUnwindInfoX64, sizeof(tailMergeUnwindInfoX64));
@@ -882,6 +884,7 @@ Chunk *DelayLoadContents::newTailMergeChunk(Chunk *dir) {
882884
Chunk *DelayLoadContents::newTailMergeUnwindInfoChunk() {
883885
switch (ctx.config.machine) {
884886
case AMD64:
887+
case ARM64EC:
885888
return make<TailMergeUnwindInfoX64>();
886889
// FIXME: Add support for other architectures.
887890
default:
@@ -891,6 +894,7 @@ Chunk *DelayLoadContents::newTailMergeUnwindInfoChunk() {
891894
Chunk *DelayLoadContents::newTailMergePDataChunk(Chunk *tm, Chunk *unwind) {
892895
switch (ctx.config.machine) {
893896
case AMD64:
897+
case ARM64EC:
894898
return make<TailMergePDataChunkX64>(tm, unwind);
895899
// FIXME: Add support for other architectures.
896900
default:

lld/test/COFF/arm64ec-delayimport.test

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ RUN: lld-link -machine:arm64ec -dll -noentry -out:out.dll loadconfig-arm64ec.obj
1212
RUN: helper-mangled.obj test-arm64ec.lib test2-arm64ec.lib -delayload:test.dll -map
1313

1414
RUN: llvm-readobj --hex-dump=.test out.dll | FileCheck --check-prefix=TESTSEC %s
15-
TESTSEC: 0x180009000 00600000 88700000 00200000 10100000
16-
TESTSEC-NEXT: 0x180009010 08600000 90700000 10200000 30100000
17-
TESTSEC-NEXT: 0x180009020 1c100000 3c100000 00300000
15+
TESTSEC: 0x18000a000 00600000 88700000 00200000 10100000
16+
TESTSEC-NEXT: 0x18000a010 08600000 90700000 10200000 30100000
17+
TESTSEC-NEXT: 0x18000a020 1c100000 3c100000 00300000
1818

1919
RUN: llvm-objdump -d out.dll | FileCheck --check-prefix=DISASM %s
2020
DISASM: 0000000180001000 <.text>:
@@ -61,7 +61,7 @@ DISASM-NEXT: 18000203d: 66 0f 7f 4c 24 10 movdqa %xmm1, 0x10(%rsp)
6161
DISASM-NEXT: 180002043: 66 0f 7f 54 24 20 movdqa %xmm2, 0x20(%rsp)
6262
DISASM-NEXT: 180002049: 66 0f 7f 5c 24 30 movdqa %xmm3, 0x30(%rsp)
6363
DISASM-NEXT: 18000204f: 48 8b d0 movq %rax, %rdx
64-
DISASM-NEXT: 180002052: 48 8d 0d 97 21 00 00 leaq 0x2197(%rip), %rcx # 0x1800041f0
64+
DISASM-NEXT: 180002052: 48 8d 0d a7 21 00 00 leaq 0x21a7(%rip), %rcx # 0x180004200
6565
DISASM-NEXT: 180002059: e8 aa ef ff ff callq 0x180001008 <.text+0x8>
6666
DISASM-NEXT: 18000205e: 66 0f 6f 04 24 movdqa (%rsp), %xmm0
6767
DISASM-NEXT: 180002063: 66 0f 6f 4c 24 10 movdqa 0x10(%rsp), %xmm1
@@ -85,7 +85,7 @@ IMPORTS-NEXT: Name: test.dll
8585
IMPORTS-NEXT: Attributes: 0x1
8686
IMPORTS-NEXT: ModuleHandle: 0x7080
8787
IMPORTS-NEXT: ImportAddressTable: 0x7088
88-
IMPORTS-NEXT: ImportNameTable: 0x4230
88+
IMPORTS-NEXT: ImportNameTable: 0x4240
8989
IMPORTS-NEXT: BoundDelayImportTable: 0x0
9090
IMPORTS-NEXT: UnloadDelayImportTable: 0x0
9191
IMPORTS-NEXT: Import {
@@ -140,6 +140,9 @@ RELOC-NEXT: Type: DIR64
140140
RELOC-NEXT: Address: 0x6008
141141
RELOC-NEXT: }
142142

143+
RUN: llvm-readobj --hex-dump=.pdata out.dll | FileCheck --check-prefix=PDATA %s
144+
PDATA: 0x180008000 2e200000 81200000 18400000
145+
143146
Verify that a demangled version of __delayLoadHelper2 can be used.
144147

145148
RUN: lld-link -machine:arm64ec -dll -noentry -out:out2.dll loadconfig-arm64ec.obj test.obj \

0 commit comments

Comments
 (0)