Не можете найти определение функций 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 затем #includes файл шаблона.h несколько раз, определяя SHIFT по-разному каждый раз. Это приводит к определениям функций для compute_all_addb, compute_all_addw, compute_all_addl а также compute_all_addq генерируется из одного шаблона.

В общем, если вы не можете найти определение функции в исходном коде QEMU с помощью 'grep', велика вероятность того, что она будет автоматически сгенерирована следующим образом - поиск подстроки имени функции может помочь.

Другие вопросы по тегам