[PATCH] microMIPS insn32 mode support
Maciej W. Rozycki
macro@codesourcery.com
Tue Jun 11 21:58:00 GMT 2013
Hi,
This change adds microMIPS insn32 mode support to GAS and LD. This is
required for some odd purposes I am told. This mode prevents any 16-bit
microMIPS instructions from being produced, affecting assembly and
linker-generated code such as PLT entries, SVR4 lazy binding stubs, code
produced in linker relaxation.
To make people's life easier with existing microMIPS code three 16-bit
microMIPS instructions that have no direct 32-bit counterparts have been
converted to macros in the insn32 mode and produce the obvious equivalent
multiple-instruction sequences. These are JRADDIUSP, JRC and MOVEP.
Forced-length or short-delay-slot instructions such as NOP16 or JALS are
not permitted, nor are specific 16-bit microMIPS instruction mnemonics
such as ADDIUS5. The assumption here being any code using these
instructions is likely to require special attention.
New command-line options are added to GAS and LD to control the new mode,
these are -minsn32/-mno-insn32 and --insn32/--no-insn32 respectively. A
new .set insn32/noinsn32 GAS control knob is also added. The settings of
the two tools are completely independent of each other; --insn32 in
particular can be used with LD in the unlikely event the distance between
PLT and GOTPLT overflows the range of the ADDIUPC instruction, to force
the longer address calculation sequence.
Preexisting microMIPS GAS test cases have been modified to provide full
insn32 mode coverage of the instruction set. I have a separate change to
add LD test cases that cover the --insn32 option while at the same time
verifying correct PLT generation. As these extend the microMIPS PLT tests
I posted previously that raised concerns I am going to modify the whole
set accordingly and post both parts separately.
No regressions across the usual MIPS targets. Comments, questions, OK to
apply (once the microMIPS PLT has been committed)?
2013-06-11 Maciej W. Rozycki <macro@codesourcery.com>
Paul Brook <paul@codesourcery.com>
bfd/
* elfxx-mips.h (_bfd_mips_elf_insn32): New prototype.
* elfxx-mips.c (mips_elf_link_hash_table): Add insn32 member.
(STUB_MOVE32_MICROMIPS, STUB_JALR32_MICROMIPS): New macros.
(MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE): Likewise.
(MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE): Likewise.
(micromips_insn32_o32_exec_plt0_entry): New variable.
(micromips_insn32_o32_exec_plt_entry): Likewise.
(_bfd_mips_elf_adjust_dynamic_symbol): Handle insn32 mode.
(mips_elf_estimate_stub_size): Likewise.
(_bfd_mips_elf_size_dynamic_sections): Likewise.
(_bfd_mips_elf_finish_dynamic_symbol): Likewise.
(mips_finish_exec_plt): Likewise.
(_bfd_mips_elf_relax_section): Likewise.
(_bfd_mips_elf_insn32): New function.
(_bfd_mips_elf_get_synthetic_symtab): Handle insn32 PLT.
2013-06-11 Maciej W. Rozycki <macro@codesourcery.com>
gas/
* config/tc-mips.c (mips_set_options): Add insn32 member.
(mips_opts): Initialize it.
(NOP_INSN, NOP_INSN_SIZE): Handle insn32 mode.
(is_size_valid): Likewise.
(md_assemble): Pass instruction string down to macro.
(brk_fmt): Add second dimension and insn32 mode initializers.
(mfhl_fmt): Likewise.
(BRK_FMT, MFHL_FMT): Handle insn32 mode.
(macro_build) <'c'>: Handle microMIPS 32-bit BREAK encoding.
(macro_build_jalr, move_register): Handle insn32 mode.
(macro_build_branch_rs): Likewise.
(macro): Handle insn32 mode.
<M_JRADDIUSP>, <M_JRC>, <M_MOVEP>: New cases.
(mips_ip): Handle insn32 mode.
(options): Add OPTION_INSN32 and OPTION_NO_INSN32 enum values.
(md_longopts): Add "minsn32" and "mno-insn32" options.
(md_parse_option): Handle OPTION_INSN32 and OPTION_NO_INSN32.
(s_mipsset): Handle "insn32" and "noinsn32" pseudo-ops.
(mips_handle_align): Handle insn32 mode.
(md_show_usage): Add -minsn32 and -mno-insn32.
* doc/as.texinfo (Target MIPS options): Add -minsn32 and
-mno-insn32 options.
(-minsn32, -mno-insn32): New options.
* doc/c-mips.texi (MIPS Opts): Add -minsn32 and -mno-insn32
options.
(MIPS assembly options): New node. Document .set insn32 and
.set noinsn32.
(MIPS-Dependent): List the new node.
2013-06-11 Maciej W. Rozycki <macro@codesourcery.com>
gas/testsuite/
* gas/mips/micromips-insn32.d: New test.
* gas/mips/micromips-noinsn32.d: Likewise.
* gas/mips/micromips.l: Rename to...
* gas/mips/micromips-warn.l: ... this.
* gas/mips/micromips.d: Update accordingly.
* gas/mips/micromips-trap.d: Likewise.
* gas/mips/micromips.l: New list test.
* gas/mips/micromips.s: Add conditionals.
* gas/mips/mips.exp: Run the new tests.
2013-06-11 Maciej W. Rozycki <macro@codesourcery.com>
include/opcode/
* mips.h: Add M_JRADDIUSP, M_JRC and M_MOVEP anonymous enum
values.
2013-06-11 Maciej W. Rozycki <macro@codesourcery.com>
ld/
* emultempl/mipself.em (insn32): New variable.
(mips_create_output_section_statements): Handle insn32 mode.
(PARSE_AND_LIST_PROLOGUE): New macro.
(PARSE_AND_LIST_LONGOPTS): Likewise.
(PARSE_AND_LIST_OPTIONS): Likewise.
* gen-doc.texi: Set MIPS.
* ld.texinfo: Likewise.
(Options specific to MIPS targets): New section.
(ld and MIPS family): New node.
(Top, Machine Dependent): List the new node.
2013-06-11 Maciej W. Rozycki <macro@codesourcery.com>
opcodes/
* micromips-opc.c (micromips_opcodes): Add "jraddiusp", "jrc" and
"movep" macros.
Maciej
binutils-umips-insn32.diff
[Patch attached compressed due to its size.]
-------------- next part --------------
A non-text attachment was scrubbed...
Name: binutils-umips-insn32.diff.bz2
Type: application/octet-stream
Size: 40851 bytes
Desc:
URL: <https://sourceware.org/pipermail/binutils/attachments/20130611/1e983c3d/attachment.obj>
More information about the Binutils
mailing list