Возможность плагина LLVM LTO Pass?

Мне было интересно, возможно ли в настоящее время провести "внешний" (.so/.dylib) плагин (модуль) LLVM, запланированный на время LTO? Причина, по которой я хочу этого, - это интермодульная оптимизация, которую я хочу добавить.

Я также нашел эту тему; Как написать пользовательский межмодульный проход в LLVM? Но отдельный инструмент не вариант для меня.

Спасибо

1 ответ

Решение

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

Прежде всего, когда этапы оптимизации выполняются компилятором, они выполняются как набор, который был добавлен в PassManager, Это означает, что LLVM/Clang, когда прошло что-то вроде -O3 создаст копию PassManager и впоследствии предоставить ему набор пропусков, которые предполагается предоставить O3 уровень оптимизации. Это сильно отличается от того, что вы делаете с внешней библиотекой, которую необходимо предоставить вручную и которую нельзя нормально вписать в проходной конвейер.

Тогда у нас есть положение вещей при выполнении LTO. Во время оптимизации времени соединения все отдельные единицы перевода были объединены и теперь являются единым Module, Это означает, что оптимизация, которая выполняется для каждой функции, будет выполняться для каждой функции в базе кода. Аналогично, оптимизация для каждого модуля будет выполняться на полную Module и для этого предлагаем межпроцедурный анализ / оптимизацию.

Если вы хотите использовать Intra-Modular Pass, то нет причин делать это во время LTO, и вместо этого вы можете просто сделать ModulePass и запустить это на каждом блоке.

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