编译 rv32i 代码包括压缩指令

Compiling rv32i Code includes compressed Instructions

我正在尝试将乏味的 C 代码编译为 RV32i 处理器可执行的 elf 格式。

然而,当我启用优化(-Os 或 -O2)时,生成的程序集包含我无法执行的压缩指令。 我所有的自制代码都被编译成普通的 rv32i 指令,只有辅助函数*被编译成 C 指令。我怎样才能完全禁用 C 指令?

对于辅助函数,我的意思是 __riscv_save_0、__riscv_restore_0、__riscv_save_4、...

我使用

编译代码
riscv32-unknown-elf-gcc $(CFLAGS) -T link.ld $(SRCS) -o $@ -lgcc

CFLAGS 为:

-g -O2 -msave-restore -mabi=ilp32 -march=rv32i --specs=nosys.specs -nostdlib -Wall -Wl,-gc-sections -ffunction-sections -ffreestanding -fno-builtin

反汇编看起来像这样 - 进行了优化:(出于某种原因我的所有代码都没有 C 指令,所有辅助函数都带有 C 指令)

00000174 <__riscv_save_0>:
174:    1141                    addi    sp,sp,-16
176:    c04a                    sw  s2,0(sp)
178:    c226                    sw  s1,4(sp)
17a:    c422                    sw  s0,8(sp)
17c:    c606                    sw  ra,12(sp)
17e:    8282                    jr  t0
...
00000198 <__riscv_restore_0>:
198:    4902                    lw  s2,0(sp)
19a:    4492                    lw  s1,4(sp)
19c:    4422                    lw  s0,8(sp)
19e:    40b2                    lw  ra,12(sp)
1a0:    0141                    addi    sp,sp,16
1a2:    8082                    ret
...
000001c4 <main>:
1c4:    fb1ff2ef            jal t0,174 <__riscv_save_0>
1c8:    034000ef            jal ra,1fc <func_a>
1cc:    00000537            lui a0,0x0
1d0:    00000613            li  a2,0
1d4:    00000593            li  a1,0
1d8:    1a450513            addi a0,a0,420
1dc:    098000ef            jal ra,274 <func_b>
1e0:    00000537            lui a0,0x0
1e4:    00000613            li  a2,0
1e8:    00000593            li  a1,0
1ec:    1b450513            addi a0,a0,436
1f0:    084000ef            jal ra,274 <func_b>
1f4:    154000ef            jal ra,348 <func_c>
1f8:    fa1ff06f            j   198 <__riscv_restore_0>

好的,我找到了问题的答案。

编译时您可以更改要使用的体系结构。但是构建中使用的库是在构建工具链时生成的。

因此我错误地使用 RV32IC 架构构建 Risc-V 工具链,但希望它们仅用于 RV32I 项目。

因此解决方法是使用 RV32I 重新编译工具链。