[PATCH v2 02/15] MIPS: Add new relocations for microMIPSR6
Jovan Dmitrovic
jovan.dmitrovic@htecgroup.com
Wed Oct 29 14:09:22 GMT 2025
More information about the Binutils mailing list
Wed Oct 29 14:09:22 GMT 2025
- Previous message (by thread): [PATCH v2 01/15] MIPS: Do not adjust microMIPS HI/LO relocs to be section relative
- Next message (by thread): [PATCH v2 03/15] MIPS: Improve WARN for $0 constraint on MIPSR6 branches
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
From: Matthew Fortune <matthew.fortune@imgtec.com> Enabling support for advanced instructions and optimizations in the microMIPS R6 architecture. New relocation types, such as PC21_S1 and PC26_S1, enhance memory management and branch efficiency for PC-relative operations. These additions ensure proper functionality of tools like linkers and assemblers with microMIPS R6 binaries. Signed-off-by: Matthew Fortune <matthew.fortune@mips.com> Signed-off-by: Faraz Shahbazker <fshahbazker@wavecomp.com> Signed-off-by: Milica Matic <milica.matic@htecgroup.com> Signed-off-by: Jovan Dmitrović <jovan.dmitrovic@htecgroup.com> bfd/ChangeLog: * bfd-in2.h (enum bfd_reloc_code_real): Add BFD_RELOC_MICROMIPS_21_PCREL_S1, BFD_RELOC_MICROMIPS_26_PCREL_S1, BFD_RELOC_MICROMIPS_18_PCREL_S3, BFD_RELOC_MICROMIPS_19_PCREL_S2, BFD_RELOC_MICROMIPS_HI16_S_PCREL, BFD_RELOC_MICROMIPS_LO16_PCREL. * libbfd.h (bfd_reloc_code_real_names): Add strings for the above. * reloc.c (DOCDD): Document the above. * elf32-mips.c (elf_micromips_howto_table_rel): Define HOWTO entries for the above. (micromips_reloc_map): Create mappings for the above. * elf64-mips.c (micromips_elf64_howto_table_rel): Define HOWTO entries for the above. (micromips_elf64_howto_table_rela): Likewise. (micromips_reloc_map): Create mappings for the above. * elfn32-mips.c (elf_micromips_howto_table_rel): Define HOWTO entries for the above. (elf_micromips_howto_table_rela): Likewise. (micromips_reloc_map): Create mappings for the above. elfcpp/ChangeLog: * mips.h (enum): Add R_MICROMIPS_PCHI16, R_MICROMIPS_PCLO16, R_MICROMIPS_PC21_S1, R_MICROMIPS_PC26_S1, R_MICROMIPS_PC18_S3, R_MICROMIPS_PC19_S2. include/ChangeLog: * elf/mips.h (elf_mips_reloc_type): Add R_MICROMIPS_PCHI16, R_MICROMIPS_PCLO16, R_MICROMIPS_PC21_S1, R_MICROMIPS_PC26_S1, R_MICROMIPS_PC18_S3, R_MICROMIPS_PC19_S2. --- bfd/bfd-in2.h | 6 ++ bfd/elf32-mips.c | 93 ++++++++++++++++++++++- bfd/elf64-mips.c | 181 +++++++++++++++++++++++++++++++++++++++++++- bfd/elfn32-mips.c | 185 +++++++++++++++++++++++++++++++++++++++++++-- bfd/libbfd.h | 6 ++ bfd/reloc.c | 12 +++ elfcpp/mips.h | 6 ++ include/elf/mips.h | 8 +- 8 files changed, 484 insertions(+), 13 deletions(-) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 4858fef4b1e..094c2999e5e 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -3664,6 +3664,10 @@ enum bfd_reloc_code_real BFD_RELOC_MICROMIPS_7_PCREL_S1, BFD_RELOC_MICROMIPS_10_PCREL_S1, BFD_RELOC_MICROMIPS_16_PCREL_S1, + BFD_RELOC_MICROMIPS_21_PCREL_S1, + BFD_RELOC_MICROMIPS_26_PCREL_S1, + BFD_RELOC_MICROMIPS_18_PCREL_S3, + BFD_RELOC_MICROMIPS_19_PCREL_S2, /* MIPS16 PC-relative relocation. */ BFD_RELOC_MIPS16_16_PCREL_S1, @@ -3679,6 +3683,8 @@ enum bfd_reloc_code_real BFD_RELOC_MICROMIPS_HI16, BFD_RELOC_MICROMIPS_HI16_S, BFD_RELOC_MICROMIPS_LO16, + BFD_RELOC_MICROMIPS_HI16_S_PCREL, + BFD_RELOC_MICROMIPS_LO16_PCREL, /* MIPS ELF relocations. */ BFD_RELOC_MIPS_GOT16, diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 5871fb75e8a..0e8e12e89a4 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -1401,8 +1401,34 @@ static reloc_howto_type elf_micromips_howto_table_rel[] = 0x0000ffff, /* dst_mask */ false), /* pcrel_offset */ - EMPTY_HOWTO (158), - EMPTY_HOWTO (159), + HOWTO (R_MICROMIPS_PCHI16, /* type */ + 16, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCHI16", /* name */ + true, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PCLO16, /* type */ + 0, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCLO16", /* name */ + true, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + EMPTY_HOWTO (160), EMPTY_HOWTO (161), @@ -1544,6 +1570,63 @@ static reloc_howto_type elf_micromips_howto_table_rel[] = 0x007fffff, /* src_mask */ 0x007fffff, /* dst_mask */ true), /* pcrel_offset */ + + + HOWTO (R_MICROMIPS_PC21_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 21, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC21_S1", /* name */ + true, /* partial_inplace */ + 0x001fffff, /* src_mask */ + 0x001fffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC26_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 26, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC26_S1", /* name */ + true, /* partial_inplace */ + 0x03ffffff, /* src_mask */ + 0x03ffffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC18_S3, /* type */ + 3, /* rightshift */ + 4, /* size */ + 18, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC18_S3", /* name */ + true, /* partial_inplace */ + 0x0003ffff, /* src_mask */ + 0x0003ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC19_S2, /* type */ + 2, /* rightshift */ + 4, /* size */ + 19, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC19_S2", /* name */ + true, /* partial_inplace */ + 0x0007ffff, /* src_mask */ + 0x0007ffff, /* dst_mask */ + true), /* pcrel_offset */ }; /* 16 bit offset for pc-relative branches. */ @@ -2058,12 +2141,18 @@ static const struct elf_reloc_map micromips_reloc_map[] = { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_HI16_S_PCREL, R_MICROMIPS_PCHI16 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_LO16_PCREL, R_MICROMIPS_PCLO16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_21_PCREL_S1, R_MICROMIPS_PC21_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_26_PCREL_S1, R_MICROMIPS_PC26_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_18_PCREL_S3, R_MICROMIPS_PC18_S3 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_19_PCREL_S2, R_MICROMIPS_PC19_S2 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min }, diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index f031dfd1133..93961d41927 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -2438,8 +2438,36 @@ static reloc_howto_type micromips_elf64_howto_table_rel[] = 0x0000ffff, /* dst_mask */ false), /* pcrel_offset */ - EMPTY_HOWTO (158), - EMPTY_HOWTO (159), + + HOWTO (R_MICROMIPS_PCHI16, /* type */ + 16, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCHI16", /* name */ + true, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PCLO16, /* type */ + 0, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCLO16", /* name */ + true, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + + EMPTY_HOWTO (160), EMPTY_HOWTO (161), @@ -2581,6 +2609,63 @@ static reloc_howto_type micromips_elf64_howto_table_rel[] = 0x007fffff, /* src_mask */ 0x007fffff, /* dst_mask */ true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC21_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 21, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC21_S1", /* name */ + true, /* partial_inplace */ + 0x001fffff, /* src_mask */ + 0x001fffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC26_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 26, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC26_S1", /* name */ + true, /* partial_inplace */ + 0x03ffffff, /* src_mask */ + 0x03ffffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC18_S3, /* type */ + 3, /* rightshift */ + 4, /* size */ + 18, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC18_S3", /* name */ + true, /* partial_inplace */ + 0x0003ffff, /* src_mask */ + 0x0003ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC19_S2, /* type */ + 2, /* rightshift */ + 4, /* size */ + 19, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC19_S2", /* name */ + true, /* partial_inplace */ + 0x0007ffff, /* src_mask */ + 0x0007ffff, /* dst_mask */ + true) /* pcrel_offset */ + }; static reloc_howto_type micromips_elf64_howto_table_rela[] = @@ -2940,8 +3025,34 @@ static reloc_howto_type micromips_elf64_howto_table_rela[] = 0x0000ffff, /* dst_mask */ false), /* pcrel_offset */ - EMPTY_HOWTO (158), - EMPTY_HOWTO (159), + HOWTO (R_MICROMIPS_PCHI16, /* type */ + 16, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "_MICROMIPS_PCHI16", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PCLO16, /* type */ + 0, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCLO16", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + EMPTY_HOWTO (160), EMPTY_HOWTO (161), @@ -3083,6 +3194,62 @@ static reloc_howto_type micromips_elf64_howto_table_rela[] = 0, /* src_mask */ 0x007fffff, /* dst_mask */ true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC21_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 21, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC21_S1", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x001fffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC26_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 26, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC26_S1", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x03ffffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC18_S3, /* type */ + 3, /* rightshift */ + 4, /* size */ + 18, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC18_S3", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x0003ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC19_S2, /* type */ + 2, /* rightshift */ + 4, /* size */ + 19, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC19_S2", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x0007ffff, /* dst_mask */ + true), /* pcrel_offset */ }; /* GNU extension to record C++ vtable hierarchy */ @@ -3771,12 +3938,18 @@ static const struct elf_reloc_map micromips_reloc_map[] = { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_HI16_S_PCREL, R_MICROMIPS_PCHI16 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_LO16_PCREL, R_MICROMIPS_PCLO16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_21_PCREL_S1, R_MICROMIPS_PC21_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_26_PCREL_S1, R_MICROMIPS_PC26_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_18_PCREL_S3, R_MICROMIPS_PC18_S3 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_19_PCREL_S2, R_MICROMIPS_PC19_S2 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min }, diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index 7c9967268c0..1f406a790bd 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -2418,8 +2418,35 @@ static reloc_howto_type elf_micromips_howto_table_rel[] = 0x0000ffff, /* dst_mask */ false), /* pcrel_offset */ - EMPTY_HOWTO (158), - EMPTY_HOWTO (159), + + HOWTO (R_MICROMIPS_PCHI16, /* type */ + 16, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCHI16", /* name */ + true, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PCLO16, /* type */ + 0, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCLO16", /* name */ + true, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + EMPTY_HOWTO (160), EMPTY_HOWTO (161), @@ -2561,6 +2588,62 @@ static reloc_howto_type elf_micromips_howto_table_rel[] = 0x007fffff, /* src_mask */ 0x007fffff, /* dst_mask */ true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC21_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 21, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC21_S1", /* name */ + true, /* partial_inplace */ + 0x001fffff, /* src_mask */ + 0x001fffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC26_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 26, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC26_S1", /* name */ + true, /* partial_inplace */ + 0x03ffffff, /* src_mask */ + 0x03ffffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC18_S3, /* type */ + 3, /* rightshift */ + 4, /* size */ + 18, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC18_S3", /* name */ + true, /* partial_inplace */ + 0x0003ffff, /* src_mask */ + 0x0003ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC19_S2, /* type */ + 2, /* rightshift */ + 4, /* size */ + 19, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC19_S2", /* name */ + true, /* partial_inplace */ + 0x0007ffff, /* src_mask */ + 0x0007ffff, /* dst_mask */ + true) /* pcrel_offset */ }; static reloc_howto_type elf_micromips_howto_table_rela[] = @@ -2920,8 +3003,35 @@ static reloc_howto_type elf_micromips_howto_table_rela[] = 0x0000ffff, /* dst_mask */ false), /* pcrel_offset */ - EMPTY_HOWTO (158), - EMPTY_HOWTO (159), + + HOWTO (R_MICROMIPS_PCHI16, /* type */ + 16, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCHI16", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PCLO16, /* type */ + 0, /* rightshift */ + 4, /* size */ + 16, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PCLO16", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x0000ffff, /* dst_mask */ + true), /* pcrel_offset */ + EMPTY_HOWTO (160), EMPTY_HOWTO (161), @@ -3063,6 +3173,63 @@ static reloc_howto_type elf_micromips_howto_table_rela[] = 0, /* src_mask */ 0x007fffff, /* dst_mask */ true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC21_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 21, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC21_S1", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x001fffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC26_S1, /* type */ + 1, /* rightshift */ + 4, /* size */ + 26, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC26_S1", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x03ffffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC18_S3, /* type */ + 3, /* rightshift */ + 4, /* size */ + 18, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC18_S3", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x0003ffff, /* dst_mask */ + true), /* pcrel_offset */ + + HOWTO (R_MICROMIPS_PC19_S2, /* type */ + 2, /* rightshift */ + 4, /* size */ + 19, /* bitsize */ + true, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_signed, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MICROMIPS_PC19_S2", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0x0007ffff, /* dst_mask */ + true), /* pcrel_offset */ + }; /* GNU extension to record C++ vtable hierarchy */ @@ -3195,7 +3362,7 @@ static reloc_howto_type elf_mips_eh_howto = false); /* pcrel_offset */ -/* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a +/* Set the GP value for OUTPUT_BFD. Returns false if this is a dangerous relocation. */ static bool @@ -3605,12 +3772,18 @@ static const struct elf_reloc_map micromips_reloc_map[] = { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_HI16_S_PCREL, R_MICROMIPS_PCHI16 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_LO16_PCREL, R_MICROMIPS_PCLO16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_21_PCREL_S1, R_MICROMIPS_PC21_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_26_PCREL_S1, R_MICROMIPS_PC26_S1 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_18_PCREL_S3, R_MICROMIPS_PC18_S3 - R_MICROMIPS_min }, + { BFD_RELOC_MICROMIPS_19_PCREL_S2, R_MICROMIPS_PC19_S2 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min }, { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min }, @@ -3858,7 +4031,7 @@ mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym) || bfd_is_com_section (bfd_asymbol_section (sym))); } -/* Likewise, return TRUE if the symbol table split overall must be +/* Likewise, return true if the symbol table split overall must be between section symbols and all other symbols. */ static bool mips_elf_n32_elfsym_local_is_section (bfd *abfd) diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 193c01ef50a..62f546d9bcd 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -1293,6 +1293,10 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_MICROMIPS_7_PCREL_S1", "BFD_RELOC_MICROMIPS_10_PCREL_S1", "BFD_RELOC_MICROMIPS_16_PCREL_S1", + "BFD_RELOC_MICROMIPS_21_PCREL_S1", + "BFD_RELOC_MICROMIPS_26_PCREL_S1", + "BFD_RELOC_MICROMIPS_18_PCREL_S3", + "BFD_RELOC_MICROMIPS_19_PCREL_S2", "BFD_RELOC_MIPS16_16_PCREL_S1", "BFD_RELOC_MIPS_21_PCREL_S2", "BFD_RELOC_MIPS_26_PCREL_S2", @@ -1302,6 +1306,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", "BFD_RELOC_MICROMIPS_HI16", "BFD_RELOC_MICROMIPS_HI16_S", "BFD_RELOC_MICROMIPS_LO16", + "BFD_RELOC_MICROMIPS_HI16_S_PCREL", + "BFD_RELOC_MICROMIPS_LO16_PCREL", "BFD_RELOC_MIPS_GOT16", "BFD_RELOC_MICROMIPS_GOT16", "BFD_RELOC_MIPS_CALL16", diff --git a/bfd/reloc.c b/bfd/reloc.c index 68a8929413b..08c7d055951 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -2024,6 +2024,14 @@ ENUMX BFD_RELOC_MICROMIPS_10_PCREL_S1 ENUMX BFD_RELOC_MICROMIPS_16_PCREL_S1 +ENUMX + BFD_RELOC_MICROMIPS_21_PCREL_S1 +ENUMX + BFD_RELOC_MICROMIPS_26_PCREL_S1 +ENUMX + BFD_RELOC_MICROMIPS_18_PCREL_S3 +ENUMX + BFD_RELOC_MICROMIPS_19_PCREL_S2 ENUMDOC microMIPS PC-relative relocations. @@ -2051,6 +2059,10 @@ ENUMX BFD_RELOC_MICROMIPS_HI16_S ENUMX BFD_RELOC_MICROMIPS_LO16 +ENUMX + BFD_RELOC_MICROMIPS_HI16_S_PCREL +ENUMX + BFD_RELOC_MICROMIPS_LO16_PCREL ENUMDOC microMIPS versions of generic BFD relocs. diff --git a/elfcpp/mips.h b/elfcpp/mips.h index 409a6324165..15450485b8d 100644 --- a/elfcpp/mips.h +++ b/elfcpp/mips.h @@ -146,6 +146,8 @@ enum R_MICROMIPS_SCN_DISP = 155, R_MICROMIPS_JALR = 156, R_MICROMIPS_HI0_LO16 = 157, + R_MICROMIPS_PCHI16 = 158, + R_MICROMIPS_PCLO16 = 159, // TLS relocations. R_MICROMIPS_TLS_GD = 162, R_MICROMIPS_TLS_LDM = 163, @@ -157,6 +159,10 @@ enum // microMIPS GP- and PC-relative relocations. R_MICROMIPS_GPREL7_S2 = 172, R_MICROMIPS_PC23_S2 = 173, + R_MICROMIPS_PC21_S1 = 174, + R_MICROMIPS_PC26_S1 = 175, + R_MICROMIPS_PC18_S3 = 176, + R_MICROMIPS_PC19_S2 = 177, // This was a GNU extension used by embedded-PIC. It was co-opted by // mips-linux for exception-handling data. GCC stopped using it in diff --git a/include/elf/mips.h b/include/elf/mips.h index 4fc190f404d..389c7702d7a 100644 --- a/include/elf/mips.h +++ b/include/elf/mips.h @@ -148,6 +148,8 @@ START_RELOC_NUMBERS (elf_mips_reloc_type) RELOC_NUMBER (R_MICROMIPS_SCN_DISP, 155) RELOC_NUMBER (R_MICROMIPS_JALR, 156) RELOC_NUMBER (R_MICROMIPS_HI0_LO16, 157) + RELOC_NUMBER (R_MICROMIPS_PCHI16, 158) + RELOC_NUMBER (R_MICROMIPS_PCLO16, 159) /* TLS relocations. */ RELOC_NUMBER (R_MICROMIPS_TLS_GD, 162) RELOC_NUMBER (R_MICROMIPS_TLS_LDM, 163) @@ -159,7 +161,11 @@ START_RELOC_NUMBERS (elf_mips_reloc_type) /* microMIPS GP- and PC-relative relocations. */ RELOC_NUMBER (R_MICROMIPS_GPREL7_S2, 172) RELOC_NUMBER (R_MICROMIPS_PC23_S2, 173) - FAKE_RELOC (R_MICROMIPS_max, 174) + RELOC_NUMBER (R_MICROMIPS_PC21_S1, 174) + RELOC_NUMBER (R_MICROMIPS_PC26_S1, 175) + RELOC_NUMBER (R_MICROMIPS_PC18_S3, 176) + RELOC_NUMBER (R_MICROMIPS_PC19_S2, 177) + FAKE_RELOC (R_MICROMIPS_max, 178) /* This was a GNU extension used by embedded-PIC. It was co-opted by mips-linux for exception-handling data. GCC stopped using it in -- 2.34.1
- Previous message (by thread): [PATCH v2 01/15] MIPS: Do not adjust microMIPS HI/LO relocs to be section relative
- Next message (by thread): [PATCH v2 03/15] MIPS: Improve WARN for $0 constraint on MIPSR6 branches
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list