]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
RISC-V: Put jump table in text for large code model
authorKito Cheng <kito.cheng@sifive.com>
Mon, 14 Apr 2025 08:03:07 +0000 (16:03 +0800)
committerKito Cheng <kito.cheng@sifive.com>
Wed, 16 Apr 2025 17:05:36 +0000 (01:05 +0800)
Large code model assume the data or rodata may put far away from
text section.  So we need to put jump table in text section for
large code model.

gcc/ChangeLog:

* config/riscv/riscv.h (JUMP_TABLES_IN_TEXT_SECTION): Check if
large code model.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/jump-table-large-code-model.c: New test.

(cherry picked from commit 1d9e02bb7e0af4f3d3eaaa1a0f4961970aba5560)

gcc/config/riscv/riscv.h
gcc/testsuite/gcc.target/riscv/jump-table-large-code-model.c [new file with mode: 0644]

index 8a9fec787e4870f8c9259085e8ddd14d249e075f..9f782c9db2c8766d0ffb7accf90aa027426496f5 100644 (file)
@@ -842,7 +842,7 @@ extern enum riscv_cc get_riscv_cc (const rtx use);
 #define ASM_OUTPUT_OPCODE(STREAM, PTR) \
   (PTR) = riscv_asm_output_opcode(STREAM, PTR)
 
-#define JUMP_TABLES_IN_TEXT_SECTION 0
+#define JUMP_TABLES_IN_TEXT_SECTION (riscv_cmodel == CM_LARGE)
 #define CASE_VECTOR_MODE SImode
 #define CASE_VECTOR_PC_RELATIVE (riscv_cmodel != CM_MEDLOW)
 
diff --git a/gcc/testsuite/gcc.target/riscv/jump-table-large-code-model.c b/gcc/testsuite/gcc.target/riscv/jump-table-large-code-model.c
new file mode 100644 (file)
index 0000000..1ee7f6c
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gc -mabi=lp64 -mcmodel=large" } */
+
+int foo(int x, int y)
+{
+  switch(x){
+  case 0:
+    return 123 + y;
+  case 1:
+    return 456 + y;
+  case 2:
+    return 789 - y;
+  case 3:
+    return 12 * y;
+  case 4:
+    return 13 % y;
+  case 5:
+    return 11 *y;
+  }
+  return 0;
+}
+
+
+/* { dg-final { scan-assembler-not "\.section  \.rodata" } } */