Skip to content

Commit 12c9e2f

Browse files
committed
[LLD] [COFF] Fix alignment of thunks for ARM/ARM64
The alignment of ARM64 range extension thunks was fixed in 7c81649, but ARM range extension thunks, and import and delay import thunks also need aligning (like all code on ARM platforms). I'm adding a test for alignment of ARM64 import thunks - not specifically adding tests for misalignment of all of them though. Differential Revision: https://reviews.llvm.org/D77796
1 parent 2a99e70 commit 12c9e2f

File tree

3 files changed

+30
-16
lines changed

3 files changed

+30
-16
lines changed

lld/COFF/Chunks.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,22 +486,26 @@ class ImportThunkChunkX86 : public ImportThunkChunk {
486486

487487
class ImportThunkChunkARM : public ImportThunkChunk {
488488
public:
489-
explicit ImportThunkChunkARM(Defined *s) : ImportThunkChunk(s) {}
489+
explicit ImportThunkChunkARM(Defined *s) : ImportThunkChunk(s) {
490+
setAlignment(2);
491+
}
490492
size_t getSize() const override { return sizeof(importThunkARM); }
491493
void getBaserels(std::vector<Baserel> *res) override;
492494
void writeTo(uint8_t *buf) const override;
493495
};
494496

495497
class ImportThunkChunkARM64 : public ImportThunkChunk {
496498
public:
497-
explicit ImportThunkChunkARM64(Defined *s) : ImportThunkChunk(s) {}
499+
explicit ImportThunkChunkARM64(Defined *s) : ImportThunkChunk(s) {
500+
setAlignment(4);
501+
}
498502
size_t getSize() const override { return sizeof(importThunkARM64); }
499503
void writeTo(uint8_t *buf) const override;
500504
};
501505

502506
class RangeExtensionThunkARM : public NonSectionChunk {
503507
public:
504-
explicit RangeExtensionThunkARM(Defined *t) : target(t) {}
508+
explicit RangeExtensionThunkARM(Defined *t) : target(t) { setAlignment(2); }
505509
size_t getSize() const override;
506510
void writeTo(uint8_t *buf) const override;
507511

lld/COFF/DLL.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,9 @@ class TailMergeChunkX86 : public NonSectionChunk {
365365

366366
class ThunkChunkARM : public NonSectionChunk {
367367
public:
368-
ThunkChunkARM(Defined *i, Chunk *tm) : imp(i), tailMerge(tm) {}
368+
ThunkChunkARM(Defined *i, Chunk *tm) : imp(i), tailMerge(tm) {
369+
setAlignment(2);
370+
}
369371

370372
size_t getSize() const override { return sizeof(thunkARM); }
371373

@@ -385,7 +387,9 @@ class ThunkChunkARM : public NonSectionChunk {
385387

386388
class TailMergeChunkARM : public NonSectionChunk {
387389
public:
388-
TailMergeChunkARM(Chunk *d, Defined *h) : desc(d), helper(h) {}
390+
TailMergeChunkARM(Chunk *d, Defined *h) : desc(d), helper(h) {
391+
setAlignment(2);
392+
}
389393

390394
size_t getSize() const override { return sizeof(tailMergeARM); }
391395

@@ -405,7 +409,9 @@ class TailMergeChunkARM : public NonSectionChunk {
405409

406410
class ThunkChunkARM64 : public NonSectionChunk {
407411
public:
408-
ThunkChunkARM64(Defined *i, Chunk *tm) : imp(i), tailMerge(tm) {}
412+
ThunkChunkARM64(Defined *i, Chunk *tm) : imp(i), tailMerge(tm) {
413+
setAlignment(4);
414+
}
409415

410416
size_t getSize() const override { return sizeof(thunkARM64); }
411417

@@ -422,7 +428,9 @@ class ThunkChunkARM64 : public NonSectionChunk {
422428

423429
class TailMergeChunkARM64 : public NonSectionChunk {
424430
public:
425-
TailMergeChunkARM64(Chunk *d, Defined *h) : desc(d), helper(h) {}
431+
TailMergeChunkARM64(Chunk *d, Defined *h) : desc(d), helper(h) {
432+
setAlignment(4);
433+
}
426434

427435
size_t getSize() const override { return sizeof(tailMergeARM64); }
428436

lld/test/COFF/arm64-import2.test

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,20 @@
1111
# BEFORE: 0: 00 00 00 94 bl 0x0
1212
# BEFORE: 4: 00 00 00 94 bl 0x4
1313
# BEFORE: 8: c0 03 5f d6 ret
14+
# BEFORE: c: ff <unknown>
1415

1516
# AFTER: Disassembly of section .text:
1617
# AFTER-EMPTY:
17-
# AFTER: 140001000: 03 00 00 94 bl 0x14000100c
18-
# AFTER: 140001004: 05 00 00 94 bl 0x140001018
18+
# AFTER: 140001000: 04 00 00 94 bl 0x140001010
19+
# AFTER: 140001004: 06 00 00 94 bl 0x14000101c
1920
# AFTER: 140001008: c0 03 5f d6 ret
20-
# AFTER: 14000100c: 10 00 00 b0 adrp x16, #4096
21-
# AFTER: 140001010: 10 32 40 f9 ldr x16, [x16, #96]
22-
# AFTER: 140001014: 00 02 1f d6 br x16
23-
# AFTER: 140001018: 10 00 00 b0 adrp x16, #4096
24-
# AFTER: 14000101c: 10 3a 40 f9 ldr x16, [x16, #112]
25-
# AFTER: 140001020: 00 02 1f d6 br x16
21+
# AFTER: 14000100c: ff cc cc cc <unknown>
22+
# AFTER: 140001010: 10 00 00 b0 adrp x16, #4096
23+
# AFTER: 140001014: 10 32 40 f9 ldr x16, [x16, #96]
24+
# AFTER: 140001018: 00 02 1f d6 br x16
25+
# AFTER: 14000101c: 10 00 00 b0 adrp x16, #4096
26+
# AFTER: 140001020: 10 3a 40 f9 ldr x16, [x16, #112]
27+
# AFTER: 140001024: 00 02 1f d6 br x16
2628

2729
# IMPORTS: Import {
2830
# IMPORTS: Name: library.dll
@@ -45,7 +47,7 @@ sections:
4547
- Name: .text
4648
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
4749
Alignment: 4
48-
SectionData: 0000009400000094C0035FD6
50+
SectionData: 0000009400000094C0035FD6FF
4951
Relocations:
5052
- VirtualAddress: 0
5153
SymbolName: function

0 commit comments

Comments
 (0)