aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Bendersky <eliben@chromium.org>2012-11-26 13:49:14 -0800
committerEli Bendersky <eliben@chromium.org>2012-11-26 13:49:14 -0800
commit3b46d602e10074ce1d54b49a3c5ec9ed708425a6 (patch)
treeeae89ea2317a8a0a6ef6b8c355e52f52e65344d1
parente51b3e6f912503646b1c1ae0a82f08c42bfa36b5 (diff)
Add more tests for sandboxing on ARM
* Stack modifications * Calls and returns * Bundling * bx lr * Indirect blx BUG=none Review URL: https://codereview.chromium.org/11280129
-rw-r--r--test/NaCl/ARM/blx-sandboxing.ll17
-rw-r--r--test/NaCl/ARM/bx-sandboxing.ll10
-rw-r--r--test/NaCl/ARM/call-return-sandboxing1.ll71
-rw-r--r--test/NaCl/ARM/stack-change-sandboxing.ll34
4 files changed, 132 insertions, 0 deletions
diff --git a/test/NaCl/ARM/blx-sandboxing.ll b/test/NaCl/ARM/blx-sandboxing.ll
new file mode 100644
index 0000000000..441bcac6ae
--- /dev/null
+++ b/test/NaCl/ARM/blx-sandboxing.ll
@@ -0,0 +1,17 @@
+; RUN: llc -mtriple=armv7-unknown-nacl -sfi-branch -filetype=obj %s -o - \
+; RUN: | llvm-objdump -disassemble -triple armv7 - | FileCheck %s
+
+define i32 @foobar(i32 %aa, i32 %bb, i32 (i32)* %f) nounwind {
+entry:
+ %aa.addr = alloca i32, align 4
+ %bb.addr = alloca i32, align 4
+ %f.addr = alloca i32 (i32)*, align 8
+ %0 = load i32 (i32)** %f.addr, align 8
+ %1 = load i32* %aa.addr, align 4
+ %call1 = call i32 %0(i32 %1)
+; CHECK: bic r1, r1, #3221225487
+; CHECK-NEXT: blx r1
+ ret i32 %call1
+}
+
+
diff --git a/test/NaCl/ARM/bx-sandboxing.ll b/test/NaCl/ARM/bx-sandboxing.ll
new file mode 100644
index 0000000000..dcb259ad6c
--- /dev/null
+++ b/test/NaCl/ARM/bx-sandboxing.ll
@@ -0,0 +1,10 @@
+; RUN: llc -mtriple=armv7-unknown-nacl -sfi-branch -filetype=obj %s -o - \
+; RUN: | llvm-objdump -disassemble -triple armv7 - | FileCheck %s
+
+define i32 @foo() nounwind {
+entry:
+ ret i32 42
+; CHECK: bic lr, lr, #3221225487
+; CHECK-NEXT: bx lr
+}
+
diff --git a/test/NaCl/ARM/call-return-sandboxing1.ll b/test/NaCl/ARM/call-return-sandboxing1.ll
new file mode 100644
index 0000000000..a70d0cd49d
--- /dev/null
+++ b/test/NaCl/ARM/call-return-sandboxing1.ll
@@ -0,0 +1,71 @@
+; RUN: llc -mtriple=armv7-unknown-nacl -sfi-branch -filetype=obj %s -o - \
+; RUN: | llvm-objdump -disassemble -triple armv7 - | FileCheck %s
+
+define i32 @foo(i32 %aa, i32 %bb) nounwind {
+entry:
+ %aa.addr = alloca i32, align 4
+ %bb.addr = alloca i32, align 4
+ %cc = alloca i32, align 4
+ %dd = alloca i32, align 4
+ store i32 %aa, i32* %aa.addr, align 4
+ store i32 %bb, i32* %bb.addr, align 4
+ %0 = load i32* %aa.addr, align 4
+ %1 = load i32* %bb.addr, align 4
+ %mul = mul nsw i32 %0, %1
+ store i32 %mul, i32* %cc, align 4
+ %2 = load i32* %aa.addr, align 4
+ %mul1 = mul nsw i32 %2, 17
+ %3 = load i32* %cc, align 4
+ %sub = sub nsw i32 %mul1, %3
+ store i32 %sub, i32* %dd, align 4
+ %4 = load i32* %dd, align 4
+ ret i32 %4
+
+; This checks two things:
+; 1. bx lr is sandboxed by prepending a bic
+; 2. The bic/bx pair don't straddle a 16-byte bundle boundary, hence the nop
+; CHECK: nop
+; CHECK-NEXT: bic lr, lr, #3221225487
+; CHECK-NEXT: bx lr
+
+}
+
+define i32 @bar(i32 %aa, i32 %bb) nounwind {
+entry:
+
+; Check that the function start is padded with nops to start at a bundle
+; boundary
+; CHECK: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: push
+
+ %aa.addr = alloca i32, align 4
+ %bb.addr = alloca i32, align 4
+ store i32 %aa, i32* %aa.addr, align 4
+ store i32 %bb, i32* %bb.addr, align 4
+ %0 = load i32* %aa.addr, align 4
+ %mul = mul nsw i32 %0, 19
+ %call = call i32 @foo(i32 %mul, i32 7)
+
+; Check that the call is padded to be at the end of a bundle
+; CHECK: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: bl
+
+ %1 = load i32* %bb.addr, align 4
+ %mul1 = mul nsw i32 %1, 31
+ %2 = load i32* %bb.addr, align 4
+ %div = sdiv i32 %2, 7
+ %add = add nsw i32 %div, 191
+ %call2 = call i32 @foo(i32 %mul1, i32 %add)
+
+; Check that the call is padded to be at the end of a bundle
+; CHECK: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: bl
+
+ %add3 = add nsw i32 %call, %call2
+ ret i32 %add3
+}
+
diff --git a/test/NaCl/ARM/stack-change-sandboxing.ll b/test/NaCl/ARM/stack-change-sandboxing.ll
new file mode 100644
index 0000000000..30a72a4ca1
--- /dev/null
+++ b/test/NaCl/ARM/stack-change-sandboxing.ll
@@ -0,0 +1,34 @@
+; RUN: llc -mtriple=armv7-unknown-nacl -sfi-stack -filetype=obj %s -o - \
+; RUN: | llvm-objdump -disassemble -triple armv7 - | FileCheck %s
+
+define i32 @foo(i32 %aa, i32 %bb) nounwind {
+entry:
+
+; CHECK: sub sp, sp, #16
+; CHECK-NEXT: bic sp, sp, #3221225472
+
+ %aa.addr = alloca i32, align 4
+ %bb.addr = alloca i32, align 4
+ %cc = alloca i32, align 4
+ %dd = alloca i32, align 4
+ store i32 %aa, i32* %aa.addr, align 4
+ store i32 %bb, i32* %bb.addr, align 4
+ %0 = load i32* %aa.addr, align 4
+ %1 = load i32* %bb.addr, align 4
+ %mul = mul nsw i32 %0, %1
+ store i32 %mul, i32* %cc, align 4
+ %2 = load i32* %aa.addr, align 4
+ %mul1 = mul nsw i32 %2, 17
+ %3 = load i32* %cc, align 4
+ %sub = sub nsw i32 %mul1, %3
+ store i32 %sub, i32* %dd, align 4
+ %4 = load i32* %dd, align 4
+ ret i32 %4
+
+; The nop here is to prevent add/bic to straddle a bundle boundary
+; CHECK: nop
+; CHECK-NEXT: add sp, sp, #16
+; CHECK-NEXT: bic sp, sp, #3221225472
+
+}
+