Не можете найти определение функций compute_all_xxx в репозитории QEMU для цели i386?
Я читал исходный код Qemu и удивляюсь, как Qemu эмулирует флаги для процессора x86, в target-i386/cc-helper.c
файл, который я обнаружил, что функции, такие как compute_all_addw
сделать работу, я хочу знать, как Qemu реализует эти функции, но я не могу найти определение всех этих функций. Я что-то пропустил? Помогите, пожалуйста.
1 ответ
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()
это макрос, который просто склеивает свои аргументы. SUFFIX
а также DATA_TYPE
определены ранее в.h файле на основе значения SHIFT
, target-i386/cc_helper.c
затем #include
s файл шаблона.h несколько раз, определяя SHIFT
по-разному каждый раз. Это приводит к определениям функций для compute_all_addb
, compute_all_addw
, compute_all_addl
а также compute_all_addq
генерируется из одного шаблона.
В общем, если вы не можете найти определение функции в исходном коде QEMU с помощью 'grep', велика вероятность того, что она будет автоматически сгенерирована следующим образом - поиск подстроки имени функции может помочь.