Как запустить проход модуля в LLVM

Я пытаюсь найти способ оптимизировать пустые глобальные конструкторы. Предыдущие оптимизации превратили конструкторы в функции, которые ничего не делают. Мне нужно добавить новый проход, чтобы удалить эти функции из llvm.global_ctors.

Во-первых, я попробовал optimizeGlobalCtorsList, но эта функция на самом деле не вызывает обратный вызов, который я ей даю, хотя llvm.global_ctors заполнен.

Затем я попытался запустить GlobalOptPass. Я пробовал это:

llvm::GlobalOptPass pass;
llvm::ModuleAnalysisManager MAM{true};
pass.run(module, MAM);

Это заканчивается разыменованием нулевого указателя в AnalysisManager::lookupPass. Я думаю, мне нужно выполнить какую-то инициализацию или регистрацию, но я не знаю, как это сделать. Все ссылки на «регистрацию пропуска llvm» говорят о регистрации пропуска с помощью opt. Я не хочу этого делать. Я просто хочу пройти мимо.


person Indiana Kernick    schedule 16.12.2018    source источник


Ответы (1)


Посмотрите в lib/Transforms/IPO/PassManagerBuilder.cpp (или lib/Passes/PassBuilder.cpp для нового диспетчера проходов), чтобы увидеть, как opt настраивает свой конвейер проходов. Код для opt находится в tools/opt/opt.cpp и очень мал, почти вся его работа делегирована основным библиотекам.

Вы можете использовать opt в качестве шаблона для своего собственного инструмента или взломать конвейер создания пропусков, чтобы вставить свой пропуск туда, куда вы хотите.

person David Greene    schedule 21.12.2018