Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gnu gcc testsuite测试方法咨询 #146

Closed
runningsnake opened this issue Oct 10, 2022 · 12 comments
Closed

gnu gcc testsuite测试方法咨询 #146

runningsnake opened this issue Oct 10, 2022 · 12 comments

Comments

@runningsnake
Copy link

安装好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测试,上面两种问题该怎么解决,谢谢。

@pz9115
Copy link
Contributor

pz9115 commented Oct 10, 2022

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

@runningsnake
Copy link
Author

您好,我重新按照您的方法配置了,输入测试命令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相关内容。求解

@pz9115
Copy link
Contributor

pz9115 commented Oct 10, 2022

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

@runningsnake
Copy link
Author

请问为什么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测试呢,望赐教!

@pz9115
Copy link
Contributor

pz9115 commented Oct 11, 2022

请问为什么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=这个选项,它可能导致不支持某些测试

@runningsnake
Copy link
Author

你好,由于我不想测试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呢

@pz9115
Copy link
Contributor

pz9115 commented Oct 12, 2022

可以试试make check-gcc-linux?

@runningsnake
Copy link
Author

runningsnake commented Oct 19, 2022

好的,谢谢您的指导,请问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的呢。望老师讲解一下。

@pz9115
Copy link
Contributor

pz9115 commented Oct 19, 2022

好的,谢谢您的指导,请问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:执行完成后需要判断什么预期结果,例如检测是否生成了特定的汇编指令

@runningsnake
Copy link
Author

感谢老师指定,也就是说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函数,那么怎么执行测试呢。
求老师指点一二。

@pz9115
Copy link
Contributor

pz9115 commented Oct 20, 2022

你说的测试用例不完整的问题是因为只看了单个测试文件,例如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, 默认只执行编译而不会去执行。

@runningsnake
Copy link
Author

好的,多谢老师指点。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants