From 58a84d9b9c6b0e08c4b2d259fdd1877e3deec532 Mon Sep 17 00:00:00 2001 From: Daniel Sanders Date: Mon, 11 Jan 2016 15:57:46 +0000 Subject: [PATCH] [mips] Never select JAL for calls to an absolute immediate address. Summary: It actually takes an offset into the current PC-region. This fixes the 'expr' command in lldb. Reviewers: vkalintiris, jaydeep, bhushan Subscribers: dsanders, llvm-commits Differential Revision: http://reviews.llvm.org/D16054 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257339 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MipsInstrInfo.td | 4 +--- test/CodeGen/Mips/llvm-ir/call.ll | 15 +++++++++++++++ test/MC/Disassembler/Mips/mips2/valid-mips2.txt | 1 + test/MC/Disassembler/Mips/mips3/valid-mips3.txt | 1 + test/MC/Disassembler/Mips/mips4/valid-mips4.txt | 1 + test/MC/Mips/mips1/valid.s | 1 + test/MC/Mips/mips2/valid.s | 1 + test/MC/Mips/mips3/valid.s | 1 + test/MC/Mips/mips32/valid.s | 1 + test/MC/Mips/mips32r2/valid.s | 1 + test/MC/Mips/mips32r3/valid.s | 1 + test/MC/Mips/mips32r5/valid.s | 1 + test/MC/Mips/mips32r6/valid.s | 1 + test/MC/Mips/mips4/valid.s | 1 + test/MC/Mips/mips5/valid.s | 1 + test/MC/Mips/mips64/valid.s | 1 + test/MC/Mips/mips64r2/valid.s | 1 + test/MC/Mips/mips64r3/valid.s | 1 + test/MC/Mips/mips64r5/valid.s | 1 + test/MC/Mips/mips64r6/valid.s | 1 + 20 files changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/Target/Mips/MipsInstrInfo.td b/lib/Target/Mips/MipsInstrInfo.td index d9fb8c89073..ffda491f0c8 100644 --- a/lib/Target/Mips/MipsInstrInfo.td +++ b/lib/Target/Mips/MipsInstrInfo.td @@ -1003,7 +1003,7 @@ class IndirectBranch : JumpFR { let isCall=1, hasDelaySlot=1, Defs = [RA] in { class JumpLink : InstSE<(outs), (ins opnd:$target), !strconcat(opstr, "\t$target"), - [(MipsJmpLink imm:$target)], II_JAL, FrmJ, opstr> { + [(MipsJmpLink tglobaladdr:$target)], II_JAL, FrmJ, opstr> { let DecoderMethod = "DecodeJumpTarget"; } @@ -2075,8 +2075,6 @@ def : MipsPat<(MipsSync (i32 immz)), (SYNC 0)>, ISA_MIPS2; // Call -def : MipsPat<(MipsJmpLink (i32 tglobaladdr:$dst)), - (JAL tglobaladdr:$dst)>; def : MipsPat<(MipsJmpLink (i32 texternalsym:$dst)), (JAL texternalsym:$dst)>; //def : MipsPat<(MipsJmpLink GPR32:$dst), diff --git a/test/CodeGen/Mips/llvm-ir/call.ll b/test/CodeGen/Mips/llvm-ir/call.ll index 22a44da0b06..a4b03405f72 100644 --- a/test/CodeGen/Mips/llvm-ir/call.ll +++ b/test/CodeGen/Mips/llvm-ir/call.ll @@ -182,3 +182,18 @@ define hidden void @thunk_undef_double(i32 %this, double %volume) unnamed_addr a tail call void @undef_double(i32 undef, double undef) #8 ret void } + +; Check that immediate addresses do not use jal. +define i32 @jal_only_allows_symbols() { +; ALL-LABEL: jal_only_allows_symbols: + +; ALL-NOT: {{jal }} +; ALL: addiu $[[TGT:[0-9]+]], $zero, 1234 +; ALL-NOT: {{jal }} +; ALL: jalr $[[TGT]] +; ALL-NOT: {{jal }} + + call void () inttoptr (i32 1234 to void ()*)() + ret i32 0 +} + diff --git a/test/MC/Disassembler/Mips/mips2/valid-mips2.txt b/test/MC/Disassembler/Mips/mips2/valid-mips2.txt index 570f8ddb47c..a0b766a5dc1 100644 --- a/test/MC/Disassembler/Mips/mips2/valid-mips2.txt +++ b/test/MC/Disassembler/Mips/mips2/valid-mips2.txt @@ -83,6 +83,7 @@ 0x08 0x00 0x00 0x01 # CHECK: j 4 0x09 0x33 0x00 0x2a # CHECK: j 80478376 0x0b 0x2a 0xd1 0x44 # CHECK: j 212550928 +0x0c 0x00 0x01 0x4c # CHECK: jal 1328 0x21 0x08 0xff 0xfe # CHECK: addi $8, $8, -2 0x21 0x2d 0x66 0xd2 # CHECK: addi $13, $9, 26322 0x21 0xad 0xe6 0x90 # CHECK: addi $13, $13, -6512 diff --git a/test/MC/Disassembler/Mips/mips3/valid-mips3.txt b/test/MC/Disassembler/Mips/mips3/valid-mips3.txt index db83b50aa01..fb244e2f154 100644 --- a/test/MC/Disassembler/Mips/mips3/valid-mips3.txt +++ b/test/MC/Disassembler/Mips/mips3/valid-mips3.txt @@ -114,6 +114,7 @@ 0x08 0x00 0x00 0x01 # CHECK: j 4 0x09 0x33 0x00 0x2a # CHECK: j 80478376 0x0b 0x2a 0xd1 0x44 # CHECK: j 212550928 +0x0c 0x00 0x01 0x4c # CHECK: jal 1328 0x21 0x08 0xff 0xfe # CHECK: addi $8, $8, -2 0x21 0x2d 0x66 0xd2 # CHECK: addi $13, $9, 26322 0x21 0xad 0xe6 0x90 # CHECK: addi $13, $13, -6512 diff --git a/test/MC/Disassembler/Mips/mips4/valid-mips4.txt b/test/MC/Disassembler/Mips/mips4/valid-mips4.txt index 5e8253dfef2..47ab90809ec 100644 --- a/test/MC/Disassembler/Mips/mips4/valid-mips4.txt +++ b/test/MC/Disassembler/Mips/mips4/valid-mips4.txt @@ -118,6 +118,7 @@ 0x08 0x00 0x00 0x01 # CHECK: j 4 0x09 0x33 0x00 0x2a # CHECK: j 80478376 0x0b 0x2a 0xd1 0x44 # CHECK: j 212550928 +0x0c 0x00 0x01 0x4c # CHECK: jal 1328 0x21 0x08 0xff 0xfe # CHECK: addi $8, $8, -2 0x21 0x2d 0x66 0xd2 # CHECK: addi $13, $9, 26322 0x21 0xad 0xe6 0x90 # CHECK: addi $13, $13, -6512 diff --git a/test/MC/Mips/mips1/valid.s b/test/MC/Mips/mips1/valid.s index 80f0f8b047c..5080e77cae1 100644 --- a/test/MC/Mips/mips1/valid.s +++ b/test/MC/Mips/mips1/valid.s @@ -46,6 +46,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] lb $24,-14515($10) lbu $8,30195($v1) lh $11,-8556($s5) diff --git a/test/MC/Mips/mips2/valid.s b/test/MC/Mips/mips2/valid.s index c57d386d9d0..026a3a28558 100644 --- a/test/MC/Mips/mips2/valid.s +++ b/test/MC/Mips/mips2/valid.s @@ -62,6 +62,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] lb $24,-14515($10) lbu $8,30195($v1) ldc1 $f11,16391($s0) diff --git a/test/MC/Mips/mips3/valid.s b/test/MC/Mips/mips3/valid.s index cf51753712e..2e62343c334 100644 --- a/test/MC/Mips/mips3/valid.s +++ b/test/MC/Mips/mips3/valid.s @@ -117,6 +117,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] lb $24,-14515($10) lbu $8,30195($v1) ld $sp,-28645($s1) diff --git a/test/MC/Mips/mips32/valid.s b/test/MC/Mips/mips32/valid.s index 2fdbdfe6522..5f0769d9283 100644 --- a/test/MC/Mips/mips32/valid.s +++ b/test/MC/Mips/mips32/valid.s @@ -71,6 +71,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] lb $24,-14515($10) lbu $8,30195($v1) ldc1 $f11,16391($s0) diff --git a/test/MC/Mips/mips32r2/valid.s b/test/MC/Mips/mips32r2/valid.s index 7ebc60d946a..d8e491ecd0b 100644 --- a/test/MC/Mips/mips32r2/valid.s +++ b/test/MC/Mips/mips32r2/valid.s @@ -77,6 +77,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] jr.hb $4 # CHECK: jr.hb $4 # encoding: [0x00,0x80,0x04,0x08] jalr.hb $4 # CHECK: jalr.hb $4 # encoding: [0x00,0x80,0xfc,0x09] jalr.hb $4, $5 # CHECK: jalr.hb $4, $5 # encoding: [0x00,0xa0,0x24,0x09] diff --git a/test/MC/Mips/mips32r3/valid.s b/test/MC/Mips/mips32r3/valid.s index 3431e1cbc8d..93859dbd1d5 100644 --- a/test/MC/Mips/mips32r3/valid.s +++ b/test/MC/Mips/mips32r3/valid.s @@ -77,6 +77,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] jr.hb $4 # CHECK: jr.hb $4 # encoding: [0x00,0x80,0x04,0x08] jalr.hb $4 # CHECK: jalr.hb $4 # encoding: [0x00,0x80,0xfc,0x09] jalr.hb $4, $5 # CHECK: jalr.hb $4, $5 # encoding: [0x00,0xa0,0x24,0x09] diff --git a/test/MC/Mips/mips32r5/valid.s b/test/MC/Mips/mips32r5/valid.s index 0c477f4fa2a..e0c1711fbe6 100644 --- a/test/MC/Mips/mips32r5/valid.s +++ b/test/MC/Mips/mips32r5/valid.s @@ -78,6 +78,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] jr.hb $4 # CHECK: jr.hb $4 # encoding: [0x00,0x80,0x04,0x08] jalr.hb $4 # CHECK: jalr.hb $4 # encoding: [0x00,0x80,0xfc,0x09] jalr.hb $4, $5 # CHECK: jalr.hb $4, $5 # encoding: [0x00,0xa0,0x24,0x09] diff --git a/test/MC/Mips/mips32r6/valid.s b/test/MC/Mips/mips32r6/valid.s index 226acd96a5a..e4786d0e4ec 100644 --- a/test/MC/Mips/mips32r6/valid.s +++ b/test/MC/Mips/mips32r6/valid.s @@ -159,6 +159,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] jr.hb $4 # CHECK: jr.hb $4 # encoding: [0x00,0x80,0x04,0x09] jalr.hb $4 # CHECK: jalr.hb $4 # encoding: [0x00,0x80,0xfc,0x09] jalr.hb $4, $5 # CHECK: jalr.hb $4, $5 # encoding: [0x00,0xa0,0x24,0x09] diff --git a/test/MC/Mips/mips4/valid.s b/test/MC/Mips/mips4/valid.s index 9bf98d1c29f..fcea8ead8a7 100644 --- a/test/MC/Mips/mips4/valid.s +++ b/test/MC/Mips/mips4/valid.s @@ -121,6 +121,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] lb $24,-14515($10) lbu $8,30195($v1) ld $sp,-28645($s1) diff --git a/test/MC/Mips/mips5/valid.s b/test/MC/Mips/mips5/valid.s index cb30de38c29..36f3ce14dc6 100644 --- a/test/MC/Mips/mips5/valid.s +++ b/test/MC/Mips/mips5/valid.s @@ -121,6 +121,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] lb $24,-14515($10) lbu $8,30195($v1) ld $sp,-28645($s1) diff --git a/test/MC/Mips/mips64/valid.s b/test/MC/Mips/mips64/valid.s index 24ed1ffc8d6..92afbb39546 100644 --- a/test/MC/Mips/mips64/valid.s +++ b/test/MC/Mips/mips64/valid.s @@ -128,6 +128,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] lb $24,-14515($10) lbu $8,30195($v1) ld $sp,-28645($s1) diff --git a/test/MC/Mips/mips64r2/valid.s b/test/MC/Mips/mips64r2/valid.s index e571d936591..9057fcef60b 100644 --- a/test/MC/Mips/mips64r2/valid.s +++ b/test/MC/Mips/mips64r2/valid.s @@ -141,6 +141,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] jr.hb $4 # CHECK: jr.hb $4 # encoding: [0x00,0x80,0x04,0x08] jalr.hb $4 # CHECK: jalr.hb $4 # encoding: [0x00,0x80,0xfc,0x09] jalr.hb $4, $5 # CHECK: jalr.hb $4, $5 # encoding: [0x00,0xa0,0x24,0x09] diff --git a/test/MC/Mips/mips64r3/valid.s b/test/MC/Mips/mips64r3/valid.s index 4bde82eb8ec..4e2717bdd15 100644 --- a/test/MC/Mips/mips64r3/valid.s +++ b/test/MC/Mips/mips64r3/valid.s @@ -141,6 +141,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] jr.hb $4 # CHECK: jr.hb $4 # encoding: [0x00,0x80,0x04,0x08] jalr.hb $4 # CHECK: jalr.hb $4 # encoding: [0x00,0x80,0xfc,0x09] jalr.hb $4, $5 # CHECK: jalr.hb $4, $5 # encoding: [0x00,0xa0,0x24,0x09] diff --git a/test/MC/Mips/mips64r5/valid.s b/test/MC/Mips/mips64r5/valid.s index 029dfa9438c..574dc60163d 100644 --- a/test/MC/Mips/mips64r5/valid.s +++ b/test/MC/Mips/mips64r5/valid.s @@ -142,6 +142,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] jr.hb $4 # CHECK: jr.hb $4 # encoding: [0x00,0x80,0x04,0x08] jalr.hb $4 # CHECK: jalr.hb $4 # encoding: [0x00,0x80,0xfc,0x09] jalr.hb $4, $5 # CHECK: jalr.hb $4, $5 # encoding: [0x00,0xa0,0x24,0x09] diff --git a/test/MC/Mips/mips64r6/valid.s b/test/MC/Mips/mips64r6/valid.s index 0b4b6b187af..cbe3e8232dc 100644 --- a/test/MC/Mips/mips64r6/valid.s +++ b/test/MC/Mips/mips64r6/valid.s @@ -138,6 +138,7 @@ a: j a # CHECK: j a # encoding: [0b000010AA,A,A,A] # CHECK: # fixup A - offset: 0, value: a, kind: fixup_Mips_26 j 1328 # CHECK: j 1328 # encoding: [0x08,0x00,0x01,0x4c] + jal 21100 # CHECK: jal 21100 # encoding: [0x0c,0x00,0x14,0x9b] jr.hb $4 # CHECK: jr.hb $4 # encoding: [0x00,0x80,0x04,0x09] jalr.hb $4 # CHECK: jalr.hb $4 # encoding: [0x00,0x80,0xfc,0x09] jalr.hb $4, $5 # CHECK: jalr.hb $4, $5 # encoding: [0x00,0xa0,0x24,0x09] -- 2.34.1