编译 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 重新编译工具链。
我正在尝试将乏味的 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 重新编译工具链。