【发布时间】:2011-08-30 08:31:13
【问题描述】:
我为 LLVM 代码生成器后端编写了一个低级优化。基本上,优化将在基本块级别对汇编指令重新排序,以允许以后(现有)优化更有效地优化结果代码。我想验证许多测试用例,我想对测试过程提出一些建议,因为这是我第一次尝试这样的事情。
到目前为止我考虑过的事情:
编译用 C 编写的基准测试并检查使用
-S选项生成的 ASM。我已经这样做了,并将结果与我的优化结果与原始结果进行了比较。这种方法可以让我看到我的优化是有效的,但是即使我编写了自定义的不可执行的 C 文件,我也无法检查所有我想要的指令排序测试用例。将基准编译为 LLVM 程序集,对其进行编辑,然后将 ASM 降低到目标计算机程序集。这可能可行,但由于 LLVM 和目标 ASM 之间的抽象级别不同,我怀疑我是否能够通过破解 LLVM ASM 来检查所有测试用例,直到它生成我想要的为止。
使用目标 ASM 测试用例作为 LLVM 的输入,并使用新的优化重新编译。我找不到 LLVM 或 gcc(LLVM 接受的大多数选项)接受 ASM 作为输入的选项。
在验证低级 ASM 编译器优化时,测试特定 ASM 测试用例的好策略是什么? LLVM(或 gcc)是否有一些命令行选项可以简化此过程?
编辑:澄清一下,我不是在问自动生成 ASM 测试用例;我的问题是我有那些测试用例(例如ASM_before.s 和reference_ASM_after.s),但我需要能够将ASM_before.s 传递到LLVM 并确保优化的输出ASM_after.s 与已知良好的reference_ASM_after.s 匹配。我正在寻找一种方法来做到这一点,而不必将ASM_before.s“反编译”为高级语言,然后将其(通过优化)编译为ASM_after.s。
【问题讨论】:
-
它可以用作自动测试生成器。它将生成许多测试(某些规则中的随机代码甚至自检测试),然后覆盖代码生成器。编写好的测试生成器并不容易,但它可以生成比测试编写者团队更多的测试。
-
(3) Gcc 不是 asm 优化编译器。如果你问
gcc file.S,它不会运行代码生成器,而是启动一个gas汇编器。
标签: testing gcc assembly code-generation llvm