| Index: test/MC/Mips/nacl-long-branch.ll
|
| diff --git a/test/MC/Mips/nacl-long-branch.ll b/test/MC/Mips/nacl-long-branch.ll
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..33ad41fcdc098a045c4d1d16022f16da6ee7af6e
|
| --- /dev/null
|
| +++ b/test/MC/Mips/nacl-long-branch.ll
|
| @@ -0,0 +1,89 @@
|
| +; RUN: llc -filetype=obj -sfi-load -sfi-store -sfi-stack -sfi-branch -sfi-data \
|
| +; RUN: -force-mips-long-branch -O3 -mtriple mipsel-none-nacl %s -o - \
|
| +; RUN: | llvm-objdump -triple mipsel -disassemble -no-show-raw-insn - \
|
| +; RUN: | FileCheck %s
|
| +
|
| +; RUN: llc -filetype=obj -O3 -mtriple mipsel-none-nacl %s -o - \
|
| +; RUN: | llvm-objdump -triple mipsel -disassemble -no-show-raw-insn - \
|
| +; RUN: | FileCheck %s -check-prefix=CHECK-NOSFI
|
| +
|
| +
|
| +declare void @f()
|
| +
|
| +define void @long_branch(i32 %arg) {
|
| +entry:
|
| + %cmp = icmp eq i32 %arg, 0
|
| + br i1 %cmp, label %if.then, label %if.end
|
| +if.then:
|
| + tail call void @f()
|
| + br label %if.end
|
| +if.end:
|
| + ret void
|
| +}
|
| +
|
| +; This file tests that MipsLongBranchPass works with sandboxing.
|
| +; The nonsandboxed code of the previous function is:
|
| +
|
| +; long_branch:
|
| +; CHECK-NOSFI: 0: lui $2, 0
|
| +; CHECK-NOSFI: 4: addiu $2, $2, 0
|
| +; CHECK-NOSFI: 8: addiu $sp, $sp, -24
|
| +; CHECK-NOSFI: c: sw $ra, 20($sp)
|
| +; CHECK-NOSFI: 10: bne $4, $zero, 20
|
| +; CHECK-NOSFI: 14: addu $gp, $2, $25
|
| +; CHECK-NOSFI: 18: lw $25, 0($gp)
|
| +; CHECK-NOSFI: 1c: jalr $25
|
| +; CHECK-NOSFI: 20: nop
|
| +; CHECK-NOSFI: 24: lw $ra, 20($sp)
|
| +; CHECK-NOSFI: 28: addiu $sp, $sp, 24
|
| +; CHECK-NOSFI: 2c: jr $ra
|
| +; CHECK-NOSFI: 30: nop
|
| +
|
| +; We pass -force-mips-long-branch option to llc to make sure that bne
|
| +; instruction is expanded into long branch. We specifically test that
|
| +; in the expanded sandboxed long branch sequence the offset that LUi/ADDiu
|
| +; instructions create is the correct offset from the ADDiu instruction to the
|
| +; branch target (which is lw $ra, 20($sp) in this case). More precisely:
|
| +;
|
| +; 0x80 - 0x40 = 64,
|
| +; where 0x40 and 0x80 are addresses and 64 is in the "addiu" at 0x40.
|
| +
|
| +; 0: lui $2, 0
|
| +; 4: addiu $2, $2, 0
|
| +; 8: addiu $sp, $sp, -24
|
| +; c: and $sp, $sp, $15
|
| +; 10: sw $ra, 20($sp)
|
| +; 14: beq $4, $zero, 80
|
| +; 18: addu $gp, $2, $25
|
| +; 1c: nop
|
| +; 20: addiu $sp, $sp, -8
|
| +; 24: and $sp, $sp, $15
|
| +; 28: sw $ra, 0($sp)
|
| +; 2c: nop
|
| +; 30: nop
|
| +; 34: nop
|
| +; CHECK: 38: bal 8
|
| +; CHECK-NEXT: 3c: lui $1, 0
|
| +; CHECK-NEXT: 40: addiu $1, $1, 64
|
| +; CHECK: addu $1, $ra, $1
|
| +; CHECK: lw $ra, 0($sp)
|
| +; CHECK: nop
|
| +; CHECK: addiu $sp, $sp, 8
|
| +; CHECK: and $sp, $sp, $15
|
| +; CHECK: and $1, $1, $14
|
| +; CHECK: jr $1
|
| +; CHECK: nop
|
| +; 64: and $gp, $gp, $15
|
| +; 68: lw $25, 0($gp)
|
| +; 6c: nop
|
| +; 70: nop
|
| +; 74: and $25, $25, $14
|
| +; 78: jalr $25
|
| +; 7c: nop
|
| +; CHECK: 80: lw $ra, 20($sp)
|
| +; 84: addiu $sp, $sp, 24
|
| +; 88: and $sp, $sp, $15
|
| +; 8c: nop
|
| +; 90: and $ra, $ra, $14
|
| +; 94: jr $ra
|
| +; 98: nop
|
|
|