Как запустить модуль pass в LLVM - PullRequest
0 голосов
/ 16 декабря 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 21 декабря 2018

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

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

...