; RUN: rm -rf %t && split-file %s %t ;--- err1.ll ; RUN: not --crash llc %t/err1.ll -mtriple=aarch64-elf \ ; RUN: -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \ ; RUN: -code-model=large \ ; RUN: -o - -verify-machineinstrs 2>&1 | FileCheck %s --check-prefix=ERR1 ; RUN: not --crash llc %t/err1.ll -mtriple=aarch64-elf \ ; RUN: -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \ ; RUN: -global-isel -global-isel-abort=1 \ ; RUN: -code-model=large \ ; RUN: -o - -verify-machineinstrs 2>&1 | FileCheck %s --check-prefix=ERR1 ; ERR1: LLVM ERROR: Unsupported code-model for hardened jump-table define i32 @test_jumptable(i32 %in) "aarch64-jump-table-hardening" { switch i32 %in, label %def [ i32 0, label %lbl1 i32 1, label %lbl2 ] def: ret i32 0 lbl1: ret i32 1 lbl2: ret i32 2 } ;--- test.ll ; RUN: llc %t/test.ll -mtriple=arm64-apple-darwin -aarch64-enable-collect-loh=0 \ ; RUN: -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \ ; RUN: -o - -verify-machineinstrs | FileCheck %s --check-prefix=MACHO ; RUN: llc %t/test.ll -mtriple=arm64-apple-darwin -aarch64-enable-collect-loh=0 \ ; RUN: -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \ ; RUN: -global-isel -global-isel-abort=1 \ ; RUN: -o - -verify-machineinstrs | FileCheck %s --check-prefix=MACHO ; RUN: llc %t/test.ll -mtriple=arm64-apple-darwin -aarch64-enable-collect-loh=0 \ ; RUN: -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \ ; RUN: -code-model=large \ ; RUN: -o - -verify-machineinstrs | FileCheck %s --check-prefix=MACHO ; RUN: llc %t/test.ll -mtriple=arm64-apple-darwin -aarch64-enable-collect-loh=0 \ ; RUN: -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \ ; RUN: -global-isel -global-isel-abort=1 \ ; RUN: -code-model=large \ ; RUN: -o - -verify-machineinstrs | FileCheck %s --check-prefix=MACHO ; RUN: llc %t/test.ll -mtriple=aarch64-elf \ ; RUN: -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \ ; RUN: -o - -verify-machineinstrs | FileCheck %s --check-prefix=ELF ; RUN: llc %t/test.ll -mtriple=aarch64-elf \ ; RUN: -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \ ; RUN: -global-isel -global-isel-abort=1 \ ; RUN: -o - -verify-machineinstrs | FileCheck %s --check-prefix=ELF ; MACHO-LABEL: test_jumptable: ; MACHO: mov w16, w0 ; MACHO: cmp x16, #5 ; MACHO: csel x16, x16, xzr, ls ; MACHO-NEXT: adrp x17, LJTI0_0@PAGE ; MACHO-NEXT: add x17, x17, LJTI0_0@PAGEOFF ; MACHO-NEXT: ldrsw x16, [x17, x16, lsl #2] ; MACHO-NEXT: Ltmp0: ; MACHO-NEXT: adr x17, Ltmp0 ; MACHO-NEXT: add x16, x17, x16 ; MACHO-NEXT: br x16 ; ELF-LABEL: test_jumptable: ; ELF: mov w16, w0 ; ELF: cmp x16, #5 ; ELF: csel x16, x16, xzr, ls ; ELF-NEXT: adrp x17, .LJTI0_0 ; ELF-NEXT: add x17, x17, :lo12:.LJTI0_0 ; ELF-NEXT: ldrsw x16, [x17, x16, lsl #2] ; ELF-NEXT: .Ltmp0: ; ELF-NEXT: adr x17, .Ltmp0 ; ELF-NEXT: add x16, x17, x16 ; ELF-NEXT: br x16 define i32 @test_jumptable(i32 %in) "aarch64-jump-table-hardening" { switch i32 %in, label %def [ i32 0, label %lbl1 i32 1, label %lbl2 i32 2, label %lbl3 i32 4, label %lbl4 i32 5, label %lbl5 ] def: ret i32 0 lbl1: ret i32 1 lbl2: ret i32 2 lbl3: ret i32 4 lbl4: ret i32 8 lbl5: ret i32 10 } ; MACHO-LABEL: LJTI0_0: ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0 ; ELF-LABEL: .LJTI0_0: ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0