plctlab/PLCT-Open-Reports

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,结果如下:
image

分析:可能是测试平台的原因,x86平台上执行riscv测试,解决方法如下:

  1. 按照网上相关方法(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,出现以下结果:
    image

2.按照PLCT实验室测试方法(https://github.com/liujiawei929/GNU-Toolchain),../configure --prefix=$RISCV
make -j4 , make report-gcc-newlib 2>&1|tee rv64_newlib-reportgccnewlib.log出现如下问题:
image
请问我该用哪种方法可以顺利执行execute测试,上面两种问题该怎么解决,谢谢。

这里好像是configure报错了,可以参考https://github.com/plctlab/riscv-ci/blob/main/gnu-toolchain-rvi.sh
中的回归测试方法

您好,我重新按照您的方法配置了,输入测试命令make report-gcc-newlib 2>&1|tee gcc_newlib.log仍然出现上述问题
image
但是输出测试命令 make report-gcc-newlib -j4 或者 make report-gcc-newlib -j4 2>&1|tee gcc_newlib.log,没有报错,但测试完了未生成测试报告,未发现gcc.sum相关内容。求解

可以试试直接使用make report-gcc-newlib

请问为什么make report-gcc-newlib能够找到模拟器成功执行riscv 架构的execute测试,而make check-gcc RUNTESTFLAGS="--target_board=riscv-sim"却无法通过execute测试呢,我查看makefile发现如下代码:
image
make report-gcc-newlib就是调用make check-gcc完成测试的,怎么make check无法完成gcc.c-torture/execute测试呢,望赐教!

请问为什么make report-gcc-newlib能够找到模拟器成功执行riscv 架构的execute测试,而make check-gcc RUNTESTFLAGS="--target_board=riscv-sim"却无法通过execute测试呢,我查看makefile发现如下代码: image make report-gcc-newlib就是调用make check-gcc完成测试的,怎么make check无法完成gcc.c-torture/execute测试呢,望赐教!

make check-gcc是可以完成测试的,你指定了--target_board=这个选项,它可能导致不支持某些测试

你好,由于我不想测试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,如下图所示。
image
但是在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,如下图所示。 image 但是在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只是简单的初始化了测试框架,定义了默认的测试行为
image
它并不会去设置测试结果,默认该loop中所有文件只需要完成'assemble', 即执行*gcc -S不出错即视为通过了测试,正好对应compile这个目录名称。

如果我们切换到gcc.c-torture/execute目录下查看execute.exp
image
可以看到这里的默认选项变成了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,部分截图及完整文件如下所示
image
abs-2.txt
该测试文件的驱动框架如下所示
image
由此我们知道该测试文件需要编译后再在模拟器上执行,但是这个测试案例不完整,包含abs()等外部函数或宏定义的库或头文件也没有包含,main函数也没有,理论上说这个测试案例会编译出错也跑不起来,但为什么编译通过也执行通过了呢。
再比如有些测,试案例需要根据传递的参数执行相应的分支测试,如gcc.dg/analyer/abort.c
Uploading image.png…
但是该测试既没有传递参数,也没有main函数,那么怎么执行测试呢。
求老师指点一二。

你说的测试用例不完整的问题是因为只看了单个测试文件,例如gcc.c-torture/execute/builtins/abs-2.c缺少main函数,我们来查看gcc.c-torture/execute/builtins/builtins.exp定义的构建规则:

image

它不止编译了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, 默认只执行编译而不会去执行。

好的,多谢老师指点。