diff options
author | Eli Bendersky <eliben@chromium.org> | 2012-11-26 13:49:14 -0800 |
---|---|---|
committer | Eli Bendersky <eliben@chromium.org> | 2012-11-26 13:49:14 -0800 |
commit | 3b46d602e10074ce1d54b49a3c5ec9ed708425a6 (patch) | |
tree | eae89ea2317a8a0a6ef6b8c355e52f52e65344d1 | |
parent | e51b3e6f912503646b1c1ae0a82f08c42bfa36b5 (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.ll | 17 | ||||
-rw-r--r-- | test/NaCl/ARM/bx-sandboxing.ll | 10 | ||||
-rw-r--r-- | test/NaCl/ARM/call-return-sandboxing1.ll | 71 | ||||
-rw-r--r-- | test/NaCl/ARM/stack-change-sandboxing.ll | 34 |
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 + +} + |