Skip to content

Commit 783f5c6

Browse files
mstorsjotstellar
authored andcommitted
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 (cherry picked from commit 12c9e2f)
1 parent f5a9c66 commit 783f5c6

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 #0
1212
# BEFORE: 4: 00 00 00 94 bl #0
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 #12
18-
# AFTER: 140001004: 05 00 00 94 bl #20
18+
# AFTER: 140001000: 04 00 00 94 bl #16
19+
# AFTER: 140001004: 06 00 00 94 bl #24
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)