如何在LLVM FileCheck中比较多个任意匹配模式?
在LLVM FileCheck中比较多个任意匹配模式的实现方式
原生功能支持情况
LLVM FileCheck不支持跨不同check-prefix或不同FileCheck进程调用之间共享匹配变量并直接对比。每个FileCheck进程是独立运行的,匹配变量仅在当前进程的上下文内有效,无法跨实例传递或复用。
最简单的实现方案
针对你示例中多独立FileCheck调用的场景,最直接的方式是借助shell命令捕获匹配结果,再进行对比,主要有两种思路:
1. 直接用Shell变量捕获并对比
通过shell命令提取每个FileCheck的匹配结果,存入变量后直接判断是否相等:
RUN: MATCH1=$(... | FileCheck --check-prefix=PREFIX1 --dump-input=fail %s 2>&1 | grep -oP 'PREFIX1-NEXT: \K.*') RUN: MATCH2=$(... | FileCheck --check-prefix=PREFIX2 --dump-input=fail %s 2>&1 | grep -oP 'PREFIX2-NEXT: \K.*') RUN: MATCH3=$(... | FileCheck --check-prefix=PREFIX3 --dump-input=fail %s 2>&1 | grep -oP 'PREFIX3-NEXT: \K.*') RUN: [ "$MATCH1" = "$MATCH2" ] && [ "$MATCH2" = "$MATCH3" ]
- 说明:
--dump-input=fail用于确保匹配内容被输出,grep -oP则精准提取PREFIX-NEXT:后的目标内容;若匹配失败,后续的对比命令会直接报错,触发测试失败。
2. 写入临时文件后对比
将每个匹配结果写入临时文件,再用cmp或diff工具检查文件内容是否一致:
RUN: ... | FileCheck --check-prefix=PREFIX1 --dump-input=fail %s 2>&1 | grep -oP 'PREFIX1-NEXT: \K.*' > tmp1.txt RUN: ... | FileCheck --check-prefix=PREFIX2 --dump-input=fail %s 2>&1 | grep -oP 'PREFIX2-NEXT: \K.*' > tmp2.txt RUN: ... | FileCheck --check-prefix=PREFIX3 --dump-input=fail %s 2>&1 | grep -oP 'PREFIX3-NEXT: \K.*' > tmp3.txt RUN: cmp tmp1.txt tmp2.txt && cmp tmp2.txt tmp3.txt
- 说明:LLVM测试框架会自动清理测试过程中生成的临时文件,无需手动删除;
cmp用于二进制对比,比diff更高效,适合单内容行的对比场景。
补充:同进程内的匹配对比(若适用)
如果所有匹配逻辑可以放在同一个FileCheck进程内,可直接使用FileCheck的变量捕获功能实现对比:
RUN: ... | FileCheck %s CHECK: 无关内容 CHECK: [[TARGET_PATTERN:.*]] CHECK-NEXT: [[TARGET_PATTERN]] CHECK-NEXT: [[TARGET_PATTERN]]
这种方式是FileCheck原生支持的,但仅适用于同一输入流内的重复匹配验证,无法覆盖你示例中多独立RUN的场景。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

