1;; Check encodings of trap instructions and that their properties are set 2;; correctly so that they are not placed after the stack frame is destroyed. 3 4; RUN: llc < %s -mtriple=arm-apple-darwin | FileCheck %s -check-prefix=DARWIN 5; RUN: llc < %s -mtriple=arm-apple-darwin -trap-func=_trap | FileCheck %s -check-prefix=FUNC 6; RUN: llc < %s -mtriple=arm-apple-darwin -trap-func=_trap -O0 | FileCheck %s -check-prefix=FUNC 7; RUN: llc < %s -mtriple=armv7 -mattr=+nacl-trap | FileCheck %s -check-prefix=NACL 8; RUN: llc < %s -mtriple=armv7 | FileCheck %s -check-prefix=ARM 9; RUN: llc < %s -mtriple=thumbv7 | FileCheck %s -check-prefix=THUMB 10 11; RUN: llc -mtriple=armv7 -mattr=+nacl-trap -filetype=obj %s -o - \ 12; RUN: | llvm-objdump -d --triple=armv7 --mattr=+nacl-trap - \ 13; RUN: | FileCheck %s -check-prefix=ENCODING-NACL 14; RUN: llc -verify-machineinstrs -fast-isel -mtriple=armv7 -mattr=+nacl-trap -filetype=obj %s -o - \ 15; RUN: | llvm-objdump -d --triple=armv7 --mattr=+nacl-trap - \ 16; RUN: | FileCheck %s -check-prefix=ENCODING-NACL 17 18; RUN: llc -mtriple=armv7 -filetype=obj %s -o - \ 19; RUN: | llvm-objdump -d --triple=armv7 - \ 20; RUN: | FileCheck %s -check-prefix=ENCODING-ARM 21; RUN: llc -verify-machineinstrs -fast-isel -mtriple=armv7 -filetype=obj %s -o - \ 22; RUN: | llvm-objdump -d --triple=armv7 - \ 23; RUN: | FileCheck %s -check-prefix=ENCODING-ARM 24 25; RUN: llc -mtriple=thumbv7 -filetype=obj %s -o - \ 26; RUN: | llvm-objdump -d --triple=thumbv7 - \ 27; RUN: | FileCheck %s -check-prefix=ENCODING-THUMB 28; RUN: llc -verify-machineinstrs -fast-isel -mtriple=thumbv7 -filetype=obj %s -o - \ 29; RUN: | llvm-objdump -d --triple=thumbv7 - \ 30; RUN: | FileCheck %s -check-prefix=ENCODING-THUMB 31 32; rdar://7961298 33; rdar://9249183 34 35define void @t() noinline optnone { 36entry: 37 ;; So that we have a stack frame. 38 %1 = alloca i32, align 4 39 store volatile i32 0, ptr %1, align 4 40 41; DARWIN-LABEL: t: 42; DARWIN: trap 43; DARWIN-NEXT: add sp, sp, #4 44 45; FUNC-LABEL: t: 46; FUNC: bl __trap 47; FUNC-NEXT: add sp, sp, #4 48 49; NACL-LABEL: t: 50; NACL: .inst 0xe7fedef0 51; NACL-NEXT: add sp, sp, #4 52 53; ARM-LABEL: t: 54; ARM: .inst 0xe7ffdefe 55; ARM-NEXT: add sp, sp, #4 56 57; THUMB-LABEL: t: 58; THUMB: .inst.n 0xdefe 59; THUMB-NEXT: add sp, #4 60 61; ENCODING-NACL: e7fedef0 trap 62 63; ENCODING-ARM: e7ffdefe trap 64 65; ENCODING-THUMB: defe trap 66 67 call void @llvm.trap() 68 ret void 69} 70 71define void @t2() { 72entry: 73 ;; So that we have a stack frame. 74 %1 = alloca i32, align 4 75 store volatile i32 0, ptr %1, align 4 76 77; DARWIN-LABEL: t2: 78; DARWIN: udf #254 79; DARWIN-NEXT: add sp, sp, #4 80 81; FUNC-LABEL: t2: 82; FUNC: bl __trap 83; FUNC-NEXT: add sp, sp, #4 84 85; NACL-LABEL: t2: 86; NACL: bkpt #0 87; NACL-NEXT: add sp, sp, #4 88 89; ARM-LABEL: t2: 90; ARM: bkpt #0 91; ARM-NEXT: add sp, sp, #4 92 93; THUMB-LABEL: t2: 94; THUMB: bkpt #0 95; THUMB-NEXT: add sp, #4 96 97; ENCODING-NACL: e1200070 bkpt #0 98 99; ENCODING-ARM: e1200070 bkpt #0 100 101; ENCODING-THUMB: be00 bkpt #0 102 103 call void @llvm.debugtrap() 104 ret void 105} 106 107declare void @llvm.trap() nounwind 108declare void @llvm.debugtrap() nounwind 109