diff options
author | Matheus Almeida <matheus.almeida@imgtec.com> | 2013-12-13 11:11:02 +0000 |
---|---|---|
committer | Matheus Almeida <matheus.almeida@imgtec.com> | 2013-12-13 11:11:02 +0000 |
commit | b90ed644fc9eaba125db767ca2f7db0efc2edd02 (patch) | |
tree | 0340deb3598f49a779367713d02ee83018b182d5 /test/MC | |
parent | 09b39002068d9cbcb44237a2fb8b39de72b4d6cd (diff) | |
download | llvm-b90ed644fc9eaba125db767ca2f7db0efc2edd02.tar.gz llvm-b90ed644fc9eaba125db767ca2f7db0efc2edd02.tar.bz2 llvm-b90ed644fc9eaba125db767ca2f7db0efc2edd02.tar.xz |
[mips] Add checks for alignment and maximum displacements for most of the
branch instructions for mips and micromips instruction sets thus avoiding
the situation of generating branches to undesired locations if offsets
cannot be encoded.
This patch also checks if a fixup cannot be applied and returns a fatal error
if that's the case.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197223 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/MC')
-rw-r--r-- | test/MC/Mips/micromips-bad-branches.s | 225 | ||||
-rw-r--r-- | test/MC/Mips/micromips-diagnostic-fixup.s | 10 | ||||
-rw-r--r-- | test/MC/Mips/mips-bad-branches.s | 409 | ||||
-rw-r--r-- | test/MC/Mips/mips-diagnostic-fixup.s | 10 |
4 files changed, 654 insertions, 0 deletions
diff --git a/test/MC/Mips/micromips-bad-branches.s b/test/MC/Mips/micromips-bad-branches.s new file mode 100644 index 0000000000..573605e18d --- /dev/null +++ b/test/MC/Mips/micromips-bad-branches.s @@ -0,0 +1,225 @@ +# RUN: not llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 -mattr=+msa -arch=mips -mattr=+micromips 2>&1 | FileCheck %s +# +# CHECK: error: branch to misaligned address +# CHECK: b -65535 +# CHECK: error: branch target out of range +# CHECK: b -65537 +# CHECK: error: branch to misaligned address +# CHECK: b 65535 +# CHECK: error: branch target out of range +# CHECK: b 65536 + +# CHECK: error: branch to misaligned address +# CHECK: beq $1, $1, -65535 +# CHECK: error: branch target out of range +# CHECK: beq $1, $1, -65537 +# CHECK: error: branch to misaligned address +# CHECK: beq $1, $1, 65535 +# CHECK: error: branch target out of range +# CHECK: beq $1, $1, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bne $1, $1, -65535 +# CHECK: error: branch target out of range +# CHECK: bne $1, $1, -65537 +# CHECK: error: branch to misaligned address +# CHECK: bne $1, $1, 65535 +# CHECK: error: branch target out of range +# CHECK: bne $1, $1, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bal -65535 +# CHECK: error: branch target out of range +# CHECK: bal -65537 +# CHECK: error: branch to misaligned address +# CHECK: bal 65535 +# CHECK: error: branch target out of range +# CHECK: bal 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bgez $1, -65535 +# CHECK: error: branch target out of range +# CHECK: bgez $1, -65537 +# CHECK: error: branch to misaligned address +# CHECK: bgez $1, 65535 +# CHECK: error: branch target out of range +# CHECK: bgez $1, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bgtz $1, -65535 +# CHECK: error: branch target out of range +# CHECK: bgtz $1, -65537 +# CHECK: error: branch to misaligned address +# CHECK: bgtz $1, 65535 +# CHECK: error: branch target out of range +# CHECK: bgtz $1, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: blez $1, -65535 +# CHECK: error: branch target out of range +# CHECK: blez $1, -65537 +# CHECK: error: branch to misaligned address +# CHECK: blez $1, 65535 +# CHECK: error: branch target out of range +# CHECK: blez $1, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bltz $1, -65535 +# CHECK: error: branch target out of range +# CHECK: bltz $1, -65537 +# CHECK: error: branch to misaligned address +# CHECK: bltz $1, 65535 +# CHECK: error: branch target out of range +# CHECK: bltz $1, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bgezal $1, -65535 +# CHECK: error: branch target out of range +# CHECK: bgezal $1, -65537 +# CHECK: error: branch to misaligned address +# CHECK: bgezal $1, 65535 +# CHECK: error: branch target out of range +# CHECK: bgezal $1, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bltzal $1, -65535 +# CHECK: error: branch target out of range +# CHECK: bltzal $1, -65537 +# CHECK: error: branch to misaligned address +# CHECK: bltzal $1, 65535 +# CHECK: error: branch target out of range +# CHECK: bltzal $1, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bc1f -65535 +# CHECK: error: branch target out of range +# CHECK: bc1f -65537 +# CHECK: error: branch to misaligned address +# CHECK: bc1f 65535 +# CHECK: error: branch target out of range +# CHECK: bc1f 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bc1f $fcc0, -65535 +# CHECK: error: branch target out of range +# CHECK: bc1f $fcc0, -65537 +# CHECK: error: branch to misaligned address +# CHECK: bc1f $fcc0, 65535 +# CHECK: error: branch target out of range +# CHECK: bc1f $fcc0, 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bc1t -65535 +# CHECK: error: branch target out of range +# CHECK: bc1t -65537 +# CHECK: error: branch to misaligned address +# CHECK: bc1t 65535 +# CHECK: error: branch target out of range +# CHECK: bc1t 65536 + +# CHECK: error: branch to misaligned address +# CHECK: bc1t $fcc0, -65535 +# CHECK: error: branch target out of range +# CHECK: bc1t $fcc0, -65537 +# CHECK: error: branch to misaligned address +# CHECK: bc1t $fcc0, 65535 +# CHECK: error: branch target out of range +# CHECK: bc1t $fcc0, 65536 + + b -65535 + b -65536 + b -65537 + b 65534 + b 65535 + b 65536 + + beq $1, $1, -65535 + beq $1, $1, -65536 + beq $1, $1, -65537 + beq $1, $1, 65534 + beq $1, $1, 65535 + beq $1, $1, 65536 + + bne $1, $1, -65535 + bne $1, $1, -65536 + bne $1, $1, -65537 + bne $1, $1, 65534 + bne $1, $1, 65535 + bne $1, $1, 65536 + + bal -65535 + bal -65536 + bal -65537 + bal 65534 + bal 65535 + bal 65536 + + bgez $1, -65535 + bgez $1, -65536 + bgez $1, -65537 + bgez $1, 65534 + bgez $1, 65535 + bgez $1, 65536 + + bgtz $1, -65535 + bgtz $1, -65536 + bgtz $1, -65537 + bgtz $1, 65534 + bgtz $1, 65535 + bgtz $1, 65536 + + blez $1, -65535 + blez $1, -65536 + blez $1, -65537 + blez $1, 65534 + blez $1, 65535 + blez $1, 65536 + + bltz $1, -65535 + bltz $1, -65536 + bltz $1, -65537 + bltz $1, 65534 + bltz $1, 65535 + bltz $1, 65536 + + bgezal $1, -65535 + bgezal $1, -65536 + bgezal $1, -65537 + bgezal $1, 65534 + bgezal $1, 65535 + bgezal $1, 65536 + + bltzal $1, -65535 + bltzal $1, -65536 + bltzal $1, -65537 + bltzal $1, 65534 + bltzal $1, 65535 + bltzal $1, 65536 + + bc1f -65535 + bc1f -65536 + bc1f -65537 + bc1f 65534 + bc1f 65535 + bc1f 65536 + + bc1f $fcc0, -65535 + bc1f $fcc0, -65536 + bc1f $fcc0, -65537 + bc1f $fcc0, 65534 + bc1f $fcc0, 65535 + bc1f $fcc0, 65536 + + bc1t -65535 + bc1t -65536 + bc1t -65537 + bc1t 65534 + bc1t 65535 + bc1t 65536 + + bc1t $fcc0, -65535 + bc1t $fcc0, -65536 + bc1t $fcc0, -65537 + bc1t $fcc0, 65534 + bc1t $fcc0, 65535 + bc1t $fcc0, 65536 diff --git a/test/MC/Mips/micromips-diagnostic-fixup.s b/test/MC/Mips/micromips-diagnostic-fixup.s new file mode 100644 index 0000000000..f8fe447c28 --- /dev/null +++ b/test/MC/Mips/micromips-diagnostic-fixup.s @@ -0,0 +1,10 @@ +# RUN: not llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 -arch=mips -mattr=+micromips 2>&1 -filetype=obj | FileCheck %s +# +# CHECK: LLVM ERROR: out of range PC16 fixup + +.text + b foo + .space 65536 - 8, 1 # -8 = size of b instr plus size of automatically inserted nop + nop # This instr makes the branch too long to fit into a 17-bit offset +foo: + add $0,$0,$0 diff --git a/test/MC/Mips/mips-bad-branches.s b/test/MC/Mips/mips-bad-branches.s new file mode 100644 index 0000000000..321b3c45f8 --- /dev/null +++ b/test/MC/Mips/mips-bad-branches.s @@ -0,0 +1,409 @@ +# RUN: not llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 -arch=mips 2>&1 | FileCheck %s +# +# CHECK: error: branch to misaligned address +# CHECK: b -131069 +# CHECK: error: branch to misaligned address +# CHECK: b -131070 +# CHECK: error: branch to misaligned address +# CHECK: b -131071 +# CHECK: error: branch target out of range +# CHECK: b -131073 +# CHECK: error: branch to misaligned address +# CHECK: b 131069 +# CHECK: error: branch to misaligned address +# CHECK: b 131070 +# CHECK: error: branch to misaligned address +# CHECK: b 131071 +# CHECK: error: branch target out of range +# CHECK: b 131072 + +# CHECK: error: branch to misaligned address +# CHECK: beq $1, $1, -131069 +# CHECK: error: branch to misaligned address +# CHECK: beq $1, $1, -131070 +# CHECK: error: branch to misaligned address +# CHECK: beq $1, $1, -131071 +# CHECK: error: branch target out of range +# CHECK: beq $1, $1, -131073 +# CHECK: error: branch to misaligned address +# CHECK: beq $1, $1, 131069 +# CHECK: error: branch to misaligned address +# CHECK: beq $1, $1, 131070 +# CHECK: error: branch to misaligned address +# CHECK: beq $1, $1, 131071 +# CHECK: error: branch target out of range +# CHECK: beq $1, $1, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bne $1, $1, -131069 +# CHECK: error: branch to misaligned address +# CHECK: bne $1, $1, -131070 +# CHECK: error: branch to misaligned address +# CHECK: bne $1, $1, -131071 +# CHECK: error: branch target out of range +# CHECK: bne $1, $1, -131073 +# CHECK: error: branch to misaligned address +# CHECK: bne $1, $1, 131069 +# CHECK: error: branch to misaligned address +# CHECK: bne $1, $1, 131070 +# CHECK: error: branch to misaligned address +# CHECK: bne $1, $1, 131071 +# CHECK: error: branch target out of range +# CHECK: bne $1, $1, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bal -131069 +# CHECK: error: branch to misaligned address +# CHECK: bal -131070 +# CHECK: error: branch to misaligned address +# CHECK: bal -131071 +# CHECK: error: branch target out of range +# CHECK: bal -131073 +# CHECK: error: branch to misaligned address +# CHECK: bal 131069 +# CHECK: error: branch to misaligned address +# CHECK: bal 131070 +# CHECK: error: branch to misaligned address +# CHECK: bal 131071 +# CHECK: error: branch target out of range +# CHECK: bal 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bgez $1, -131069 +# CHECK: error: branch to misaligned address +# CHECK: bgez $1, -131070 +# CHECK: error: branch to misaligned address +# CHECK: bgez $1, -131071 +# CHECK: error: branch target out of range +# CHECK: bgez $1, -131073 +# CHECK: error: branch to misaligned address +# CHECK: bgez $1, 131069 +# CHECK: error: branch to misaligned address +# CHECK: bgez $1, 131070 +# CHECK: error: branch to misaligned address +# CHECK: bgez $1, 131071 +# CHECK: error: branch target out of range +# CHECK: bgez $1, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bgtz $1, -131069 +# CHECK: error: branch to misaligned address +# CHECK: bgtz $1, -131070 +# CHECK: error: branch to misaligned address +# CHECK: bgtz $1, -131071 +# CHECK: error: branch target out of range +# CHECK: bgtz $1, -131073 +# CHECK: error: branch to misaligned address +# CHECK: bgtz $1, 131069 +# CHECK: error: branch to misaligned address +# CHECK: bgtz $1, 131070 +# CHECK: error: branch to misaligned address +# CHECK: bgtz $1, 131071 +# CHECK: error: branch target out of range +# CHECK: bgtz $1, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: blez $1, -131069 +# CHECK: error: branch to misaligned address +# CHECK: blez $1, -131070 +# CHECK: error: branch to misaligned address +# CHECK: blez $1, -131071 +# CHECK: error: branch target out of range +# CHECK: blez $1, -131073 +# CHECK: error: branch to misaligned address +# CHECK: blez $1, 131069 +# CHECK: error: branch to misaligned address +# CHECK: blez $1, 131070 +# CHECK: error: branch to misaligned address +# CHECK: blez $1, 131071 +# CHECK: error: branch target out of range +# CHECK: blez $1, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bltz $1, -131069 +# CHECK: error: branch to misaligned address +# CHECK: bltz $1, -131070 +# CHECK: error: branch to misaligned address +# CHECK: bltz $1, -131071 +# CHECK: error: branch target out of range +# CHECK: bltz $1, -131073 +# CHECK: error: branch to misaligned address +# CHECK: bltz $1, 131069 +# CHECK: error: branch to misaligned address +# CHECK: bltz $1, 131070 +# CHECK: error: branch to misaligned address +# CHECK: bltz $1, 131071 +# CHECK: error: branch target out of range +# CHECK: bltz $1, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bgezal $1, -131069 +# CHECK: error: branch to misaligned address +# CHECK: bgezal $1, -131070 +# CHECK: error: branch to misaligned address +# CHECK: bgezal $1, -131071 +# CHECK: error: branch target out of range +# CHECK: bgezal $1, -131073 +# CHECK: error: branch to misaligned address +# CHECK: bgezal $1, 131069 +# CHECK: error: branch to misaligned address +# CHECK: bgezal $1, 131070 +# CHECK: error: branch to misaligned address +# CHECK: bgezal $1, 131071 +# CHECK: error: branch target out of range +# CHECK: bgezal $1, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bltzal $1, -131069 +# CHECK: error: branch to misaligned address +# CHECK: bltzal $1, -131070 +# CHECK: error: branch to misaligned address +# CHECK: bltzal $1, -131071 +# CHECK: error: branch target out of range +# CHECK: bltzal $1, -131073 +# CHECK: error: branch to misaligned address +# CHECK: bltzal $1, 131069 +# CHECK: error: branch to misaligned address +# CHECK: bltzal $1, 131070 +# CHECK: error: branch to misaligned address +# CHECK: bltzal $1, 131071 +# CHECK: error: branch target out of range +# CHECK: bltzal $1, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bc1f -131069 +# CHECK: error: branch to misaligned address +# CHECK: bc1f -131070 +# CHECK: error: branch to misaligned address +# CHECK: bc1f -131071 +# CHECK: error: branch target out of range +# CHECK: bc1f -131073 +# CHECK: error: branch to misaligned address +# CHECK: bc1f 131069 +# CHECK: error: branch to misaligned address +# CHECK: bc1f 131070 +# CHECK: error: branch to misaligned address +# CHECK: bc1f 131071 +# CHECK: error: branch target out of range +# CHECK: bc1f 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bc1f $fcc0, -131069 +# CHECK: error: branch to misaligned address +# CHECK: bc1f $fcc0, -131070 +# CHECK: error: branch to misaligned address +# CHECK: bc1f $fcc0, -131071 +# CHECK: error: branch target out of range +# CHECK: bc1f $fcc0, -131073 +# CHECK: error: branch to misaligned address +# CHECK: bc1f $fcc0, 131069 +# CHECK: error: branch to misaligned address +# CHECK: bc1f $fcc0, 131070 +# CHECK: error: branch to misaligned address +# CHECK: bc1f $fcc0, 131071 +# CHECK: error: branch target out of range +# CHECK: bc1f $fcc0, 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bc1t -131069 +# CHECK: error: branch to misaligned address +# CHECK: bc1t -131070 +# CHECK: error: branch to misaligned address +# CHECK: bc1t -131071 +# CHECK: error: branch target out of range +# CHECK: bc1t -131073 +# CHECK: error: branch to misaligned address +# CHECK: bc1t 131069 +# CHECK: error: branch to misaligned address +# CHECK: bc1t 131070 +# CHECK: error: branch to misaligned address +# CHECK: bc1t 131071 +# CHECK: error: branch target out of range +# CHECK: bc1t 131072 + +# CHECK: error: branch to misaligned address +# CHECK: bc1t $fcc0, -131069 +# CHECK: error: branch to misaligned address +# CHECK: bc1t $fcc0, -131070 +# CHECK: error: branch to misaligned address +# CHECK: bc1t $fcc0, -131071 +# CHECK: error: branch target out of range +# CHECK: bc1t $fcc0, -131073 +# CHECK: error: branch to misaligned address +# CHECK: bc1t $fcc0, 131069 +# CHECK: error: branch to misaligned address +# CHECK: bc1t $fcc0, 131070 +# CHECK: error: branch to misaligned address +# CHECK: bc1t $fcc0, 131071 +# CHECK: error: branch target out of range +# CHECK: bc1t $fcc0, 131072 + +.text +.set noat + b -131068 + b -131069 + b -131070 + b -131071 + b -131072 + b -131073 + b 131068 + b 131069 + b 131070 + b 131071 + b 131072 + + beq $1, $1, -131068 + beq $1, $1, -131069 + beq $1, $1, -131070 + beq $1, $1, -131071 + beq $1, $1, -131072 + beq $1, $1, -131073 + beq $1, $1, 131068 + beq $1, $1, 131069 + beq $1, $1, 131070 + beq $1, $1, 131071 + beq $1, $1, 131072 + + bne $1, $1, -131068 + bne $1, $1, -131069 + bne $1, $1, -131070 + bne $1, $1, -131071 + bne $1, $1, -131072 + bne $1, $1, -131073 + bne $1, $1, 131068 + bne $1, $1, 131069 + bne $1, $1, 131070 + bne $1, $1, 131071 + bne $1, $1, 131072 + + bal -131068 + bal -131069 + bal -131070 + bal -131071 + bal -131072 + bal -131073 + bal 131068 + bal 131069 + bal 131070 + bal 131071 + bal 131072 + + bgez $1, -131068 + bgez $1, -131069 + bgez $1, -131070 + bgez $1, -131071 + bgez $1, -131072 + bgez $1, -131073 + bgez $1, 131068 + bgez $1, 131069 + bgez $1, 131070 + bgez $1, 131071 + bgez $1, 131072 + + bgtz $1, -131068 + bgtz $1, -131069 + bgtz $1, -131070 + bgtz $1, -131071 + bgtz $1, -131072 + bgtz $1, -131073 + bgtz $1, 131068 + bgtz $1, 131069 + bgtz $1, 131070 + bgtz $1, 131071 + bgtz $1, 131072 + + blez $1, -131068 + blez $1, -131069 + blez $1, -131070 + blez $1, -131071 + blez $1, -131072 + blez $1, -131073 + blez $1, 131068 + blez $1, 131069 + blez $1, 131070 + blez $1, 131071 + blez $1, 131072 + + bltz $1, -131068 + bltz $1, -131069 + bltz $1, -131070 + bltz $1, -131071 + bltz $1, -131072 + bltz $1, -131073 + bltz $1, 131068 + bltz $1, 131069 + bltz $1, 131070 + bltz $1, 131071 + bltz $1, 131072 + + bgezal $1, -131068 + bgezal $1, -131069 + bgezal $1, -131070 + bgezal $1, -131071 + bgezal $1, -131072 + bgezal $1, -131073 + bgezal $1, 131068 + bgezal $1, 131069 + bgezal $1, 131070 + bgezal $1, 131071 + bgezal $1, 131072 + + bltzal $1, -131068 + bltzal $1, -131069 + bltzal $1, -131070 + bltzal $1, -131071 + bltzal $1, -131072 + bltzal $1, -131073 + bltzal $1, 131068 + bltzal $1, 131069 + bltzal $1, 131070 + bltzal $1, 131071 + bltzal $1, 131072 + + bc1f -131068 + bc1f -131069 + bc1f -131070 + bc1f -131071 + bc1f -131072 + bc1f -131073 + bc1f 131068 + bc1f 131069 + bc1f 131070 + bc1f 131071 + bc1f 131072 + + bc1f $fcc0, -131068 + bc1f $fcc0, -131069 + bc1f $fcc0, -131070 + bc1f $fcc0, -131071 + bc1f $fcc0, -131072 + bc1f $fcc0, -131073 + bc1f $fcc0, 131068 + bc1f $fcc0, 131069 + bc1f $fcc0, 131070 + bc1f $fcc0, 131071 + bc1f $fcc0, 131072 + + bc1t -131068 + bc1t -131069 + bc1t -131070 + bc1t -131071 + bc1t -131072 + bc1t -131073 + bc1t 131068 + bc1t 131069 + bc1t 131070 + bc1t 131071 + bc1t 131072 + + bc1t $fcc0, -131068 + bc1t $fcc0, -131069 + bc1t $fcc0, -131070 + bc1t $fcc0, -131071 + bc1t $fcc0, -131072 + bc1t $fcc0, -131073 + bc1t $fcc0, 131068 + bc1t $fcc0, 131069 + bc1t $fcc0, 131070 + bc1t $fcc0, 131071 + bc1t $fcc0, 131072 diff --git a/test/MC/Mips/mips-diagnostic-fixup.s b/test/MC/Mips/mips-diagnostic-fixup.s new file mode 100644 index 0000000000..864d739727 --- /dev/null +++ b/test/MC/Mips/mips-diagnostic-fixup.s @@ -0,0 +1,10 @@ +# RUN: not llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 -arch=mips 2>&1 -filetype=obj | FileCheck %s +# +# CHECK: LLVM ERROR: out of range PC16 fixup + +.text + b foo + .space 131072 - 8, 1 # -8 = size of b instr plus size of automatically inserted nop + nop # This instr makes the branch too long to fit into a 18-bit offset +foo: + add $0,$0,$0 |