diff --git a/releasenotes.md b/releasenotes.md index 1f012c427..7d412c306 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -71,6 +71,7 @@ - Properly add "inlined at" for generic instantiation errors #2382. - Inlining a const as an lvalue would take the wrong path and corrupt the expression node. - Grabbing (missing) methods on function pointers would cause crash #2434. +- Fix alignment on jump table. ### Stdlib changes - Add `==` to `Pair`, `Triple` and TzDateTime. Add print to `Pair` and `Triple`. diff --git a/src/compiler/llvm_codegen_stmt.c b/src/compiler/llvm_codegen_stmt.c index 94ca04414..9149e04ec 100644 --- a/src/compiler/llvm_codegen_stmt.c +++ b/src/compiler/llvm_codegen_stmt.c @@ -865,9 +865,8 @@ static void llvm_emit_switch_jump_table(GenContext *c, Type *goto_array_type = type_get_array(type_voidptr, count); LLVMTypeRef llvm_array_type = llvm_get_type(c, goto_array_type); - AlignSize alignment = type_alloca_alignment(switch_value->type); - LLVMValueRef jmptable = llvm_add_global_raw(c, "jumptable", llvm_array_type, alignment); + LLVMValueRef jmptable = llvm_add_global_raw(c, "jumptable", llvm_array_type, 0); switch_ast->switch_stmt.codegen.jump.jmptable = jmptable; llvm_set_private_declaration(jmptable); diff --git a/test/test_suite/switch/enum_jump_switch_and_range.c3t b/test/test_suite/switch/enum_jump_switch_and_range.c3t index 6cb2f6f2b..9f4956a68 100644 --- a/test/test_suite/switch/enum_jump_switch_and_range.c3t +++ b/test/test_suite/switch/enum_jump_switch_and_range.c3t @@ -39,9 +39,9 @@ fn void main(String[] args) /* #expect: test.ll -@jumptable = private unnamed_addr constant [3 x ptr] [ptr blockaddress(@test.second_test, %switch.case), ptr blockaddress(@test.second_test, %switch.case), ptr blockaddress(@test.second_test, %switch.case)], align 4 -@jumptable.1 = private unnamed_addr constant [9 x ptr] [ptr blockaddress(@test.third_test, %switch.case), ptr blockaddress(@test.third_test, %switch.case), ptr blockaddress(@test.third_test, %switch.case), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.case14)], align 4 -@jumptable.4 = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@test.main, %switch.case), ptr blockaddress(@test.main, %switch.case14)], align 4 +@jumptable = private unnamed_addr constant [3 x ptr] [ptr blockaddress(@test.second_test, %switch.case), ptr blockaddress(@test.second_test, %switch.case), ptr blockaddress(@test.second_test, %switch.case)], align 8 +@jumptable.1 = private unnamed_addr constant [9 x ptr] [ptr blockaddress(@test.third_test, %switch.case), ptr blockaddress(@test.third_test, %switch.case), ptr blockaddress(@test.third_test, %switch.case), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.exit), ptr blockaddress(@test.third_test, %switch.case14)], align 8 +@jumptable.4 = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@test.main, %switch.case), ptr blockaddress(@test.main, %switch.case14)], align 8 store i32 %0, ptr %switch, align 4 br label %switch.entry diff --git a/test/test_suite/switch/jump_bugs.c3t b/test/test_suite/switch/jump_bugs.c3t index 8947effc0..e457668dc 100644 --- a/test/test_suite/switch/jump_bugs.c3t +++ b/test/test_suite/switch/jump_bugs.c3t @@ -25,7 +25,7 @@ fn void main() /* #expect: test.ll -@jumptable = private unnamed_addr constant [1 x ptr] [ptr blockaddress(@test.test1, %switch.case)], align 4 +@jumptable = private unnamed_addr constant [1 x ptr] [ptr blockaddress(@test.test1, %switch.case)], align 8 define void @test.test1() #0 { entry: diff --git a/test/test_suite/switch/simple_jump.c3t b/test/test_suite/switch/simple_jump.c3t index 883fcf557..7e564f73d 100644 --- a/test/test_suite/switch/simple_jump.c3t +++ b/test/test_suite/switch/simple_jump.c3t @@ -66,12 +66,12 @@ fn void test6(int a) /* #expect: simple_jump.ll -@jumptable = private unnamed_addr constant [3 x ptr] [ptr blockaddress(@simple_jump.test1, %switch.case1), ptr blockaddress(@simple_jump.test1, %switch.case), ptr blockaddress(@simple_jump.test1, %switch.case1)], align 4 -@jumptable.1 = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@simple_jump.test2, %switch.case), ptr blockaddress(@simple_jump.test2, %switch.case1)], align 4 -@jumptable.2 = private unnamed_addr constant [3 x ptr] [ptr blockaddress(@simple_jump.test3, %switch.case), ptr blockaddress(@simple_jump.test3, %switch.exit), ptr blockaddress(@simple_jump.test3, %switch.case1)], align 4 -@jumptable.3 = private unnamed_addr constant [1 x ptr] [ptr blockaddress(@simple_jump.test4, %switch.case)], align 4 -@jumptable.4 = private unnamed_addr constant [4 x ptr] [ptr blockaddress(@simple_jump.test5, %switch.case), ptr blockaddress(@simple_jump.test5, %switch.default), ptr blockaddress(@simple_jump.test5, %switch.default), ptr blockaddress(@simple_jump.test5, %switch.case1)], align 4 -@jumptable.5 = private unnamed_addr constant [5 x ptr] [ptr blockaddress(@simple_jump.test6, %switch.case), ptr blockaddress(@simple_jump.test6, %switch.default), ptr blockaddress(@simple_jump.test6, %switch.default), ptr blockaddress(@simple_jump.test6, %switch.case1), ptr blockaddress(@simple_jump.test6, %switch.case2)], align 4 +@jumptable = private unnamed_addr constant [3 x ptr] [ptr blockaddress(@simple_jump.test1, %switch.case1), ptr blockaddress(@simple_jump.test1, %switch.case), ptr blockaddress(@simple_jump.test1, %switch.case1)], align 8 +@jumptable.1 = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@simple_jump.test2, %switch.case), ptr blockaddress(@simple_jump.test2, %switch.case1)], align 8 +@jumptable.2 = private unnamed_addr constant [3 x ptr] [ptr blockaddress(@simple_jump.test3, %switch.case), ptr blockaddress(@simple_jump.test3, %switch.exit), ptr blockaddress(@simple_jump.test3, %switch.case1)], align 8 +@jumptable.3 = private unnamed_addr constant [1 x ptr] [ptr blockaddress(@simple_jump.test4, %switch.case)], align 8 +@jumptable.4 = private unnamed_addr constant [4 x ptr] [ptr blockaddress(@simple_jump.test5, %switch.case), ptr blockaddress(@simple_jump.test5, %switch.default), ptr blockaddress(@simple_jump.test5, %switch.default), ptr blockaddress(@simple_jump.test5, %switch.case1)], align 8 +@jumptable.5 = private unnamed_addr constant [5 x ptr] [ptr blockaddress(@simple_jump.test6, %switch.case), ptr blockaddress(@simple_jump.test6, %switch.default), ptr blockaddress(@simple_jump.test6, %switch.default), ptr blockaddress(@simple_jump.test6, %switch.case1), ptr blockaddress(@simple_jump.test6, %switch.case2)], align 8 after_check12: ; preds = %noerr_block8 br label %noerr_block14