gnu gcc testsuite测试方法咨询
runningsnake opened this issue · 12 comments
安装好riscv-gnutoolchain之后在编译目录下执行make check-gcc RUNTESTFLAGS="--
target_board=riscv-sim testfile.exp execute.exp",compile测试pass,execute测试fail,结果如下:
分析:可能是测试平台的原因,x86平台上执行riscv测试,解决方法如下:
- 按照网上相关方法(https://gcc.gnu.org/simtest-howto.html)和文档中所提到的方法(https://github.com/plctlab/PLCT-Open-Reports/blob/master/20210310-GNU-GCC-Testsuite-chenxiaoou.pdf),建立conbined tree ,再configure,make,出现以下结果:
2.按照PLCT实验室测试方法(https://github.com/liujiawei929/GNU-Toolchain),../configure --prefix=$RISCV
make -j4 , make report-gcc-newlib 2>&1|tee rv64_newlib-reportgccnewlib.log出现如下问题:
请问我该用哪种方法可以顺利执行execute测试,上面两种问题该怎么解决,谢谢。
这里好像是configure报错了,可以参考https://github.com/plctlab/riscv-ci/blob/main/gnu-toolchain-rvi.sh
中的回归测试方法
可以试试直接使用make report-gcc-newlib
你好,由于我不想测试g++等其他测试或者指定测试案例执行,所有需要make check-gcc命令而不用make report-linux,congure之后make linux,再次执行make check-gcc,他会再次安装riscv64-unknown-elf-命令,执行的测试的target是riscv64-unknown-elf,请问怎么才能让make check-gcc执行的测试的target是riscv64-unknown-linux-gnu呢
可以试试make check-gcc-linux
?
好的,谢谢您的指导,请问dejagnu测试原理中怎么判断一个测试案例pass/fail,下面是我的理解,请指正:
根据相关论文和官方手册来看,dejagnu测试框架是输入一个测试案例,根据测试驱动(xxx.exp)编译或运行相应的测试案例,得到一个输出,再跟一个expected results做对比,根据对比结果(0/1)输出pass/fail,如下图所示。
但是在build-gcc-linux-stage2或者gcc/testsuite源码中未找到expected results,不知道是怎么对比的。
以gcc.c-torture/compile为例分析测试过程,如下所示:
dejagnu以runtest.exp为测试驱动,测试驱动脚本为compile.exp。runtest 设置环境变量,解析命令行参数,定位了测试工具和测试案例的位置,然后初始化gcc工具,以compile.exp为驱动,根据目标编译器和选项编译compile测试案例,输出结果放到了comp_output列表,问题就在于他的输出是什么呢,怎么判断pass和fail的呢。望老师讲解一下。
好的,谢谢您的指导,请问dejagnu测试原理中怎么判断一个测试案例pass/fail,下面是我的理解,请指正:
根据相关论文和官方手册来看,dejagnu测试框架是输入一个测试案例,根据测试驱动(xxx.exp)编译或运行相应的测试案例,得到一个输出,再跟一个expected results做对比,根据对比结果(0/1)输出pass/fail,如下图所示。 但是在build-gcc-linux-stage2或者gcc/testsuite源码中未找到expected results,不知道是怎么对比的。
以gcc.c-torture/compile为例分析测试过程,如下所示: dejagnu以runtest.exp为测试驱动,测试驱动脚本为compile.exp。runtest 设置环境变量,解析命令行参数,定位了测试工具和测试案例的位置,然后初始化gcc工具,以compile.exp为驱动,根据目标编译器和选项编译compile测试案例,输出结果放到了comp_output列表,问题就在于他的输出是什么呢,怎么判断pass和fail的呢。望老师讲解一下。
这里compile.exp
只是简单的初始化了测试框架,定义了默认的测试行为
它并不会去设置测试结果,默认该loop中所有文件只需要完成'assemble', 即执行*gcc -S
不出错即视为通过了测试,正好对应compile这个目录名称。
如果我们切换到gcc.c-torture/execute
目录下查看execute.exp
可以看到这里的默认选项变成了run
,即需要完成编译,汇编,链接,并在指定的模拟器上运行,上述步骤均未报错才视为通过了测试
由于每个测试用例的可能需要不同参数和判断,额外的测试参数和额外的判断条件是写在每一个.c
测试文件中的,上面的.exp
中的选项可以单独在.c
文件中定义,具体框架通常包含
dg-do
: 该测试用例需要执行什么样的gcc命令,常见的有compile, run
dg-options
: 该测试用例执行时gcc需要什么参数,例如-O的等级
dg-final
:执行完成后需要判断什么预期结果,例如检测是否生成了特定的汇编指令
感谢老师指定,也就是说compile.exp也只是定义了测试行为,即调用gcc -s gcc.c-torture/compile/xxx.c,编译通过证明测试通过,编译出错则证明测试出错,结果保存在comp_output列表中,而对于需要特定的测试条件和判断通过与否标准的测试可在.c中单独设置。例如 gcc.c-torture/execute/builtins/abs-2.c,部分截图及完整文件如下所示
abs-2.txt
该测试文件的驱动框架如下所示
由此我们知道该测试文件需要编译后再在模拟器上执行,但是这个测试案例不完整,包含abs()等外部函数或宏定义的库或头文件也没有包含,main函数也没有,理论上说这个测试案例会编译出错也跑不起来,但为什么编译通过也执行通过了呢。
再比如有些测,试案例需要根据传递的参数执行相应的分支测试,如gcc.dg/analyer/abort.c
但是该测试既没有传递参数,也没有main函数,那么怎么执行测试呢。
求老师指点一二。
你说的测试用例不完整的问题是因为只看了单个测试文件,例如gcc.c-torture/execute/builtins/abs-2.c
缺少main函数,我们来查看gcc.c-torture/execute/builtins/builtins.exp
定义的构建规则:
它不止编译了abs-2.c
这一个源文件, 而是将abs-2.c abs-2-lib.c gcc/testsuite/gcc.c-torture/execute/builtins/lib/main.c
三个文件一起进行构建生成可执行文件并运行测试。
同理gcc.dg/analyer/abort.c
, 查看analyer.exp
, 它未定义do-what, 默认只执行编译而不会去执行。
好的,多谢老师指点。