summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2018-10-24 18:10:38 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2018-10-24 18:10:38 +0000
commit4bb928c11010e1ba38b19ee89ac77ed1d096a76a (patch)
treebadb64132e1de3362c5f016c624786f5c325cca2 /llvm/test/CodeGen/ARM
parentf124275cf9ddc8b8da68349f5f166640b31473be (diff)
downloadbcm5719-llvm-4bb928c11010e1ba38b19ee89ac77ed1d096a76a.tar.gz
bcm5719-llvm-4bb928c11010e1ba38b19ee89ac77ed1d096a76a.zip
ARM: Use BKPT instead of TRAP to implement llvm.debugtrap.
The BKPT instruction is specified to cause a software breakpoint, and at least on Linux results in a SIGTRAP. This makes it more suitable for implementing debugtrap than TRAP (aka UDF #254), which is specified to cause an undefined instruction exception and results in a SIGILL on Linux. Moreover, BKPT is not marked as a terminator, which is not only consistent with the IR instruction but allows the analyzeBlock function to correctly analyze a basic block containing the instruction, which fixes an assertion failure in the machine block placement pass previously triggered by the included test case. Because BKPT is only supported starting with ARMv5T, we continue to use UDF #254 when targeting v4T. Differential Revision: https://reviews.llvm.org/D53614 llvm-svn: 345171
Diffstat (limited to 'llvm/test/CodeGen/ARM')
-rw-r--r--llvm/test/CodeGen/ARM/analyze-branch-bkpt.ll61
-rw-r--r--llvm/test/CodeGen/ARM/debugtrap.ll8
-rw-r--r--llvm/test/CodeGen/ARM/trap.ll14
3 files changed, 74 insertions, 9 deletions
diff --git a/llvm/test/CodeGen/ARM/analyze-branch-bkpt.ll b/llvm/test/CodeGen/ARM/analyze-branch-bkpt.ll
new file mode 100644
index 00000000000..cba89fe9987
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/analyze-branch-bkpt.ll
@@ -0,0 +1,61 @@
+; RUN: llc -o - %s -mtriple thumbv4-unknown-linux-android | FileCheck --check-prefix=V4 %s
+; RUN: llc -o - %s -mtriple thumbv5-unknown-linux-android | FileCheck --check-prefix=V5 %s
+
+; V4: udf #254
+; V5: bkpt #0
+
+define i1 @a(i32 %b) !dbg !3 {
+ br i1 undef, label %c, label %d, !dbg !4
+
+d: ; preds = %0
+ call void @llvm.debugtrap()
+ br label %ah, !dbg !4
+
+c: ; preds = %0
+ %aj = icmp ne i20 undef, 5
+ br label %ah, !dbg !4
+
+ah: ; preds = %c, %d
+ %ak = phi i1 [ false, %d ], [ %aj, %c ]
+ call void @llvm.dbg.value(metadata i1 %ak, metadata !7, metadata !DIExpression()), !dbg !9
+ switch i32 %b, label %al [
+ i32 0, label %am
+ i32 10, label %an
+ ]
+
+an: ; preds = %ah
+ %ch = select i1 %ak, i32 0, i32 5
+ br label %am, !dbg !10
+
+al: ; preds = %ah
+ br label %am, !dbg !9
+
+am: ; preds = %al, %an, %ah
+ %1 = phi i32 [ 0, %al ], [ %ch, %an ], [ %b, %ah ]
+ unreachable
+}
+
+; Function Attrs: nounwind readnone speculatable
+declare void @llvm.dbg.value(metadata, metadata, metadata) #0
+
+; Function Attrs: nounwind
+declare void @llvm.debugtrap() #1
+
+attributes #0 = { nounwind readnone speculatable }
+attributes #1 = { nounwind }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug)
+!1 = !DIFile(filename: "a", directory: "")
+!2 = !{i32 2, !"Debug Info Version", i32 3}
+!3 = distinct !DISubprogram(scope: null, isLocal: false, isDefinition: true, isOptimized: false, unit: !0)
+!4 = !DILocation(line: 0, scope: !5, inlinedAt: !6)
+!5 = distinct !DISubprogram(scope: null, isLocal: false, isDefinition: true, isOptimized: false, unit: !0)
+!6 = !DILocation(line: 0, scope: !3)
+!7 = !DILocalVariable(scope: !8)
+!8 = distinct !DISubprogram(scope: null, isLocal: false, isDefinition: true, isOptimized: false, unit: !0)
+!9 = !DILocation(line: 0, scope: !8, inlinedAt: !6)
+!10 = !DILocation(line: 0, scope: !11, inlinedAt: !6)
+!11 = !DILexicalBlock(scope: !8)
diff --git a/llvm/test/CodeGen/ARM/debugtrap.ll b/llvm/test/CodeGen/ARM/debugtrap.ll
index 5064a4ec2ca..88ca81c4f2c 100644
--- a/llvm/test/CodeGen/ARM/debugtrap.ll
+++ b/llvm/test/CodeGen/ARM/debugtrap.ll
@@ -1,7 +1,10 @@
; This test ensures the @llvm.debugtrap() call is not removed when generating
; the 'pop' instruction to restore the callee saved registers on ARM.
-; RUN: llc < %s -mtriple=armv7 -O0 -filetype=asm | FileCheck %s
+; RUN: llc < %s -mtriple=armv4 -O0 -filetype=asm | FileCheck --check-prefixes=CHECK,V4 %s
+; RUN: llc < %s -mtriple=armv5 -O0 -filetype=asm | FileCheck --check-prefixes=CHECK,V5 %s
+; RUN: llc < %s -mtriple=thumbv4 -O0 -filetype=asm | FileCheck --check-prefixes=CHECK,V4 %s
+; RUN: llc < %s -mtriple=thumbv5 -O0 -filetype=asm | FileCheck --check-prefixes=CHECK,V5 %s
declare void @llvm.debugtrap() nounwind
declare void @foo() nounwind
@@ -9,8 +12,9 @@ declare void @foo() nounwind
define void @test() nounwind {
entry:
; CHECK: bl foo
+ ; V4-NEXT: udf #254
+ ; V5-NEXT: bkpt #0
; CHECK-NEXT: pop
- ; CHECK-NEXT: .inst 0xe7ffdefe
call void @foo()
call void @llvm.debugtrap()
ret void
diff --git a/llvm/test/CodeGen/ARM/trap.ll b/llvm/test/CodeGen/ARM/trap.ll
index 585218cf337..c45f7133feb 100644
--- a/llvm/test/CodeGen/ARM/trap.ll
+++ b/llvm/test/CodeGen/ARM/trap.ll
@@ -59,25 +59,25 @@ entry:
define void @t2() nounwind {
entry:
; DARWIN-LABEL: t2:
-; DARWIN: trap
+; DARWIN: udf #254
; FUNC-LABEL: t2:
; FUNC: bl __trap
; NACL-LABEL: t2:
-; NACL: .inst 0xe7fedef0
+; NACL: bkpt #0
; ARM-LABEL: t2:
-; ARM: .inst 0xe7ffdefe
+; ARM: bkpt #0
; THUMB-LABEL: t2:
-; THUMB: .inst.n 0xdefe
+; THUMB: bkpt #0
-; ENCODING-NACL: f0 de fe e7 trap
+; ENCODING-NACL: 70 00 20 e1 bkpt #0
-; ENCODING-ARM: fe de ff e7 trap
+; ENCODING-ARM: 70 00 20 e1 bkpt #0
-; ENCODING-THUMB: fe de trap
+; ENCODING-THUMB: 00 be bkpt #0
call void @llvm.debugtrap()
unreachable
OpenPOWER on IntegriCloud