mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 17:18:55 +00:00
[MIPS] Implement O32 FPXX, FP64 and FP64A ABI extensions
Specification: https://dmz-portal.mips.com/wiki/MIPS_O32_ABI_-_FR0_and_FR1_Interlinking include/ * elf/mips.h (PT_MIPS_ABIFLAGS, SHT_MIPS_ABIFLAGS): Define. (Val_GNU_MIPS_ABI_FP_OLD_64): Rename from Val_GNU_MIPS_ABI_FP_64. (Val_GNU_MIPS_ABI_FP_64): Redefine. (Val_GNU_MIPS_ABI_FP_XX): Define. (Elf_External_ABIFlags_v0, Elf_Internal_ABIFlags_v0): New structures. (AFL_REG_NONE, AFL_REG_32, AFL_REG_64, AFL_REG_128): Define. (AFL_ASE_DSP, AFL_ASE_DSPR2, AFL_ASE_EVA, AFL_ASE_MCU): Likewise. (AFL_ASE_MDMX, AFL_ASE_MIPS3D, AFL_ASE_MT, AFL_ASE_SMARTMIPS): Likewise. (AFL_ASE_VIRT, AFL_ASE_MSA, AFL_ASE_MIPS16): Likewise. (AFL_ASE_MICROMIPS, AFL_ASE_XPA): Likewise. (AFL_EXT_XLR, AFL_EXT_OCTEON2, AFL_EXT_OCTEONP): Likewise. (AFL_EXT_LOONGSON_3A, AFL_EXT_OCTEON, AFL_EXT_5900): Likewise. (AFL_EXT_4650, AFL_EXT_4010, AFL_EXT_4100, AFL_EXT_3900): Likewise. (AFL_EXT_10000, AFL_EXT_SB1, AFL_EXT_4111, AFL_EXT_4120): Likewise. (AFL_EXT_5400, AFL_EXT_5500, AFL_EXT_LOONGSON_2E): Likewise. (AFL_EXT_LOONGSON_2F): Likewise. (bfd_mips_elf_swap_abiflags_v0_in): Prototype. (bfd_mips_elf_swap_abiflags_v0_out): Likewise. (bfd_mips_isa_ext): Likewise. bfd/ * elfxx-mips.c (ABI_O32_P, MIPS_ELF_ABIFLAGS_SECTION_NAME_P): New macro. (mips_elf_obj_tdata): Add abiflags and abiflags_valid fields. (bfd_mips_elf_swap_abiflags_v0_in): New function. (bfd_mips_elf_swap_abiflags_v0_out): Likewise. (_bfd_mips_elf_section_from_shdr): Handle SHT_MIPS_ABIFLAGS. (_bfd_mips_elf_fake_sections): Likewise. (_bfd_mips_elf_always_size_sections): Handle .MIPS.abiflags. (_bfd_mips_elf_additional_program_headers): Account for new PT_MIPS_ABIFLAGS program header. (_bfd_mips_elf_modify_segment_map): Create PT_MIPS_ABIFLAGS segment and associate with .MIPS.abiflags. (_bfd_mips_elf_gc_mark_extra_sections): New function. (bfd_mips_isa_ext, update_mips_abiflags_isa): New static function. (infer_mips_abiflags): Likewise. (_bfd_mips_elf_final_link): Handle .MIPS.abiflags. (mips_32bit_flags_p): Moved higher. (mips_elf_merge_obj_attributes, _bfd_mips_fp_abi_string): Error checking for FP ABIs. (_bfd_mips_elf_merge_private_bfd_data): Restructure and add abiflags checks. Check EF_MIPS_FP64 flag consistency. (print_mips_ases, print_mips_isa_ext): New static function. (print_mips_fp_abi_value, get_mips_reg_size): Likewise. (_bfd_mips_elf_print_private_bfd_data): Display abiflags data. (_bfd_mips_post_process_headers): Set EI_ABIVERSION = 3 for Val_GNU_MIPS_ABI_FP_64 or Val_GNU_MIPS_ABI_FP_64A. * elfxx-mips.h (_bfd_mips_elf_gc_mark_extra_sections): New prototype. * elf32-mips.c (elf_backend_gc_mark_extra_sections): Implement. * elfn32-mips.c (elf_backend_gc_mark_extra_sections): Implement. * elf64-mips.c (elf_backend_gc_mark_extra_sections): Implement. binutils/ * readelf.c (get_mips_segment_type): Display name for PT_MIPS_ABIFLAGS. (get_mips_section_type_name): Display name for SHT_MIPS_ABIFLAGS. (display_mips_gnu_attribute): Abstracted fp abi printing to... (print_mips_fp_abi_value): New static function. Handle new FP ABIs. (print_mips_ases, print_mips_isa_ext): New static functions. (get_mips_reg_size): Likewise. (process_mips_specific): Display abiflags data. elfcpp/ * elfcpp.h (PT_MIPS_ABIFLAGS): New program header type. gas/ * config/tc-mips.c (mips_flags_frag): New static global. (struct mips_set_options): Add oddspreg field. (file_mips_opts, mips_opts): Initialize oddspreg. (ISA_HAS_ODD_SINGLE_FPR): Add CPU argument and update for R5900 and Loongson-3a. (enum options, md_longopts, md_parse_option): Add -mfpxx, -modd-spreg and -mno-odd-spreg options. (md_begin): Create .MIPS.abiflags section. (fpabi_incompatible_with, fpabi_requires): New static function. (check_fpabi): Likewise. (mips_check_options): Handle fp=xx and oddspreg restrictions. (file_mips_check_options): Set oddspreg by default for fp=xx. (mips_oddfpreg_ok): Re-write function. (check_regno): Check odd numbered registers regardless of FPR size. For fp != 32 use as_bad instead of as_warn. (match_float_constant): Rewrite check regarding FP register width. Add support for generating constants when MXHC1 is present. Handle fp=xx to comply with the ABI. (macro): Update M_LI_DD similarly to match_float_constant. Generate MTHC1 when available. Check that correct code can be generated for fp=xx and fp=64 ABIs. (parse_code_option, s_mipsset): Add fp=xx, oddspreg and nooddspreg options. (mips_convert_ase_flags): New static function. (mips_elf_final_processing): Use fpabi == Val_GNU_MIPS_ABI_FP_OLD_64 to determine when to add the EF_MIPS_FP64 flag. Populate the .MIPS.abiflags section. (md_mips_end): Update .gnu_attribute based on command line and .module as applicable. Use check_fpabi to ensure .gnu.attribute and command line/.module options are consistent. * doc/as.texinfo: Add missing -mgp64/-mfp64 options and document new -mfpxx, -modd-spreg and -mno-odd-spreg options. * doc/c-mips.texi: Document -mfpxx, -modd-spreg, -mno-odd-spreg, gnu_attribute values and FP ABIs. ld/ * emulparams/elf32bmip.sh: Add .MIPS.abiflags. * emulparams/elf32bmipn32-defs.sh: Likewise. * emulparams/elf64bmip-defs.sh: Likewise. opcodes/ * micromips-opc.c (COD, LCD) New macros. (cfc1, ctc1): Remove FP_S attribute. (dmfc1, mfc1, mfhc1): Add LCD attribute. (dmtc1, mtc1, mthc1): Add COD attribute. * mips-opc.c (cfc1, cftc1, ctc, cttc1): Remove FP_S attribute. binutils/testsuite/ * binutils-all/readelf.s: Account for .MIPS.abiflags and .gnu.attributes. * binutils-all/readelf.ss-tmips: Likewise. * binutils-all/strip-3.d: Likewise. gas/testsuite/ * gas/mips/attr-gnu-4-0.d: New. * gas/mips/attr-gnu-4-0.s: Likewise. * gas/mips/attr-gnu-4-1-mfp32.l: Likewise. * gas/mips/attr-gnu-4-1-mfp32.s: Likewise. * gas/mips/attr-gnu-4-1-mfp64.l: Likewise. * gas/mips/attr-gnu-4-1-mfp64.s: Likewise. * gas/mips/attr-gnu-4-1-mfpxx.s: Likewise. * gas/mips/attr-gnu-4-1-msingle-float.l: Likewise. * gas/mips/attr-gnu-4-1-msingle-float.s: Likewise. * gas/mips/attr-gnu-4-1-msoft-float.l: Likewise. * gas/mips/attr-gnu-4-1-msoft-float.s: Likewise. * gas/mips/attr-gnu-4-1.d: Likewise. * gas/mips/attr-gnu-4-1.s: Likewise. * gas/mips/attr-gnu-4-2-mdouble-float.l: Likewise. * gas/mips/attr-gnu-4-2-mdouble-float.s: Likewise. * gas/mips/attr-gnu-4-2-msoft-float.l: Likewise. * gas/mips/attr-gnu-4-2-msoft-float.s: Likewise. * gas/mips/attr-gnu-4-2.d: Likewise. * gas/mips/attr-gnu-4-2.s: Likewise. * gas/mips/attr-gnu-4-3-mhard-float.l: Likewise. * gas/mips/attr-gnu-4-3-mhard-float.s: Likewise. * gas/mips/attr-gnu-4-3.d: Likewise. * gas/mips/attr-gnu-4-3.s: Likewise. * gas/mips/attr-gnu-4-4.l: Likewise. * gas/mips/attr-gnu-4-4.s: Likewise. * gas/mips/attr-gnu-4-5-64.l: Likewise. * gas/mips/attr-gnu-4-5-64.s: Likewise. * gas/mips/attr-gnu-4-5.d: Likewise. * gas/mips/attr-gnu-4-5.l: Likewise. * gas/mips/attr-gnu-4-5.s: Likewise. * gas/mips/attr-gnu-4-6-64.l: Likewise. * gas/mips/attr-gnu-4-6-64.s: Likewise. * gas/mips/attr-gnu-4-6.d: Likewise. * gas/mips/attr-gnu-4-6.l: Likewise. * gas/mips/attr-gnu-4-6.s: Likewise. * gas/mips/attr-gnu-4-6-msingle-float.l: Likewise. * gas/mips/attr-gnu-4-6-msingle-float.s: Likewise. * gas/mips/attr-gnu-4-6-msoft-float.l: Likewise. * gas/mips/attr-gnu-4-6-msoft-float.s: Likewise. * gas/mips/attr-gnu-4-6-noodd.l: Likewise. * gas/mips/attr-gnu-4-6-noodd.s: Likewise. * gas/mips/attr-gnu-4-7-64.l: Likewise. * gas/mips/attr-gnu-4-7-64.s: Likewise. * gas/mips/attr-gnu-4-7-msingle-float.l: Likewise. * gas/mips/attr-gnu-4-7-msingle-float.s: Likewise. * gas/mips/attr-gnu-4-7-msoft-float.l: Likewise. * gas/mips/attr-gnu-4-7-msoft-float.s: Likewise. * gas/mips/attr-gnu-4-7-odd.l: Likewise. * gas/mips/attr-gnu-4-7-odd.s: Likewise. * gas/mips/attr-gnu-4-7.d: Likewise. * gas/mips/attr-gnu-4-7.l: Likewise. * gas/mips/attr-gnu-4-7.s: Likewise. * gas/mips/attr-none-double.d: Likewise. * gas/mips/attr-none-o32-fp64.d: Likewise. * gas/mips/attr-none-o32-fp64-nooddspreg.d * gas/mips/attr-none-o32-fpxx.d: Likewise. * gas/mips/attr-none-single-float.d: Likewise. * gas/mips/attr-none-soft-float.d: Likewise. * gas/mips/elf_arch_mips32r3.d: Likewise. * gas/mips/elf_arch_mips32r5.d: Likewise. * gas/mips/elf_arch_mips64r3.d: Likewise. * gas/mips/elf_arch_mips64r5.d: Likewise. * gas/mips/li-d.d: Likewise. * gas/mips/li-d.s: Likewise. * gas/mips/module-check-warn.l: Likewise. * gas/mips/module-check-warn.s: Likewise. * gas/mips/module-check.d: Likewise. * gas/mips/module-check.s: Likewise. * gas/mips/module-mfp32.d: Likewise. * gas/mips/module-mfp32.s: Likewise. * gas/mips/module-mfp64.d: Likewise. * gas/mips/module-mfp64.s: Likewise. * gas/mips/module-mfp64-noodd.d: Likewise. * gas/mips/module-mfp64-noodd.s: Likewise. * gas/mips/module-mfpxx.d: Likewise. * gas/mips/module-mfpxx.s: Likewise. * gas/mips/module-msingle-float.d: Likewise. * gas/mips/module-msingle-float.s: Likewise. * gas/mips/module-msoft-float.d: Likewise. * gas/mips/module-msoft-float.s: Likewise. * gas/mips/module-set-mfpxx.d: Likewise. * gas/mips/module-set-mfpxx.s: Likewise. * gas/mips/fpxx-oddfpreg.d: Likewise. * gas/mips/fpxx-oddfpreg.l: Likewise. * gas/mips/fpxx-oddfpreg.s: Likewise. * gas/mips/no-odd-spreg.d: Likewise. * gas/mips/odd-spreg.d: Likewise. * gas/elf/section2.e-mips: Adjust expected output. * gas/mips/attr-gnu-abi-fp-1.d: Likewise. * gas/mips/attr-gnu-abi-msa-1.d: Likewise. * gas/mips/call-nonpic-1.d: Likewise. * gas/mips/elf_arch_mips1.d: Likewise. * gas/mips/elf_arch_mips2.d: Likewise. * gas/mips/elf_arch_mips3.d: Likewise. * gas/mips/elf_arch_mips32.d: Likewise. * gas/mips/elf_arch_mips32r2.d: Likewise. * gas/mips/elf_arch_mips4.d: Likewise. * gas/mips/elf_arch_mips5.d: Likewise. * gas/mips/elf_arch_mips64.d: Likewise. * gas/mips/elf_arch_mips64r2.d: Likewise. * gas/mips/elf_ase_micromips-2.d: Likewise. * gas/mips/elf_ase_micromips.d: Likewise. * gas/mips/elf_ase_mips16-2.d: Likewise. * gas/mips/elf_ase_mips16.d: Likewise. * gas/mips/module-defer-warn1.d: Likewise. * gas/mips/module-override.d: Likewise. * gas/mips/n32-consec.d: Likewise. * gas/mips/nan-2008-1.d: Likewise. * gas/mips/nan-2008-2.d: Likewise. * gas/mips/nan-2008-3.d: Likewise. * gas/mips/nan-2008-4.d: Likewise. * gas/mips/nan-legacy-1.d: Likewise. * gas/mips/nan-legacy-2.d: Likewise. * gas/mips/nan-legacy-3.d: Likewise. * gas/mips/nan-legacy-4.d: Likewise. * gas/mips/nan-legacy-5.d: Likewise. * gas/mips/tmips16-e.d: Likewise. * gas/mips/tmips16-f.d: Likewise. * gas/mips/tmipsel16-e.d: Likewise. * gas/mips/tmipsel16-f.d: Likewise. * gas/testsuite/gas/mips/mips.exp: Add new tests. ld/testsuite/ * ld-mips-elf/abiflags-strip1-ph.d: New. * ld-mips-elf/abiflags-strip2-ph.d: Likewise. * ld-mips-elf/abiflags-strip3-ph.d: Likewise. * ld-mips-elf/abiflags-strip4-ph.d: Likewise. * ld-mips-elf/abiflags-strip5-ph.d: Likewise. * ld-mips-elf/abiflags-strip6-ph.d: Likewise. * ld-mips-elf/abiflags-strip7-ph.d: Likewise. * ld-mips-elf/abiflags-strip8-ph.d: Likewise. * ld-mips-elf/abiflags-strip9-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-0-n32-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-0-n64-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-0-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-06.d: Likewise. * ld-mips-elf/attr-gnu-4-07.d: Likewise. * ld-mips-elf/attr-gnu-4-08.d: Likewise. * ld-mips-elf/attr-gnu-4-1-n32-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-1-n64-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-1-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-16.d: Likewise. * ld-mips-elf/attr-gnu-4-17.d: Likewise. * ld-mips-elf/attr-gnu-4-18.d: Likewise. * ld-mips-elf/attr-gnu-4-2-n32-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-2-n64-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-2-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-26.d: Likewise. * ld-mips-elf/attr-gnu-4-27.d: Likewise. * ld-mips-elf/attr-gnu-4-28.d: Likewise. * ld-mips-elf/attr-gnu-4-3-n32-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-3-n64-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-3-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-36.d: Likewise. * ld-mips-elf/attr-gnu-4-37.d: Likewise. * ld-mips-elf/attr-gnu-4-38.d: Likewise. * ld-mips-elf/attr-gnu-4-4-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-46.d: Likewise. * ld-mips-elf/attr-gnu-4-47.d: Likewise. * ld-mips-elf/attr-gnu-4-48.d: Likewise. * ld-mips-elf/attr-gnu-4-5-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-50.d: Likewise. * ld-mips-elf/attr-gnu-4-52.d: Likewise. * ld-mips-elf/attr-gnu-4-53.d: Likewise. * ld-mips-elf/attr-gnu-4-54.d: Likewise. * ld-mips-elf/attr-gnu-4-55.d: Likewise. * ld-mips-elf/attr-gnu-4-56.d: Likewise. * ld-mips-elf/attr-gnu-4-57.d: Likewise. * ld-mips-elf/attr-gnu-4-58.d: Likewise. * ld-mips-elf/attr-gnu-4-6-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-6.s: Likewise. * ld-mips-elf/attr-gnu-4-60.d: Likewise. * ld-mips-elf/attr-gnu-4-61.d: Likewise. * ld-mips-elf/attr-gnu-4-62.d: Likewise. * ld-mips-elf/attr-gnu-4-63.d: Likewise. * ld-mips-elf/attr-gnu-4-64.d: Likewise. * ld-mips-elf/attr-gnu-4-65.d: Likewise. * ld-mips-elf/attr-gnu-4-66.d: Likewise. * ld-mips-elf/attr-gnu-4-67.d: Likewise. * ld-mips-elf/attr-gnu-4-68.d: Likewise. * ld-mips-elf/attr-gnu-4-7-ph.d: Likewise. * ld-mips-elf/attr-gnu-4-7.s: Likewise. * ld-mips-elf/attr-gnu-4-70.d: Likewise. * ld-mips-elf/attr-gnu-4-71.d: Likewise. * ld-mips-elf/attr-gnu-4-72.d: Likewise. * ld-mips-elf/attr-gnu-4-73.d: Likewise. * ld-mips-elf/attr-gnu-4-74.d: Likewise. * ld-mips-elf/attr-gnu-4-75.d: Likewise. * ld-mips-elf/attr-gnu-4-76.d: Likewise. * ld-mips-elf/attr-gnu-4-77.d: Likewise. * ld-mips-elf/attr-gnu-4-78.d: Likewise. * ld-mips-elf/attr-gnu-4-8.s: Likewise. * ld-mips-elf/attr-gnu-4-81.d: Likewise. * ld-mips-elf/empty.s: Likewise. * ld-mips-elf/attr-gnu-4-00.d: Adjust expected output. * ld-mips-elf/attr-gnu-4-01.d: Likewise. * ld-mips-elf/attr-gnu-4-02.d: Likewise. * ld-mips-elf/attr-gnu-4-03.d: Likewise. * ld-mips-elf/attr-gnu-4-04.d: Likewise. * ld-mips-elf/attr-gnu-4-05.d: Likewise. * ld-mips-elf/attr-gnu-4-10.d: Likewise. * ld-mips-elf/attr-gnu-4-11.d: Likewise. * ld-mips-elf/attr-gnu-4-14.d: Likewise. * ld-mips-elf/attr-gnu-4-15.d: Likewise. * ld-mips-elf/attr-gnu-4-2.s: Likewise. * ld-mips-elf/attr-gnu-4-20.d: Likewise. * ld-mips-elf/attr-gnu-4-22.d: Likewise. * ld-mips-elf/attr-gnu-4-24.d: Likewise. * ld-mips-elf/attr-gnu-4-25.d: Likewise. * ld-mips-elf/attr-gnu-4-3.s: Likewise. * ld-mips-elf/attr-gnu-4-30.d: Likewise. * ld-mips-elf/attr-gnu-4-33.d: Likewise. * ld-mips-elf/attr-gnu-4-34.d: Likewise. * ld-mips-elf/attr-gnu-4-35.d: Likewise. * ld-mips-elf/attr-gnu-4-40.d: Likewise. * ld-mips-elf/attr-gnu-4-41.d: Likewise. * ld-mips-elf/attr-gnu-4-42.d: Likewise. * ld-mips-elf/attr-gnu-4-43.d: Likewise. * ld-mips-elf/attr-gnu-4-44.d: Likewise. * ld-mips-elf/attr-gnu-4-45.d: Likewise. * ld-mips-elf/attr-gnu-4-5.s: Likewise. * ld-mips-elf/attr-gnu-4-51.d: Likewise. * ld-mips-elf/attr-gnu-8-00.d: Likewise. * ld-mips-elf/attr-gnu-8-01.d: Likewise. * ld-mips-elf/attr-gnu-8-02.d: Likewise. * ld-mips-elf/attr-gnu-8-10.d: Likewise. * ld-mips-elf/attr-gnu-8-11.d: Likewise. * ld-mips-elf/attr-gnu-8-20.d: Likewise. * ld-mips-elf/attr-gnu-8-22.d: Likewise. * ld-mips-elf/jalx-2.dd: Likewise. * ld-mips-elf/mips16-pic-1.gd: Likewise. * ld-mips-elf/mips16-pic-2.gd: Likewise. * ld-mips-elf/mips16-pic-3.gd: Likewise. * ld-mips-elf/mips16-pic-4a.gd: Likewise. * ld-mips-elf/multi-got-no-shared.d: Likewise. * ld-mips-elf/nan-2008.d: Likewise. * ld-mips-elf/nan-legacy.d: Rework test. * ld-mips-elf/pic-and-nonpic-3a.gd: Likewise. * ld-mips-elf/pic-and-nonpic-3b.gd: Likewise. * ld-mips-elf/pic-and-nonpic-5b.gd: Likewise. * ld-mips-elf/pic-and-nonpic-6.ld: Likewise. * ld-mips-elf/rel32-n32.d: Likewise. * ld-mips-elf/rel32-o32.d: Likewise. * ld-mips-elf/rel64.d: Likewise. * ld-mips-elf/tls-multi-got-1.r: Likewise. * ld-elf/group.ld: Discard .MIPS.abiflags and .gnu.attributes. * ld-elf/orphan-region.ld: Likewise. * ld-elf/orphan.ld: Likewise. * ld-mips-elf/compressed-plt-1.ld: Likewise. * ld-mips-elf/dyn-sec64.ld: Likewise. * ld-mips-elf/got-dump-1.ld: Likewise. * ld-mips-elf/got-dump-2.ld: Likewise. * ld-mips-elf/got-page-1.ld: Likewise. * ld-mips-elf/mips-dyn.ld: Likewise. * ld-mips-elf/mips-lib.ld: Likewise. * ld-mips-elf/pic-and-nonpic-3a.ld: Likewise. * ld-mips-elf/pic-and-nonpic-3b.ld: Likewise. * ld-mips-elf/pic-and-nonpic-4b.ld: Likewise. * ld-mips-elf/pic-and-nonpic-5b.ld: Likewise. * ld-mips-elf/region1.t: Likewise. * ld-mips-elf/stub-dynsym-1.ld: Likewise. * ld-mips-elf/tls-hidden3.ld: Likewise. * ld-mips-elf/vxworks1.ld: Likewise. * ld-scripts/overlay-size.t: Likewise. * ld-mips-elf/elf-rel-got-n32-embed.d: Remove .MIPS.abiflags from objects. * ld-mips-elf/elf-rel-got-n32.d: Likewise. * ld-mips-elf/elf-rel-got-n64-embed.d: Likewise. * ld-mips-elf/elf-rel-got-n64-linux.d: Likewise. * ld-mips-elf/elf-rel-got-n64.d: Likewise. * ld-mips-elf/elf-rel-xgot-n32.d: Likewise. * ld-mips-elf/elf-rel-xgot-n32-embed.d: Likewise. * ld-mips-elf/elf-rel-xgot-n64.d: Likewise. * ld-mips-elf/elf-rel-xgot-n64-linux.d: Likewise. * ld-mips-elf/elf-rel-xgot-n64-embed.d: Likewise. * ld-mips-elf/mips-elf.exp: Add new tests.
This commit is contained in:
@@ -3167,6 +3167,8 @@ get_mips_segment_type (unsigned long type)
|
||||
return "RTPROC";
|
||||
case PT_MIPS_OPTIONS:
|
||||
return "OPTIONS";
|
||||
case PT_MIPS_ABIFLAGS:
|
||||
return "ABIFLAGS";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -3366,6 +3368,7 @@ get_mips_section_type_name (unsigned int sh_type)
|
||||
case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
|
||||
case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
|
||||
case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
|
||||
case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -11990,6 +11993,41 @@ display_sparc_gnu_attribute (unsigned char * p,
|
||||
return display_tag_value (tag, p, end);
|
||||
}
|
||||
|
||||
static void
|
||||
print_mips_fp_abi_value (int val)
|
||||
{
|
||||
switch (val)
|
||||
{
|
||||
case Val_GNU_MIPS_ABI_FP_ANY:
|
||||
printf (_("Hard or soft float\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_DOUBLE:
|
||||
printf (_("Hard float (double precision)\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_SINGLE:
|
||||
printf (_("Hard float (single precision)\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_SOFT:
|
||||
printf (_("Soft float\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_OLD_64:
|
||||
printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_XX:
|
||||
printf (_("Hard float (32-bit CPU, Any FPU)\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_64:
|
||||
printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_64A:
|
||||
printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
|
||||
break;
|
||||
default:
|
||||
printf ("??? (%d)\n", val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned char *
|
||||
display_mips_gnu_attribute (unsigned char * p,
|
||||
int tag,
|
||||
@@ -12004,27 +12042,8 @@ display_mips_gnu_attribute (unsigned char * p,
|
||||
p += len;
|
||||
printf (" Tag_GNU_MIPS_ABI_FP: ");
|
||||
|
||||
switch (val)
|
||||
{
|
||||
case Val_GNU_MIPS_ABI_FP_ANY:
|
||||
printf (_("Hard or soft float\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_DOUBLE:
|
||||
printf (_("Hard float (double precision)\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_SINGLE:
|
||||
printf (_("Hard float (single precision)\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_SOFT:
|
||||
printf (_("Soft float\n"));
|
||||
break;
|
||||
case Val_GNU_MIPS_ABI_FP_64:
|
||||
printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
|
||||
break;
|
||||
default:
|
||||
printf ("??? (%d)\n", val);
|
||||
break;
|
||||
}
|
||||
print_mips_fp_abi_value (val);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -12627,10 +12646,121 @@ print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
|
||||
return addr + (is_32bit_elf ? 4 : 8);
|
||||
}
|
||||
|
||||
static void
|
||||
print_mips_ases (unsigned int mask)
|
||||
{
|
||||
if (mask & AFL_ASE_DSP)
|
||||
fputs ("\n\tDSP ASE", stdout);
|
||||
if (mask & AFL_ASE_DSPR2)
|
||||
fputs ("\n\tDSP R2 ASE", stdout);
|
||||
if (mask & AFL_ASE_EVA)
|
||||
fputs ("\n\tEnhanced VA Scheme", stdout);
|
||||
if (mask & AFL_ASE_MCU)
|
||||
fputs ("\n\tMCU (MicroController) ASE", stdout);
|
||||
if (mask & AFL_ASE_MDMX)
|
||||
fputs ("\n\tMDMX ASE", stdout);
|
||||
if (mask & AFL_ASE_MIPS3D)
|
||||
fputs ("\n\tMIPS-3D ASE", stdout);
|
||||
if (mask & AFL_ASE_MT)
|
||||
fputs ("\n\tMT ASE", stdout);
|
||||
if (mask & AFL_ASE_SMARTMIPS)
|
||||
fputs ("\n\tSmartMIPS ASE", stdout);
|
||||
if (mask & AFL_ASE_VIRT)
|
||||
fputs ("\n\tVZ ASE", stdout);
|
||||
if (mask & AFL_ASE_MSA)
|
||||
fputs ("\n\tMSA ASE", stdout);
|
||||
if (mask & AFL_ASE_MIPS16)
|
||||
fputs ("\n\tMIPS16 ASE", stdout);
|
||||
if (mask & AFL_ASE_MICROMIPS)
|
||||
fputs ("\n\tMICROMIPS ASE", stdout);
|
||||
if (mask & AFL_ASE_XPA)
|
||||
fputs ("\n\tXPA ASE", stdout);
|
||||
if (mask == 0)
|
||||
fprintf (stdout, "\n\t%s", _("None"));
|
||||
}
|
||||
|
||||
static void
|
||||
print_mips_isa_ext (unsigned int isa_ext)
|
||||
{
|
||||
switch (isa_ext)
|
||||
{
|
||||
case 0:
|
||||
fputs (_("None"), stdout);
|
||||
break;
|
||||
case AFL_EXT_XLR:
|
||||
fputs ("RMI XLR", stdout);
|
||||
break;
|
||||
case AFL_EXT_OCTEON2:
|
||||
fputs ("Cavium Networks Octeon2", stdout);
|
||||
break;
|
||||
case AFL_EXT_OCTEONP:
|
||||
fputs ("Cavium Networks OcteonP", stdout);
|
||||
break;
|
||||
case AFL_EXT_LOONGSON_3A:
|
||||
fputs ("Loongson 3A", stdout);
|
||||
break;
|
||||
case AFL_EXT_OCTEON:
|
||||
fputs ("Cavium Networks Octeon", stdout);
|
||||
break;
|
||||
case AFL_EXT_5900:
|
||||
fputs ("Toshiba R5900", stdout);
|
||||
break;
|
||||
case AFL_EXT_4650:
|
||||
fputs ("MIPS R4650", stdout);
|
||||
break;
|
||||
case AFL_EXT_4010:
|
||||
fputs ("LSI R4010", stdout);
|
||||
break;
|
||||
case AFL_EXT_4100:
|
||||
fputs ("NEC VR4100", stdout);
|
||||
break;
|
||||
case AFL_EXT_3900:
|
||||
fputs ("Toshiba R3900", stdout);
|
||||
break;
|
||||
case AFL_EXT_10000:
|
||||
fputs ("MIPS R10000", stdout);
|
||||
break;
|
||||
case AFL_EXT_SB1:
|
||||
fputs ("Broadcom SB-1", stdout);
|
||||
break;
|
||||
case AFL_EXT_4111:
|
||||
fputs ("NEC VR4111/VR4181", stdout);
|
||||
break;
|
||||
case AFL_EXT_4120:
|
||||
fputs ("NEC VR4120", stdout);
|
||||
break;
|
||||
case AFL_EXT_5400:
|
||||
fputs ("NEC VR5400", stdout);
|
||||
break;
|
||||
case AFL_EXT_5500:
|
||||
fputs ("NEC VR5500", stdout);
|
||||
break;
|
||||
case AFL_EXT_LOONGSON_2E:
|
||||
fputs ("ST Microelectronics Loongson 2E", stdout);
|
||||
break;
|
||||
case AFL_EXT_LOONGSON_2F:
|
||||
fputs ("ST Microelectronics Loongson 2F", stdout);
|
||||
break;
|
||||
default:
|
||||
fputs (_("Unknown"), stdout);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
get_mips_reg_size (int reg_size)
|
||||
{
|
||||
return (reg_size == AFL_REG_NONE) ? 0
|
||||
: (reg_size == AFL_REG_32) ? 32
|
||||
: (reg_size == AFL_REG_64) ? 64
|
||||
: (reg_size == AFL_REG_128) ? 128
|
||||
: -1;
|
||||
}
|
||||
|
||||
static int
|
||||
process_mips_specific (FILE * file)
|
||||
{
|
||||
Elf_Internal_Dyn * entry;
|
||||
Elf_Internal_Shdr *sect = NULL;
|
||||
size_t liblist_offset = 0;
|
||||
size_t liblistno = 0;
|
||||
size_t conflictsno = 0;
|
||||
@@ -12648,6 +12778,57 @@ process_mips_specific (FILE * file)
|
||||
process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
|
||||
display_mips_gnu_attribute);
|
||||
|
||||
sect = find_section (".MIPS.abiflags");
|
||||
|
||||
if (sect != NULL)
|
||||
{
|
||||
Elf_External_ABIFlags_v0 *abiflags_ext;
|
||||
Elf_Internal_ABIFlags_v0 abiflags_in;
|
||||
|
||||
if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
|
||||
fputs ("\nCorrupt ABI Flags section.\n", stdout);
|
||||
else
|
||||
{
|
||||
abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
|
||||
sect->sh_size, _("MIPS ABI Flags section"));
|
||||
if (abiflags_ext)
|
||||
{
|
||||
abiflags_in.version = BYTE_GET (abiflags_ext->version);
|
||||
abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
|
||||
abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
|
||||
abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
|
||||
abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
|
||||
abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
|
||||
abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
|
||||
abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
|
||||
abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
|
||||
abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
|
||||
abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
|
||||
|
||||
printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
|
||||
printf ("\nISA: MIPS%d", abiflags_in.isa_level);
|
||||
if (abiflags_in.isa_rev > 1)
|
||||
printf ("r%d", abiflags_in.isa_rev);
|
||||
printf ("\nGPR size: %d",
|
||||
get_mips_reg_size (abiflags_in.gpr_size));
|
||||
printf ("\nCPR1 size: %d",
|
||||
get_mips_reg_size (abiflags_in.cpr1_size));
|
||||
printf ("\nCPR2 size: %d",
|
||||
get_mips_reg_size (abiflags_in.cpr2_size));
|
||||
fputs ("\nFP ABI: ", stdout);
|
||||
print_mips_fp_abi_value (abiflags_in.fp_abi);
|
||||
fputs ("ISA Extension: ", stdout);
|
||||
print_mips_isa_ext (abiflags_in.isa_ext);
|
||||
fputs ("\nASEs:", stdout);
|
||||
print_mips_ases (abiflags_in.ases);
|
||||
printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
|
||||
printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
|
||||
fputc ('\n', stdout);
|
||||
free (abiflags_ext);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* We have a lot of special sections. Thanks SGI! */
|
||||
if (dynamic_section == NULL)
|
||||
/* No information available. */
|
||||
@@ -12787,11 +12968,11 @@ process_mips_specific (FILE * file)
|
||||
if (options_offset != 0)
|
||||
{
|
||||
Elf_External_Options * eopt;
|
||||
Elf_Internal_Shdr * sect = section_headers;
|
||||
Elf_Internal_Options * iopt;
|
||||
Elf_Internal_Options * option;
|
||||
size_t offset;
|
||||
int cnt;
|
||||
sect = section_headers;
|
||||
|
||||
/* Find the section header so that we get the size. */
|
||||
while (sect->sh_type != SHT_MIPS_OPTIONS)
|
||||
|
||||
Reference in New Issue
Block a user