Skip to content

Commit bd9bc53

Browse files
mstorsjoc-rhodes
authored andcommitted
[LLD] [COFF] Fix aarch64 delayimport of sret arguments (llvm#163096)
For sret arguments on aarch64, the x8 register is used as input parameter to functions, even though x8 normally isn't an input parameter register. When delayloading a DLL, the first call of a delayloaded function ends up calling a helper which resolves the function. Therefore, any input arguments to the actual function to be called need to be backed up and restored - this also includes x8. This matches how MS link.exe also changed its delayloading trampoline, between MSVC 2019 16.7 and 16.8 (between link.exe 14.27.29110.0 and 14.28.29333.0). This fixes running LLDB on aarch64 mingw, after ec28b95 and 93d3260. Those commits make LLDB load liblldb.dll with delayloading, and the first function to be called, SBDebugger::InitializeWithErrorHandling(), returns an SBError, which in the itanium C++ ABI is returned as an sret via a pointer in x8. (cherry picked from commit 7e69051)
1 parent 7b785dc commit bd9bc53

File tree

3 files changed

+88
-80
lines changed

3 files changed

+88
-80
lines changed

lld/COFF/DLL.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -320,32 +320,34 @@ static const uint8_t thunkARM64[] = {
320320
};
321321

322322
static const uint8_t tailMergeARM64[] = {
323-
0xfd, 0x7b, 0xb3, 0xa9, // stp x29, x30, [sp, #-208]!
323+
0xfd, 0x7b, 0xb2, 0xa9, // stp x29, x30, [sp, #-224]!
324324
0xfd, 0x03, 0x00, 0x91, // mov x29, sp
325325
0xe0, 0x07, 0x01, 0xa9, // stp x0, x1, [sp, #16]
326326
0xe2, 0x0f, 0x02, 0xa9, // stp x2, x3, [sp, #32]
327327
0xe4, 0x17, 0x03, 0xa9, // stp x4, x5, [sp, #48]
328328
0xe6, 0x1f, 0x04, 0xa9, // stp x6, x7, [sp, #64]
329-
0xe0, 0x87, 0x02, 0xad, // stp q0, q1, [sp, #80]
330-
0xe2, 0x8f, 0x03, 0xad, // stp q2, q3, [sp, #112]
331-
0xe4, 0x97, 0x04, 0xad, // stp q4, q5, [sp, #144]
332-
0xe6, 0x9f, 0x05, 0xad, // stp q6, q7, [sp, #176]
329+
0xe8, 0x2b, 0x00, 0xf9, // str x8, [sp, #80]
330+
0xe0, 0x07, 0x03, 0xad, // stp q0, q1, [sp, #96]
331+
0xe2, 0x0f, 0x04, 0xad, // stp q2, q3, [sp, #128]
332+
0xe4, 0x17, 0x05, 0xad, // stp q4, q5, [sp, #160]
333+
0xe6, 0x1f, 0x06, 0xad, // stp q6, q7, [sp, #192]
333334
0xe1, 0x03, 0x11, 0xaa, // mov x1, x17
334335
0x00, 0x00, 0x00, 0x90, // adrp x0, #0 DELAY_IMPORT_DESCRIPTOR
335336
0x00, 0x00, 0x00, 0x91, // add x0, x0, #0 :lo12:DELAY_IMPORT_DESCRIPTOR
336337
0x02, 0x00, 0x00, 0x90, // adrp x2, #0 __delayLoadHelper2
337338
0x42, 0x00, 0x00, 0x91, // add x2, x2, #0 :lo12:__delayLoadHelper2
338339
0x40, 0x00, 0x3f, 0xd6, // blr x2
339340
0xf0, 0x03, 0x00, 0xaa, // mov x16, x0
340-
0xe6, 0x9f, 0x45, 0xad, // ldp q6, q7, [sp, #176]
341-
0xe4, 0x97, 0x44, 0xad, // ldp q4, q5, [sp, #144]
342-
0xe2, 0x8f, 0x43, 0xad, // ldp q2, q3, [sp, #112]
343-
0xe0, 0x87, 0x42, 0xad, // ldp q0, q1, [sp, #80]
341+
0xe6, 0x1f, 0x46, 0xad, // ldp q6, q7, [sp, #192]
342+
0xe4, 0x17, 0x45, 0xad, // ldp q4, q5, [sp, #160]
343+
0xe2, 0x0f, 0x44, 0xad, // ldp q2, q3, [sp, #128]
344+
0xe0, 0x07, 0x43, 0xad, // ldp q0, q1, [sp, #96]
345+
0xe8, 0x2b, 0x40, 0xf9, // ldr x8, [sp, #80]
344346
0xe6, 0x1f, 0x44, 0xa9, // ldp x6, x7, [sp, #64]
345347
0xe4, 0x17, 0x43, 0xa9, // ldp x4, x5, [sp, #48]
346348
0xe2, 0x0f, 0x42, 0xa9, // ldp x2, x3, [sp, #32]
347349
0xe0, 0x07, 0x41, 0xa9, // ldp x0, x1, [sp, #16]
348-
0xfd, 0x7b, 0xcd, 0xa8, // ldp x29, x30, [sp], #208
350+
0xfd, 0x7b, 0xce, 0xa8, // ldp x29, x30, [sp], #224
349351
0x00, 0x02, 0x1f, 0xd6, // br x16
350352
};
351353

@@ -556,11 +558,11 @@ class TailMergeChunkARM64 : public NonSectionCodeChunk {
556558

557559
void writeTo(uint8_t *buf) const override {
558560
memcpy(buf, tailMergeARM64, sizeof(tailMergeARM64));
559-
applyArm64Addr(buf + 44, desc->getRVA(), rva + 44, 12);
560-
applyArm64Imm(buf + 48, desc->getRVA() & 0xfff, 0);
561+
applyArm64Addr(buf + 48, desc->getRVA(), rva + 48, 12);
562+
applyArm64Imm(buf + 52, desc->getRVA() & 0xfff, 0);
561563
if (helper) {
562-
applyArm64Addr(buf + 52, helper->getRVA(), rva + 52, 12);
563-
applyArm64Imm(buf + 56, helper->getRVA() & 0xfff, 0);
564+
applyArm64Addr(buf + 56, helper->getRVA(), rva + 56, 12);
565+
applyArm64Imm(buf + 60, helper->getRVA() & 0xfff, 0);
564566
}
565567
}
566568

lld/test/COFF/arm64-delayimport.yaml

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,35 @@
88
# DISASM: 140001014: d0000011 adrp x17, 0x140003000
99
# DISASM: 140001018: 91002231 add x17, x17, #8
1010
# DISASM: 14000101c: 14000001 b 0x140001020 <.text+0x20>
11-
# DISASM: 140001020: a9b37bfd stp x29, x30, [sp, #-208]!
11+
# DISASM: 140001020: a9b27bfd stp x29, x30, [sp, #-224]!
1212
# DISASM: 140001024: 910003fd mov x29, sp
1313
# DISASM: 140001028: a90107e0 stp x0, x1, [sp, #16]
1414
# DISASM: 14000102c: a9020fe2 stp x2, x3, [sp, #32]
1515
# DISASM: 140001030: a90317e4 stp x4, x5, [sp, #48]
1616
# DISASM: 140001034: a9041fe6 stp x6, x7, [sp, #64]
17-
# DISASM: 140001038: ad0287e0 stp q0, q1, [sp, #80]
18-
# DISASM: 14000103c: ad038fe2 stp q2, q3, [sp, #112]
19-
# DISASM: 140001040: ad0497e4 stp q4, q5, [sp, #144]
20-
# DISASM: 140001044: ad059fe6 stp q6, q7, [sp, #176]
21-
# DISASM: 140001048: aa1103e1 mov x1, x17
22-
# DISASM: 14000104c: b0000000 adrp x0, 0x140002000
23-
# DISASM: 140001050: 91000000 add x0, x0, #0
24-
# DISASM: 140001054: 90000002 adrp x2, 0x140001000 <.text>
25-
# DISASM: 140001058: 91000042 add x2, x2, #0
26-
# DISASM: 14000105c: d63f0040 blr x2
27-
# DISASM: 140001060: aa0003f0 mov x16, x0
28-
# DISASM: 140001064: ad459fe6 ldp q6, q7, [sp, #176]
29-
# DISASM: 140001068: ad4497e4 ldp q4, q5, [sp, #144]
30-
# DISASM: 14000106c: ad438fe2 ldp q2, q3, [sp, #112]
31-
# DISASM: 140001070: ad4287e0 ldp q0, q1, [sp, #80]
32-
# DISASM: 140001074: a9441fe6 ldp x6, x7, [sp, #64]
33-
# DISASM: 140001078: a94317e4 ldp x4, x5, [sp, #48]
34-
# DISASM: 14000107c: a9420fe2 ldp x2, x3, [sp, #32]
35-
# DISASM: 140001080: a94107e0 ldp x0, x1, [sp, #16]
36-
# DISASM: 140001084: a8cd7bfd ldp x29, x30, [sp], #208
37-
# DISASM: 140001088: d61f0200 br x16
17+
# DISASM: 140001038: f9002be8 str x8, [sp, #80]
18+
# DISASM: 14000103c: ad0307e0 stp q0, q1, [sp, #96]
19+
# DISASM: 140001040: ad040fe2 stp q2, q3, [sp, #128]
20+
# DISASM: 140001044: ad0517e4 stp q4, q5, [sp, #160]
21+
# DISASM: 140001048: ad061fe6 stp q6, q7, [sp, #192]
22+
# DISASM: 14000104c: aa1103e1 mov x1, x17
23+
# DISASM: 140001050: b0000000 adrp x0, 0x140002000
24+
# DISASM: 140001054: 91000000 add x0, x0, #0
25+
# DISASM: 140001058: 90000002 adrp x2, 0x140001000 <.text>
26+
# DISASM: 14000105c: 91000042 add x2, x2, #0
27+
# DISASM: 140001060: d63f0040 blr x2
28+
# DISASM: 140001064: aa0003f0 mov x16, x0
29+
# DISASM: 140001068: ad461fe6 ldp q6, q7, [sp, #192]
30+
# DISASM: 14000106c: ad4517e4 ldp q4, q5, [sp, #160]
31+
# DISASM: 140001070: ad440fe2 ldp q2, q3, [sp, #128]
32+
# DISASM: 140001074: ad4307e0 ldp q0, q1, [sp, #96]
33+
# DISASM: 140001078: f9402be8 ldr x8, [sp, #80]
34+
# DISASM: 14000107c: a9441fe6 ldp x6, x7, [sp, #64]
35+
# DISASM: 140001080: a94317e4 ldp x4, x5, [sp, #48]
36+
# DISASM: 140001084: a9420fe2 ldp x2, x3, [sp, #32]
37+
# DISASM: 140001088: a94107e0 ldp x0, x1, [sp, #16]
38+
# DISASM: 14000108c: a8ce7bfd ldp x29, x30, [sp], #224
39+
# DISASM: 140001090: d61f0200 br x16
3840

3941
# IMPORTS: Format: COFF-ARM64
4042
# IMPORTS: Arch: aarch64

lld/test/COFF/arm64x-delayimport.test

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -61,33 +61,35 @@ DISASM-NEXT: 180001010: d61f0200 br x16
6161
DISASM-NEXT: 180001014: b0000031 adrp x17, 0x180006000
6262
DISASM-NEXT: 180001018: 91022231 add x17, x17, #0x88
6363
DISASM-NEXT: 18000101c: 14000001 b 0x180001020 <.text+0x20>
64-
DISASM-NEXT: 180001020: a9b37bfd stp x29, x30, [sp, #-0xd0]!
64+
DISASM-NEXT: 180001020: a9b27bfd stp x29, x30, [sp, #-0xe0]!
6565
DISASM-NEXT: 180001024: 910003fd mov x29, sp
6666
DISASM-NEXT: 180001028: a90107e0 stp x0, x1, [sp, #0x10]
6767
DISASM-NEXT: 18000102c: a9020fe2 stp x2, x3, [sp, #0x20]
6868
DISASM-NEXT: 180001030: a90317e4 stp x4, x5, [sp, #0x30]
6969
DISASM-NEXT: 180001034: a9041fe6 stp x6, x7, [sp, #0x40]
70-
DISASM-NEXT: 180001038: ad0287e0 stp q0, q1, [sp, #0x50]
71-
DISASM-NEXT: 18000103c: ad038fe2 stp q2, q3, [sp, #0x70]
72-
DISASM-NEXT: 180001040: ad0497e4 stp q4, q5, [sp, #0x90]
73-
DISASM-NEXT: 180001044: ad059fe6 stp q6, q7, [sp, #0xb0]
74-
DISASM-NEXT: 180001048: aa1103e1 mov x1, x17
75-
DISASM-NEXT: 18000104c: f0000000 adrp x0, 0x180004000
76-
DISASM-NEXT: 180001050: 910d2000 add x0, x0, #0x348
77-
DISASM-NEXT: 180001054: 90000002 adrp x2, 0x180001000 <.text>
78-
DISASM-NEXT: 180001058: 91000042 add x2, x2, #0x0
79-
DISASM-NEXT: 18000105c: d63f0040 blr x2
80-
DISASM-NEXT: 180001060: aa0003f0 mov x16, x0
81-
DISASM-NEXT: 180001064: ad459fe6 ldp q6, q7, [sp, #0xb0]
82-
DISASM-NEXT: 180001068: ad4497e4 ldp q4, q5, [sp, #0x90]
83-
DISASM-NEXT: 18000106c: ad438fe2 ldp q2, q3, [sp, #0x70]
84-
DISASM-NEXT: 180001070: ad4287e0 ldp q0, q1, [sp, #0x50]
85-
DISASM-NEXT: 180001074: a9441fe6 ldp x6, x7, [sp, #0x40]
86-
DISASM-NEXT: 180001078: a94317e4 ldp x4, x5, [sp, #0x30]
87-
DISASM-NEXT: 18000107c: a9420fe2 ldp x2, x3, [sp, #0x20]
88-
DISASM-NEXT: 180001080: a94107e0 ldp x0, x1, [sp, #0x10]
89-
DISASM-NEXT: 180001084: a8cd7bfd ldp x29, x30, [sp], #0xd0
90-
DISASM-NEXT: 180001088: d61f0200 br x16
70+
DISASM-NEXT: 180001038: f9002be8 str x8, [sp, #0x50]
71+
DISASM-NEXT: 18000103c: ad0307e0 stp q0, q1, [sp, #0x60]
72+
DISASM-NEXT: 180001040: ad040fe2 stp q2, q3, [sp, #0x80]
73+
DISASM-NEXT: 180001044: ad0517e4 stp q4, q5, [sp, #0xa0]
74+
DISASM-NEXT: 180001048: ad061fe6 stp q6, q7, [sp, #0xc0]
75+
DISASM-NEXT: 18000104c: aa1103e1 mov x1, x17
76+
DISASM-NEXT: 180001050: f0000000 adrp x0, 0x180004000
77+
DISASM-NEXT: 180001054: 910d2000 add x0, x0, #0x348
78+
DISASM-NEXT: 180001058: 90000002 adrp x2, 0x180001000 <.text>
79+
DISASM-NEXT: 18000105c: 91000042 add x2, x2, #0x0
80+
DISASM-NEXT: 180001060: d63f0040 blr x2
81+
DISASM-NEXT: 180001064: aa0003f0 mov x16, x0
82+
DISASM-NEXT: 180001068: ad461fe6 ldp q6, q7, [sp, #0xc0]
83+
DISASM-NEXT: 18000106c: ad4517e4 ldp q4, q5, [sp, #0xa0]
84+
DISASM-NEXT: 180001070: ad440fe2 ldp q2, q3, [sp, #0x80]
85+
DISASM-NEXT: 180001074: ad4307e0 ldp q0, q1, [sp, #0x60]
86+
DISASM-NEXT: 180001078: f9402be8 ldr x8, [sp, #0x50]
87+
DISASM-NEXT: 18000107c: a9441fe6 ldp x6, x7, [sp, #0x40]
88+
DISASM-NEXT: 180001080: a94317e4 ldp x4, x5, [sp, #0x30]
89+
DISASM-NEXT: 180001084: a9420fe2 ldp x2, x3, [sp, #0x20]
90+
DISASM-NEXT: 180001088: a94107e0 ldp x0, x1, [sp, #0x10]
91+
DISASM-NEXT: 18000108c: a8ce7bfd ldp x29, x30, [sp], #0xe0
92+
DISASM-NEXT: 180001090: d61f0200 br x16
9193
DISASM-NEXT: ...
9294
DISASM-NEXT: 180002000: 52800040 mov w0, #0x2 // =2
9395
DISASM-NEXT: 180002004: d65f03c0 ret
@@ -186,33 +188,35 @@ NATIVE-DISASM-NEXT: 180001010: d61f0200 br x16
186188
NATIVE-DISASM-NEXT: 180001014: 90000031 adrp x17, 0x180005000
187189
NATIVE-DISASM-NEXT: 180001018: 91022231 add x17, x17, #0x88
188190
NATIVE-DISASM-NEXT: 18000101c: 14000001 b 0x180001020 <.text+0x20>
189-
NATIVE-DISASM-NEXT: 180001020: a9b37bfd stp x29, x30, [sp, #-0xd0]!
191+
NATIVE-DISASM-NEXT: 180001020: a9b27bfd stp x29, x30, [sp, #-0xe0]!
190192
NATIVE-DISASM-NEXT: 180001024: 910003fd mov x29, sp
191193
NATIVE-DISASM-NEXT: 180001028: a90107e0 stp x0, x1, [sp, #0x10]
192194
NATIVE-DISASM-NEXT: 18000102c: a9020fe2 stp x2, x3, [sp, #0x20]
193195
NATIVE-DISASM-NEXT: 180001030: a90317e4 stp x4, x5, [sp, #0x30]
194196
NATIVE-DISASM-NEXT: 180001034: a9041fe6 stp x6, x7, [sp, #0x40]
195-
NATIVE-DISASM-NEXT: 180001038: ad0287e0 stp q0, q1, [sp, #0x50]
196-
NATIVE-DISASM-NEXT: 18000103c: ad038fe2 stp q2, q3, [sp, #0x70]
197-
NATIVE-DISASM-NEXT: 180001040: ad0497e4 stp q4, q5, [sp, #0x90]
198-
NATIVE-DISASM-NEXT: 180001044: ad059fe6 stp q6, q7, [sp, #0xb0]
199-
NATIVE-DISASM-NEXT: 180001048: aa1103e1 mov x1, x17
200-
NATIVE-DISASM-NEXT: 18000104c: d0000000 adrp x0, 0x180003000
201-
NATIVE-DISASM-NEXT: 180001050: 910cc000 add x0, x0, #0x330
202-
NATIVE-DISASM-NEXT: 180001054: 90000002 adrp x2, 0x180001000 <.text>
203-
NATIVE-DISASM-NEXT: 180001058: 91000042 add x2, x2, #0x0
204-
NATIVE-DISASM-NEXT: 18000105c: d63f0040 blr x2
205-
NATIVE-DISASM-NEXT: 180001060: aa0003f0 mov x16, x0
206-
NATIVE-DISASM-NEXT: 180001064: ad459fe6 ldp q6, q7, [sp, #0xb0]
207-
NATIVE-DISASM-NEXT: 180001068: ad4497e4 ldp q4, q5, [sp, #0x90]
208-
NATIVE-DISASM-NEXT: 18000106c: ad438fe2 ldp q2, q3, [sp, #0x70]
209-
NATIVE-DISASM-NEXT: 180001070: ad4287e0 ldp q0, q1, [sp, #0x50]
210-
NATIVE-DISASM-NEXT: 180001074: a9441fe6 ldp x6, x7, [sp, #0x40]
211-
NATIVE-DISASM-NEXT: 180001078: a94317e4 ldp x4, x5, [sp, #0x30]
212-
NATIVE-DISASM-NEXT: 18000107c: a9420fe2 ldp x2, x3, [sp, #0x20]
213-
NATIVE-DISASM-NEXT: 180001080: a94107e0 ldp x0, x1, [sp, #0x10]
214-
NATIVE-DISASM-NEXT: 180001084: a8cd7bfd ldp x29, x30, [sp], #0xd0
215-
NATIVE-DISASM-NEXT: 180001088: d61f0200 br x16
197+
NATIVE-DISASM-NEXT: 180001038: f9002be8 str x8, [sp, #0x50]
198+
NATIVE-DISASM-NEXT: 18000103c: ad0307e0 stp q0, q1, [sp, #0x60]
199+
NATIVE-DISASM-NEXT: 180001040: ad040fe2 stp q2, q3, [sp, #0x80]
200+
NATIVE-DISASM-NEXT: 180001044: ad0517e4 stp q4, q5, [sp, #0xa0]
201+
NATIVE-DISASM-NEXT: 180001048: ad061fe6 stp q6, q7, [sp, #0xc0]
202+
NATIVE-DISASM-NEXT: 18000104c: aa1103e1 mov x1, x17
203+
NATIVE-DISASM-NEXT: 180001050: d0000000 adrp x0, 0x180003000
204+
NATIVE-DISASM-NEXT: 180001054: 910cc000 add x0, x0, #0x330
205+
NATIVE-DISASM-NEXT: 180001058: 90000002 adrp x2, 0x180001000 <.text>
206+
NATIVE-DISASM-NEXT: 18000105c: 91000042 add x2, x2, #0x0
207+
NATIVE-DISASM-NEXT: 180001060: d63f0040 blr x2
208+
NATIVE-DISASM-NEXT: 180001064: aa0003f0 mov x16, x0
209+
NATIVE-DISASM-NEXT: 180001068: ad461fe6 ldp q6, q7, [sp, #0xc0]
210+
NATIVE-DISASM-NEXT: 18000106c: ad4517e4 ldp q4, q5, [sp, #0xa0]
211+
NATIVE-DISASM-NEXT: 180001070: ad440fe2 ldp q2, q3, [sp, #0x80]
212+
NATIVE-DISASM-NEXT: 180001074: ad4307e0 ldp q0, q1, [sp, #0x60]
213+
NATIVE-DISASM-NEXT: 180001078: f9402be8 ldr x8, [sp, #0x50]
214+
NATIVE-DISASM-NEXT: 18000107c: a9441fe6 ldp x6, x7, [sp, #0x40]
215+
NATIVE-DISASM-NEXT: 180001080: a94317e4 ldp x4, x5, [sp, #0x30]
216+
NATIVE-DISASM-NEXT: 180001084: a9420fe2 ldp x2, x3, [sp, #0x20]
217+
NATIVE-DISASM-NEXT: 180001088: a94107e0 ldp x0, x1, [sp, #0x10]
218+
NATIVE-DISASM-NEXT: 18000108c: a8ce7bfd ldp x29, x30, [sp], #0xe0
219+
NATIVE-DISASM-NEXT: 180001090: d61f0200 br x16
216220

217221
RUN: llvm-readobj --coff-load-config out-native.dll | FileCheck --check-prefix=NATIVE-LOADCFG %s
218222
NATIVE-LOADCFG: AuxiliaryDelayloadIAT: 0x4000

0 commit comments

Comments
 (0)