This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
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.]
Attachment:
binutils-umips-insn32.diff.bz2
Description: Binary data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |