在 i386 目标的 QEMU 存储库中找不到 compute_all_xxx 函数的定义?

Can't find definition of compute_all_xxx functions in QEMU repository for i386 target?

我正在阅读 Qemu 的源代码,想知道 Qemu 如何模拟 x86 处理器的 eflags,在 target-i386/cc-helper.c 文件中我发现像 compute_all_addw 这样的函数可以完成这项工作,我想知道如何Qemu 实现了这些功能,但我找不到所有这些功能的定义。我错过了什么?请帮忙

QEMU 在这里使用了一个它经常使用的技巧——使用 C 预处理器创建多个非常相似的函数,而不必手动将它们全部写出来。

在此特定情况下,代码位于 target-i386/cc_helper_template.h:

static int glue(compute_all_add, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1)
{
    int cf, pf, af, zf, sf, of;
    [...]
}

其中 glue() 是一个宏,它只是将其参数粘在一起。 SUFFIXDATA_TYPE 是根据 SHIFT 的值在 .h 文件中较早定义的。 target-i386/cc_helper.c 然后 #include 多次使用模板 .h 文件,每次都不同地定义 SHIFT。这导致从单个模板生成 compute_all_addbcompute_all_addwcompute_all_addlcompute_all_addq 的函数定义。

一般来说,如果您在 QEMU 的源代码中找不到带有 'grep' 的函数定义,那么很有可能它是像这样自动生成的——搜索函数名称的子字符串可能会有帮助。