RISC-V: Moved out linker internal relocations after R_RISCV_max.
authorNelson Chu <nelson@rivosinc.com>
Mon, 6 Nov 2023 05:28:51 +0000 (13:28 +0800)
committerNelson Chu <nelson@rivosinc.com>
Mon, 6 Nov 2023 09:21:42 +0000 (17:21 +0800)
Just the lightest modifications about this, without any further checks and
considering --emit-relocs.  We will need to improve it in the future, but
first do this to avoid conflicts between linker internal relocations and the
new definition of psabi.  For example, TLSDESC relocs.

Passed riscv-gnu-toolchain regressions, so should be safe enough to commit.

Co-authored-by: Tsukasa OI <research_trasio@irq.a4lg.com>
bfd/
* reloc.c: Removed linker internal relocations.
* bfd-in2.h: Regenerated.
* libbfd.h: Regenerated.
* elfnn-riscv.c: Defined R_RISCV_DELETE in include/elf/riscv.h.
* elfxx-riscv.c (howto_table, howto_table_internal): Moved linker
internal relocations from howto_table into howto_table_internal.
(riscv_reloc_map): Removed linker internal relocations mapping.
(riscv_elf_rtype_to_howto): Return howto of linker internal
relocations from howto_table_internal.
include/
* elf/riscv.h: Defined linker internal relocations after R_RISCV_max.

bfd/bfd-in2.h
bfd/elfnn-riscv.c
bfd/elfxx-riscv.c
bfd/libbfd.h
bfd/reloc.c
include/elf/riscv.h

index e26bc40a9e1e26ccca3fef55f7241561d6f4a4f6..96eef92fdc73b60235241cd06ed59ebad605b30c 100644 (file)
@@ -5399,11 +5399,6 @@ enum bfd_reloc_code_real
   BFD_RELOC_RISCV_ALIGN,
   BFD_RELOC_RISCV_RVC_BRANCH,
   BFD_RELOC_RISCV_RVC_JUMP,
-  BFD_RELOC_RISCV_RVC_LUI,
-  BFD_RELOC_RISCV_GPREL_I,
-  BFD_RELOC_RISCV_GPREL_S,
-  BFD_RELOC_RISCV_TPREL_I,
-  BFD_RELOC_RISCV_TPREL_S,
   BFD_RELOC_RISCV_RELAX,
   BFD_RELOC_RISCV_CFA,
   BFD_RELOC_RISCV_SUB6,
index 00e5c69dbec2fd64fd02bac9c4dc7edfe30ddb52..5c4bf4bc3cbc11ad69ee9e41664574700f6cb5e9 100644 (file)
     } \
   while (0)
 
-/* Internal relocations used exclusively by the relaxation pass.  */
-#define R_RISCV_DELETE (R_RISCV_max + 1)
-
 #define ARCH_SIZE NN
 
 #define MINUS_ONE ((bfd_vma)0 - 1)
index c070394a36671aae0b033292adeac80b90f6477c..937ab7a6deb3147b9fe4bd7abad4e88be7b00c64 100644 (file)
@@ -218,7 +218,6 @@ static reloc_howto_type howto_table[] =
         MINUS_ONE,                     /* dst_mask */
         false),                        /* pcrel_offset */
 
-  /* Reserved for future relocs that the dynamic linker must understand.  */
   EMPTY_HOWTO (12),
   EMPTY_HOWTO (13),
   EMPTY_HOWTO (14),
@@ -601,9 +600,8 @@ static reloc_howto_type howto_table[] =
         MINUS_ONE,                     /* dst_mask */
         false),                        /* pcrel_offset */
 
-  /* 41 and 42 are reserved.  */
-  EMPTY_HOWTO (0),
-  EMPTY_HOWTO (0),
+  EMPTY_HOWTO (41),
+  EMPTY_HOWTO (42),
 
   /* Indicates an alignment statement.  The addend field encodes how many
      bytes of NOPs follow the statement.  The desired alignment is the
@@ -652,80 +650,11 @@ static reloc_howto_type howto_table[] =
         ENCODE_CJTYPE_IMM (-1U),       /* dst_mask */
         true),                         /* pcrel_offset */
 
-  /* High 6 bits of 18-bit absolute address.  */
-  HOWTO (R_RISCV_RVC_LUI,              /* type */
-        0,                             /* rightshift */
-        2,                             /* size */
-        16,                            /* bitsize */
-        false,                         /* pc_relative */
-        0,                             /* bitpos */
-        complain_overflow_dont,        /* complain_on_overflow */
-        bfd_elf_generic_reloc,         /* special_function */
-        "R_RISCV_RVC_LUI",             /* name */
-        false,                         /* partial_inplace */
-        0,                             /* src_mask */
-        ENCODE_CITYPE_IMM (-1U),       /* dst_mask */
-        false),                        /* pcrel_offset */
-
-  /* GP-relative load.  */
-  HOWTO (R_RISCV_GPREL_I,              /* type */
-        0,                             /* rightshift */
-        4,                             /* size */
-        32,                            /* bitsize */
-        false,                         /* pc_relative */
-        0,                             /* bitpos */
-        complain_overflow_dont,        /* complain_on_overflow */
-        bfd_elf_generic_reloc,         /* special_function */
-        "R_RISCV_GPREL_I",             /* name */
-        false,                         /* partial_inplace */
-        0,                             /* src_mask */
-        ENCODE_ITYPE_IMM (-1U),        /* dst_mask */
-        false),                        /* pcrel_offset */
-
-  /* GP-relative store.  */
-  HOWTO (R_RISCV_GPREL_S,              /* type */
-        0,                             /* rightshift */
-        4,                             /* size */
-        32,                            /* bitsize */
-        false,                         /* pc_relative */
-        0,                             /* bitpos */
-        complain_overflow_dont,        /* complain_on_overflow */
-        bfd_elf_generic_reloc,         /* special_function */
-        "R_RISCV_GPREL_S",             /* name */
-        false,                         /* partial_inplace */
-        0,                             /* src_mask */
-        ENCODE_STYPE_IMM (-1U),        /* dst_mask */
-        false),                        /* pcrel_offset */
-
-  /* TP-relative TLS LE load.  */
-  HOWTO (R_RISCV_TPREL_I,              /* type */
-        0,                             /* rightshift */
-        4,                             /* size */
-        32,                            /* bitsize */
-        false,                         /* pc_relative */
-        0,                             /* bitpos */
-        complain_overflow_signed,      /* complain_on_overflow */
-        bfd_elf_generic_reloc,         /* special_function */
-        "R_RISCV_TPREL_I",             /* name */
-        false,                         /* partial_inplace */
-        0,                             /* src_mask */
-        ENCODE_ITYPE_IMM (-1U),        /* dst_mask */
-        false),                        /* pcrel_offset */
-
-  /* TP-relative TLS LE store.  */
-  HOWTO (R_RISCV_TPREL_S,              /* type */
-        0,                             /* rightshift */
-        4,                             /* size */
-        32,                            /* bitsize */
-        false,                         /* pc_relative */
-        0,                             /* bitpos */
-        complain_overflow_signed,      /* complain_on_overflow */
-        bfd_elf_generic_reloc,         /* special_function */
-        "R_RISCV_TPREL_S",             /* name */
-        false,                         /* partial_inplace */
-        0,                             /* src_mask */
-        ENCODE_STYPE_IMM (-1U),        /* dst_mask */
-        false),                        /* pcrel_offset */
+  EMPTY_HOWTO (46),
+  EMPTY_HOWTO (47),
+  EMPTY_HOWTO (48),
+  EMPTY_HOWTO (49),
+  EMPTY_HOWTO (50),
 
   /* The paired relocation may be relaxed.  */
   HOWTO (R_RISCV_RELAX,                        /* type */
@@ -881,6 +810,87 @@ static reloc_howto_type howto_table[] =
         false),                        /* pcrel_offset */
 };
 
+static reloc_howto_type howto_table_internal[] =
+{
+  /* R_RISCV_DELETE.  */
+  EMPTY_HOWTO (0),
+
+  /* High 6 bits of 18-bit absolute address.  */
+  HOWTO (R_RISCV_RVC_LUI,              /* type */
+        0,                             /* rightshift */
+        2,                             /* size */
+        16,                            /* bitsize */
+        false,                         /* pc_relative */
+        0,                             /* bitpos */
+        complain_overflow_dont,        /* complain_on_overflow */
+        bfd_elf_generic_reloc,         /* special_function */
+        "R_RISCV_RVC_LUI",             /* name */
+        false,                         /* partial_inplace */
+        0,                             /* src_mask */
+        ENCODE_CITYPE_IMM (-1U),       /* dst_mask */
+        false),                        /* pcrel_offset */
+
+  /* GP-relative load.  */
+  HOWTO (R_RISCV_GPREL_I,              /* type */
+        0,                             /* rightshift */
+        4,                             /* size */
+        32,                            /* bitsize */
+        false,                         /* pc_relative */
+        0,                             /* bitpos */
+        complain_overflow_dont,        /* complain_on_overflow */
+        bfd_elf_generic_reloc,         /* special_function */
+        "R_RISCV_GPREL_I",             /* name */
+        false,                         /* partial_inplace */
+        0,                             /* src_mask */
+        ENCODE_ITYPE_IMM (-1U),        /* dst_mask */
+        false),                        /* pcrel_offset */
+
+  /* GP-relative store.  */
+  HOWTO (R_RISCV_GPREL_S,              /* type */
+        0,                             /* rightshift */
+        4,                             /* size */
+        32,                            /* bitsize */
+        false,                         /* pc_relative */
+        0,                             /* bitpos */
+        complain_overflow_dont,        /* complain_on_overflow */
+        bfd_elf_generic_reloc,         /* special_function */
+        "R_RISCV_GPREL_S",             /* name */
+        false,                         /* partial_inplace */
+        0,                             /* src_mask */
+        ENCODE_STYPE_IMM (-1U),        /* dst_mask */
+        false),                        /* pcrel_offset */
+
+  /* TP-relative TLS LE load.  */
+  HOWTO (R_RISCV_TPREL_I,              /* type */
+        0,                             /* rightshift */
+        4,                             /* size */
+        32,                            /* bitsize */
+        false,                         /* pc_relative */
+        0,                             /* bitpos */
+        complain_overflow_signed,      /* complain_on_overflow */
+        bfd_elf_generic_reloc,         /* special_function */
+        "R_RISCV_TPREL_I",             /* name */
+        false,                         /* partial_inplace */
+        0,                             /* src_mask */
+        ENCODE_ITYPE_IMM (-1U),        /* dst_mask */
+        false),                        /* pcrel_offset */
+
+  /* TP-relative TLS LE store.  */
+  HOWTO (R_RISCV_TPREL_S,              /* type */
+        0,                             /* rightshift */
+        4,                             /* size */
+        32,                            /* bitsize */
+        false,                         /* pc_relative */
+        0,                             /* bitpos */
+        complain_overflow_signed,      /* complain_on_overflow */
+        bfd_elf_generic_reloc,         /* special_function */
+        "R_RISCV_TPREL_S",             /* name */
+        false,                         /* partial_inplace */
+        0,                             /* src_mask */
+        ENCODE_STYPE_IMM (-1U),        /* dst_mask */
+        false),                        /* pcrel_offset */
+};
+
 /* A mapping from BFD reloc types to RISC-V ELF reloc types.  */
 struct elf_reloc_map
 {
@@ -928,11 +938,6 @@ static const struct elf_reloc_map riscv_reloc_map[] =
   { BFD_RELOC_RISCV_ALIGN, R_RISCV_ALIGN },
   { BFD_RELOC_RISCV_RVC_BRANCH, R_RISCV_RVC_BRANCH },
   { BFD_RELOC_RISCV_RVC_JUMP, R_RISCV_RVC_JUMP },
-  { BFD_RELOC_RISCV_RVC_LUI, R_RISCV_RVC_LUI },
-  { BFD_RELOC_RISCV_GPREL_I, R_RISCV_GPREL_I },
-  { BFD_RELOC_RISCV_GPREL_S, R_RISCV_GPREL_S },
-  { BFD_RELOC_RISCV_TPREL_I, R_RISCV_TPREL_I },
-  { BFD_RELOC_RISCV_TPREL_S, R_RISCV_TPREL_S },
   { BFD_RELOC_RISCV_RELAX, R_RISCV_RELAX },
   { BFD_RELOC_RISCV_SUB6, R_RISCV_SUB6 },
   { BFD_RELOC_RISCV_SET6, R_RISCV_SET6 },
@@ -975,14 +980,17 @@ riscv_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
 reloc_howto_type *
 riscv_elf_rtype_to_howto (bfd *abfd, unsigned int r_type)
 {
-  if (r_type >= ARRAY_SIZE (howto_table))
+  if (r_type < ARRAY_SIZE (howto_table))
+    return &howto_table[r_type];
+  else if (r_type < R_RISCV_max + ARRAY_SIZE (howto_table_internal))
+    return &howto_table_internal[r_type - R_RISCV_max];
+  else
     {
       (*_bfd_error_handler) (_("%pB: unsupported relocation type %#x"),
                             abfd, r_type);
       bfd_set_error (bfd_error_bad_value);
       return NULL;
     }
-  return &howto_table[r_type];
 }
 
 /* Special_function of RISCV_ADD and RISCV_SUB relocations.  */
index 1ce6bc12b7e169b797f38c7da2ee1f23e7c80186..fce0680f3dbeea49d8f0a9858cb54222e66ef04b 100644 (file)
@@ -2400,11 +2400,6 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_RISCV_ALIGN",
   "BFD_RELOC_RISCV_RVC_BRANCH",
   "BFD_RELOC_RISCV_RVC_JUMP",
-  "BFD_RELOC_RISCV_RVC_LUI",
-  "BFD_RELOC_RISCV_GPREL_I",
-  "BFD_RELOC_RISCV_GPREL_S",
-  "BFD_RELOC_RISCV_TPREL_I",
-  "BFD_RELOC_RISCV_TPREL_S",
   "BFD_RELOC_RISCV_RELAX",
   "BFD_RELOC_RISCV_CFA",
   "BFD_RELOC_RISCV_SUB6",
index 6e9377c31cef07ad7f4e9a7b29cd1982e8c9fe7f..93ebad879e0673a25b567f26b25a1997d1a9fb2d 100644 (file)
@@ -4990,16 +4990,6 @@ ENUMX
   BFD_RELOC_RISCV_RVC_BRANCH
 ENUMX
   BFD_RELOC_RISCV_RVC_JUMP
-ENUMX
-  BFD_RELOC_RISCV_RVC_LUI
-ENUMX
-  BFD_RELOC_RISCV_GPREL_I
-ENUMX
-  BFD_RELOC_RISCV_GPREL_S
-ENUMX
-  BFD_RELOC_RISCV_TPREL_I
-ENUMX
-  BFD_RELOC_RISCV_TPREL_S
 ENUMX
   BFD_RELOC_RISCV_RELAX
 ENUMX
index 0aa8b3359c4c62748a1bed078a16470f8a5c4ad6..56d419c665b0adccd7fabab2d6575bdfee98fbc5 100644 (file)
@@ -92,6 +92,14 @@ START_RELOC_NUMBERS (elf_riscv_reloc_type)
   RELOC_NUMBER (R_RISCV_SUB_ULEB128, 61)
 END_RELOC_NUMBERS (R_RISCV_max)
 
+/* Internal relocations used exclusively by the relaxation pass.  */
+#define R_RISCV_DELETE  (R_RISCV_max)
+#define R_RISCV_RVC_LUI (R_RISCV_max + 1)
+#define R_RISCV_GPREL_I (R_RISCV_max + 2)
+#define R_RISCV_GPREL_S (R_RISCV_max + 3)
+#define R_RISCV_TPREL_I (R_RISCV_max + 4)
+#define R_RISCV_TPREL_S (R_RISCV_max + 5)
+
 /* Processor specific flags for the ELF header e_flags field.  */
 
 /* File may contain compressed instructions.  */