我正在阅读Qemu的源代码并想知道Qemu如何为x86处理器模拟eflags,在target-i386/cc-helper.c
文件中我发现像compute_all_addw
这样的函数可以完成工作,我想知道Qemu如何实现那些功能,但我找不到所有这些功能的定义。我错过了什么?请帮助。
答案 0 :(得分:1)
QEMU在这里经常使用一种技巧 - 使用C预处理器创建多个非常相似的函数,而不必手动将它们全部写出来。
在这种特定情况下,代码位于target-i386 / cc_helper_template.h中:
spark-submit
其中static int glue(compute_all_add, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1)
{
int cf, pf, af, zf, sf, of;
[...]
}
是一个只将其参数组合在一起的宏。基于glue()
的值,先前在.h文件中定义了SUFFIX
和DATA_TYPE
。 SHIFT
然后target-i386/cc_helper.c
模板.h文件多次,每次都以不同方式定义#include
。这会导致从单个模板生成SHIFT
,compute_all_addb
,compute_all_addw
和compute_all_addl
的函数定义。
一般情况下,如果你在QEMU的源代码中找不到'grep'的函数定义,那么自动生成这样的机会很好 - 搜索函数名的子字符串可能会有所帮助。