MIPS/opcodes: Correct mixed MIPS16 and microMIPS disassembly

Mixing MIPS16 and microMIPS code in a single binary isn't usually
supported but GAS happily produces such code if requested.  However it
is not correctly disassembled even if a symbol table is available and
function symbols are correctly anotated with the ISA mode.  This is
because the ELF-header global microMIPS ASE flag takes precedence over
MIPS16 function annotation, causing them to be treated as regular MIPS
code.

Correct the problem by respecting function symbol anotation regardless
of the ELF-header flag.

	binutils/
	* testsuite/binutils-all/mips/mixed-mips16-micromips.d: New test.
	* testsuite/binutils-all/mips/mixed-mips16-micromips.s: New test
	source.
	* testsuite/binutils-all/mips/mips.exp: Run the new test.

	opcodes/
	* mips-dis.c (is_compressed_mode_p): Add `micromips_p' operand,
	replacing references to `micromips_ase' throughout.
	(_print_insn_mips): Don't use file-level microMIPS annotation to
	determine the disassembly mode with the symbol table.
This commit is contained in:
Maciej W. Rozycki
2016-05-18 11:22:30 +01:00
parent 5049806017
commit 1401d2fe67
6 changed files with 98 additions and 17 deletions

View File

@@ -22,5 +22,6 @@ if ![istarget mips*-*-*] {
if [is_elf_format] {
run_dump_test "mixed-mips16"
run_dump_test "mixed-micromips"
run_dump_test "mixed-mips16-micromips"
run_dump_test "mips16-undecoded"
}

View File

@@ -0,0 +1,30 @@
#PROG: objcopy
#objdump: -drt
#name: Mixed MIPS16 and microMIPS disassembly
# Test mixed-mode compressed disassembly.
.*: +file format .*mips.*
SYMBOL TABLE:
#...
[0-9a-f]+ g +F +\.text 0+00000c 0xf0 foo
#...
[0-9a-f]+ g +F +\.text 0+00000c 0x80 bar
Disassembly of section \.text:
[0-9a-f]+ <foo>:
+[0-9a-f]+: b202 lw v0,8 <\.foo\.data>
+[0-9a-f]+: 9a60 lw v1,0\(v0\)
+[0-9a-f]+: eb00 jr v1
+[0-9a-f]+: 653b move t9,v1
[0-9a-f]+ <\.foo\.data>:
+[0-9a-f]+: 4040 4040 0000 0000 @@@@\.\.\.\.
[0-9a-f]+ <bar>:
+[0-9a-f]+: 41a3 0000 lui v1,0x0
+[0-9a-f]+: ff23 0000 lw t9,0\(v1\)
+[0-9a-f]+: 45b9 jrc t9
+[0-9a-f]+: 0c00 nop
\.\.\.

View File

@@ -0,0 +1,32 @@
.align 4, 0
.set mips16
.globl foo
.ent foo
foo:
lw $v0, .foo.data
lw $v1, 0($v0)
move $t9, $v1
jr $v1
.type .foo.data, @object
.foo.data:
.word 0x40404040
.size .foo.data, . - .foo.data
.end foo
.set nomips16
.align 4, 0
.set micromips
.globl bar
.ent bar
bar:
lui $v1, 0
lw $t9, 0($v1)
jrc $t9
nop
.end bar
.set nomicromips
# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 4, 0
.space 16