Возможность плагина LLVM LTO Pass?
Мне было интересно, возможно ли в настоящее время провести "внешний" (.so/.dylib) плагин (модуль) LLVM, запланированный на время LTO? Причина, по которой я хочу этого, - это интермодульная оптимизация, которую я хочу добавить.
Я также нашел эту тему; Как написать пользовательский межмодульный проход в LLVM? Но отдельный инструмент не вариант для меня.
Спасибо
1 ответ
Я думаю, что наиболее полезным здесь может быть понимание того, как выполняются проходы и каково состояние кода во время LTO.
Прежде всего, когда этапы оптимизации выполняются компилятором, они выполняются как набор, который был добавлен в PassManager
, Это означает, что LLVM/Clang
, когда прошло что-то вроде -O3
создаст копию PassManager
и впоследствии предоставить ему набор пропусков, которые предполагается предоставить O3
уровень оптимизации. Это сильно отличается от того, что вы делаете с внешней библиотекой, которую необходимо предоставить вручную и которую нельзя нормально вписать в проходной конвейер.
Тогда у нас есть положение вещей при выполнении LTO. Во время оптимизации времени соединения все отдельные единицы перевода были объединены и теперь являются единым Module
, Это означает, что оптимизация, которая выполняется для каждой функции, будет выполняться для каждой функции в базе кода. Аналогично, оптимизация для каждого модуля будет выполняться на полную Module
и для этого предлагаем межпроцедурный анализ / оптимизацию.
Если вы хотите использовать Intra-Modular Pass, то нет причин делать это во время LTO, и вместо этого вы можете просто сделать ModulePass
и запустить это на каждом блоке.