You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:58:10