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

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

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

Спасибо


person dzan    schedule 06.10.2015    source источник


Ответы (1)


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

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

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

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

person jtv    schedule 06.10.2015
comment
Привет, спасибо за ваш ответ! Извините, я по ошибке написал "внутри", но я имел в виду "интер". Мне нужно полное представление программы для моего прохода, потому что я хочу делать некоторые вещи последовательно в разных TU, а также иметь окончательное представление о том, что объявлено в коде, а не в библиотеках. Я действительно думаю, что мне нужен проход LTO, до сих пор я тестировал свой код, вручную компилируя в IR и связывая модули в 1, но в идеале я хочу предоставить плагин компилятора. (Я отредактировал свой вопрос, чтобы использовать правильный термин.) - person dzan; 07.10.2015
comment
Вполне возможно использовать ваш external проход для эмуляции LTO, но не в том смысле, на который, я думаю, вы надеетесь. Вы можете просто передать -emit-llvm в clang и заставить его выводить IR-файл, с которым вы теперь можете работать вручную. Это позволит вам запустить проход с opt на консолидированном коде. - person jtv; 07.10.2015
comment
Я понимаю, что это возможно, но это не то, что я хочу. Я должен быть совместим с существующими процессами сборки. Я поспрашивал дальше, и, видимо, это невозможно, вероятно, это будет после того, как новый PassManager будет сделан по умолчанию. Даже тогда это все равно не будет работать для старых наборов инструментов. - person dzan; 09.10.2015