]> 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 06:55:02 +0000 (14:55 +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.

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

index 2bcabd03517a914ff9aebe51dcceb8f584c7beeb..2759a4cb1c9f624fd5f93ad0a8fa775b1d5ef442 100644 (file)
@@ -888,7 +888,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" } } */