我有一个多文件(3.cpp文件和2.h文件(C++代码,它使用new、new[],delete和delete[]运算符来分配大块内存并执行一些浮点运算(需要通过sqrt((进行除法(。该程序与常规g++一起编译并运行良好,并产生所需的输出。我现在想把它转换成RISC-V指令。
-
我首先使用GNU RISC-V编译器工具链用以下命令编译程序:
riscv32-unknown-elf-g++ -w -march=rv32imafc -mabi=ilp32f -DPREALLOCATE=1 -mcmodel=medany -fno-common -static -Iinclude/ f1.cpp f2.cpp f3.cpp -o executable
此处可执行文件是已编译的二进制文件。
-
由于在编译时没有抛出任何错误,我继续运行whirless模拟器,如下所示:
whisper --isa imafc --target executable --logfile mylog --profileinst prfl
其中mylog和prfl是输出文件路径。
-
生成的日志文件大小超过6 GB,并且没有终止,所以我认为它陷入了某种无限循环。
-
我尝试添加_start((函数和到主变量,但都不起作用(与上面的3相同的问题(。[基于此处的建议]
-
我为可执行文件生成了一个对象转储,并捕获了main((的起始地址的(十六进制(地址、其结束地址和主机地址,并将它们分别作为参数传递给
--startpc
、--endpc
和--tohost
,在这种情况下,程序在64次非法操作和大约300 MB的日志文件后中止。
我想我犯了一些错误。请帮助我解决这个问题,或者分享为我的C++程序生成RISC-V汇编指令的正确步骤。
感谢谢夫和彼得·科德斯提供了一些准确的指针。事实证明,正如Valgrind检测到的那样,我在代码中出现了越界访问错误;尽管我不得不承认,我打扰了Whisper Simulator的开发人员,他很乐意提供帮助。
解析步骤如下:
- 删除以下位置的错误:symm_normalize.h:112-D[j]应为D[i],symm_normalized.h:161-
for
循环必须求值到rows
,而不是cols
。在whirler-github repo页面上解释的_start()
函数和tohost
变量的使用是强制性的 - 我在编译(
-march=rv32imafc
(和模拟(--isa imafc
(期间使用了单精度浮点架构,并在symm_normalize.h:131错误地使用了sqrt()
函数而不是sqrtf()
- 安装GNU RISC-V编译器工具链
- 安装Whisper模拟器
- 编译RISC-V的代码(使用GNU工具链;命令与问题相同(
- 使用以下命令执行模拟:
whisper --newlib --isa imafc --target executable --logfile mylog --profileinst prfl --verbose
该决议由Whisper的开发者通过此次github回购问题提供。