Skip to content

Commit b922ecf

Browse files
committed
Now we need to set preferred alignment to prevent jump tables from being overaligned
Created using spr 1.3.6-beta.1
2 parents 58907f6 + 444441d commit b922ecf

File tree

14 files changed

+53
-21
lines changed

14 files changed

+53
-21
lines changed

lld/ELF/Arch/X86_64.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,13 @@ void X86_64::relaxCFIJumpTables() const {
376376
// because the last entry controls which output section the jump table is
377377
// placed into, which affects move eligibility for other sections.
378378
auto *lastSec = [&]() -> InputSection * {
379+
// If the jump table section is more aligned than the entry size, skip
380+
// this because there's no guarantee that we'll be able to emit a
381+
// padding section that places the last entry at a correctly aligned
382+
// address.
383+
if (sec->addralign > sec->entsize)
384+
return nullptr;
385+
379386
Relocation *lastReloc = sec->relocs().end();
380387
while (lastReloc != sec->relocs().begin() &&
381388
(lastReloc - 1)->offset >= sec->size - sec->entsize)

lld/test/ELF/x86_64-relax-jump-tables.s

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,23 @@ jmp f12.cfi
109109
f13:
110110
jmp f13.cfi
111111

112+
// Jumptable alignment > entsize prevents it from being moved before last
113+
// function, but moving non-last functions into the jumptable should work.
114+
// CHECK: <f14>:
115+
// CHECK-NEXT: <f14.cfi>:
116+
// CHECK-NEXT: retq $0xe
117+
.section .text.jt5,"ax",@llvm_cfi_jump_table,8
118+
.balign 16
119+
f14:
120+
jmp f14.cfi
121+
.balign 8, 0xcc
122+
123+
// CHECK: <f15>:
124+
// CHECK-NEXT: jmp {{.*}} <f15.cfi>
125+
f15:
126+
jmp f15.cfi
127+
.balign 8, 0xcc
128+
112129
// CHECK: <f1>:
113130
// CHECK-NEXT: <f1.cfi>:
114131
// CHECK-NEXT: retq $0x1
@@ -180,5 +197,15 @@ ret $12
180197
f13.cfi:
181198
ret $13
182199

200+
.section .text.f14,"ax",@progbits
201+
f14.cfi:
202+
ret $14
203+
204+
.section .text.f15,"ax",@progbits
205+
.balign 64
206+
f15.cfi:
207+
ret $15
208+
.zero 16
209+
183210
// CHECK: <.iplt>:
184211
// CHECK-NEXT: [[IPLT]]:

llvm/lib/Transforms/IPO/LowerTypeTests.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
#include "llvm/Analysis/TypeMetadataUtils.h"
3232
#include "llvm/Analysis/ValueTracking.h"
3333
#include "llvm/BinaryFormat/ELF.h"
34-
#include "llvm/DebugInfo/CodeView/CodeView.h"
3534
#include "llvm/IR/Attributes.h"
3635
#include "llvm/IR/BasicBlock.h"
3736
#include "llvm/IR/Constant.h"
@@ -75,7 +74,6 @@
7574
#include "llvm/Support/raw_ostream.h"
7675
#include "llvm/TargetParser/Triple.h"
7776
#include "llvm/Transforms/IPO.h"
78-
#include "llvm/Transforms/IPO/CrossDSOCFI.h"
7977
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
8078
#include "llvm/Transforms/Utils/ModuleUtils.h"
8179
#include <algorithm>
@@ -1566,7 +1564,7 @@ void LowerTypeTestsModule::createJumpTable(
15661564
IRB.CreateUnreachable();
15671565

15681566
// Align the whole table by entry size.
1569-
F->setAlignment(Align(JumpTableEntrySize));
1567+
F->setPreferredAlignment(Align(JumpTableEntrySize));
15701568
// Skip prologue.
15711569
// Disabled on win32 due to https://llvm.org/bugs/show_bug.cgi?id=28641#c3.
15721570
// Luckily, this function does not get any prologue even without the

llvm/test/Transforms/LowerTypeTests/aarch64-jumptable.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ define i1 @foo(ptr %p) {
4949
;
5050
; AARCH64: Function Attrs: naked noinline
5151
; AARCH64-LABEL: define private void @.cfi.jumptable
52-
; AARCH64-SAME: () #[[ATTR1:[0-9]+]] align 8
52+
; AARCH64-SAME: () #[[ATTR1:[0-9]+]] prefalign 8
5353
; AARCH64-NEXT: entry:
5454
; AARCH64-NEXT: call void asm sideeffect "bti c\0Ab $0\0A", "s"(ptr @f.cfi)
5555
; AARCH64-NEXT: call void asm sideeffect "bti c\0Ab $0\0A", "s"(ptr @g.cfi)

llvm/test/Transforms/LowerTypeTests/cfi-nounwind-direct-call.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ attributes #6 = { noreturn nounwind }
153153
;
154154
; CHECK: Function Attrs: naked nocf_check noinline nounwind
155155
; CHECK-LABEL: define internal void @_Z9nothrow_ei.cfi_jt
156-
; CHECK-SAME: () #[[ATTR5:[0-9]+]] align 8 {
156+
; CHECK-SAME: () #[[ATTR5:[0-9]+]] prefalign 8 {
157157
; CHECK-NEXT: entry:
158158
; CHECK-NEXT: tail call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(ptr nonnull @_Z9nothrow_ei) #[[ATTR7:[0-9]+]]
159159
; CHECK-NEXT: unreachable

llvm/test/Transforms/LowerTypeTests/cfi-unwind-direct-call.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ attributes #8 = { noreturn nounwind }
221221
;
222222
; CHECK: Function Attrs: naked nocf_check noinline
223223
; CHECK-LABEL: define internal void @_Z7throw_ei.cfi_jt(
224-
; CHECK-SAME: ) #[[ATTR5:[0-9]+]] align 8 {
224+
; CHECK-SAME: ) #[[ATTR5:[0-9]+]] prefalign 8 {
225225
; CHECK-NEXT: entry:
226226
; CHECK-NEXT: tail call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(ptr nonnull @_Z7throw_ei) #[[ATTR6]]
227227
; CHECK-NEXT: unreachable

llvm/test/Transforms/LowerTypeTests/function-arm-thumb.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ define void @addrtaken() {
3333
!0 = !{i32 0, !"typeid1"}
3434
!1 = !{i32 0, !"typeid2"}
3535

36-
; CHECK: define private void {{.*}} #[[AT:.*]] align 4
36+
; CHECK: define private void {{.*}} #[[AT:.*]] prefalign 4
3737
; CHECK-NEXT: entry:
3838
; CHECK-NEXT: call void asm sideeffect "b.w $0\0A", "s"(ptr @f1.cfi)
3939
; CHECK-NEXT: call void asm sideeffect "b.w $0\0A", "s"(ptr @g1.cfi)
4040
; CHECK-NEXT: unreachable
4141
; CHECK-NEXT: }
4242

43-
; CHECK: define private void {{.*}} #[[AA:.*]] align 4
43+
; CHECK: define private void {{.*}} #[[AA:.*]] prefalign 4
4444
; CHECK-NEXT: entry:
4545
; CHECK-NEXT: call void asm sideeffect "b $0\0A", "s"(ptr @f2.cfi)
4646
; CHECK-NEXT: call void asm sideeffect "b $0\0A", "s"(ptr @g2.cfi)

llvm/test/Transforms/LowerTypeTests/function-disjoint.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ define i1 @foo(ptr %p) {
3939
ret i1 %z
4040
}
4141

42-
; X64: define private void @[[JT1]]() #{{.*}} align 8
42+
; X64: define private void @[[JT1]]() #{{.*}} prefalign 8
4343
; X64: call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(ptr @g.cfi)
4444

45-
; X64: define private void @[[JT0]]() #{{.*}} align 8
45+
; X64: define private void @[[JT0]]() #{{.*}} prefalign 8
4646
; X64: call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(ptr @f.cfi)
4747

4848
; WASM32: ![[I1]] = !{i64 2}

llvm/test/Transforms/LowerTypeTests/function-ext.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,5 @@ declare i1 @llvm.type.test(ptr %ptr, metadata %bitset) nounwind readnone
3737
!0 = !{i64 0, !"type1"}
3838
!1 = !{i64 0, !"type2"}
3939

40-
; X64: define private void @[[JT]]() #{{.*}} align {{.*}} {
40+
; X64: define private void @[[JT]]() #{{.*}} prefalign {{.*}} {
4141
; X64: call void asm sideeffect "jmp ${0:c}@plt\0Aint3\0Aint3\0Aint3\0A", "s"(ptr @foo1)

llvm/test/Transforms/LowerTypeTests/function-weak.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,10 @@ define i1 @foo(ptr %p) {
133133
ret i1 %x
134134
}
135135

136-
; X86: define private void @[[JT]]() #{{.*}} align 8
137-
; ARM: define private void @[[JT]]() #{{.*}} align 4
138-
; RISCV: define private void @[[JT]]() #{{.*}} align 8
139-
; LOONGARCH64: define private void @[[JT]]() #{{.*}} align 8
136+
; X86: define private void @[[JT]]() #{{.*}} prefalign 8
137+
; ARM: define private void @[[JT]]() #{{.*}} prefalign 4
138+
; RISCV: define private void @[[JT]]() #{{.*}} prefalign 8
139+
; LOONGARCH64: define private void @[[JT]]() #{{.*}} prefalign 8
140140

141141
; CHECK-LABEL: define internal void @__cfi_global_var_init() section ".text.startup" {
142142
; CHECK-NEXT: entry:

0 commit comments

Comments
 (0)