[RFC,1/5] RISC-V: Add Zcmt table-jump relocation definitions
Commit Message
Add a ZCMT table jump relaxation pass in the linker, the ELF relocation
number, opcode constants, and RISC-V BFD parameter
state needed by linker table-jump relaxation.
bfd/ChangeLog:
* elfxx-riscv.c: Add TABLE_JUMP howto.
* elfxx-riscv.h (struct riscv_elf_params): Add relax_zcmt field.
(enum riscv_relax_pass): New enum.
(enum jvt_profiling_trip): Ditto.
include/ChangeLog:
* elf/riscv.h (R_RISCV_TABLE_JUMP): New reloc number.
(RISCV_TABLE_JUMP_BASE_SYMBOL): New symbol name.
(TABLE_JUMP_SEC_NAME): New section name.
* opcode/riscv.h (ZCMT_TOTAL_ENTRIES): New Zcmt constants.
(ZCMT_JT_BEGIN): Ditto.
(ZCMT_JT_END): Ditto.
(ZCMT_JT_NUM_ENTRIES): Ditto.
(ZCMT_JALT_BEGIN): Ditto.
(ZCMT_JALT_END): Ditto.
(ZCMT_JALT_NUM_ENTRIES): Ditto.
---
bfd/elfxx-riscv.c | 4 ++++
bfd/elfxx-riscv.h | 21 +++++++++++++++++++++
include/elf/riscv.h | 5 +++++
include/opcode/riscv.h | 9 +++++++++
4 files changed, 39 insertions(+)
@@ -961,6 +961,10 @@ static const reloc_howto_type howto_table_internal[] =
0, /* src_mask */
ENCODE_STYPE_IMM (-1U), /* dst_mask */
false), /* pcrel_offset */
+
+ /* R_RISCV_TABLE_JUMP is linker-internal. It is consumed before final
+ relocations are emitted and must never become psABI-visible. */
+ EMPTY_HOWTO (0),
};
/* A mapping from BFD reloc types to RISC-V ELF reloc types. */
@@ -44,6 +44,8 @@ struct riscv_elf_params
bool relax_gp;
/* Whether to check if SUB_ULEB128 relocation has non-zero addend. */
bool check_uleb128;
+ /* Whether to relax code sequences for Zcmt. */
+ bool relax_zcmt;
};
extern void riscv_elf32_set_options (struct bfd_link_info *,
@@ -101,6 +103,25 @@ typedef struct
bool check_unknown_prefixed_ext;
} riscv_parse_subset_t;
+/* List the relaxation passes. */
+enum riscv_relax_pass
+{
+ RELAX_PASS_SHORTEN_LUI_CALL_TRREL_PCREL,
+ RELAX_PASS_CAN_BE_DISABLED = RELAX_PASS_SHORTEN_LUI_CALL_TRREL_PCREL,
+ RELAX_PASS_TABLE_JUMP_PROFILING,
+ RELAX_PASS_ALIGNMENT,
+ RELAX_PASS_END,
+};
+
+/* Trips for jvt profiling relaxation pass. */
+enum jvt_profiling_trip
+{
+ JVT_PROFILING_RECORD_SYM,
+ JVT_PROFILING_RANK,
+ JVT_PROFILING_DETERMINE,
+ JVT_PROFILING_TRIM,
+};
+
extern bool
riscv_parse_subset (riscv_parse_subset_t *,
const char *);
@@ -105,6 +105,7 @@ END_RELOC_NUMBERS (R_RISCV_max)
#define R_RISCV_GPREL_S (R_RISCV_max + 4)
#define R_RISCV_TPREL_I (R_RISCV_max + 5)
#define R_RISCV_TPREL_S (R_RISCV_max + 6)
+#define R_RISCV_TABLE_JUMP (R_RISCV_max + 7)
/* Processor specific flags for the ELF header e_flags field. */
@@ -132,6 +133,10 @@ END_RELOC_NUMBERS (R_RISCV_max)
/* The name of the global pointer symbol. */
#define RISCV_GP_SYMBOL "__global_pointer$"
+#define RISCV_TABLE_JUMP_BASE_SYMBOL "__jvt_base$"
+
+#define TABLE_JUMP_SEC_NAME ".riscv.jvt"
+
/* Processor specific dynamic array tags. */
#define DT_RISCV_VARIANT_CC (DT_LOPROC + 1)
@@ -698,6 +698,15 @@ struct riscv_opcode
disassembler, and requires special treatment by the assembler. */
#define INSN_MACRO 0xffffffff
+/* Define Zcmt jump table constants. */
+#define ZCMT_TOTAL_ENTRIES 256
+#define ZCMT_JT_BEGIN 0
+#define ZCMT_JT_END 31
+#define ZCMT_JT_NUM_ENTRIES (ZCMT_JT_END - ZCMT_JT_BEGIN + 1)
+#define ZCMT_JALT_BEGIN (ZCMT_JT_END + 1)
+#define ZCMT_JALT_END (ZCMT_TOTAL_ENTRIES - 1)
+#define ZCMT_JALT_NUM_ENTRIES (ZCMT_JALT_END - ZCMT_JALT_BEGIN + 1)
+
/* This is a list of macro expanded instructions. */
enum
{