Мне известны подобные вопросы здесь и здесь , однако база кода LLVM меняется так быстро, что я здесь, чтобы спросить, изменилось ли положение вещей с тех пор.
Итак, в настоящее время я пытаюсь написать проход вне дерева, который работает на всей программе CFG (отсюда и необходимость объединенного битового кода). Я предпочел бы использовать устаревшую версию PassManager
, а не основанную на Mixin NPM из-за некоторых других предыдущих версий, на которые опирается мой текущий проход.
clang вызывается с этими аргументами:
clang -flto -Xclang -O0 -Xclang -load -Xclang ./mvxaa.so -fuse-ld=gold -o ./tests/target_app $(TARGET_SOURCES)
Будет ли это регистрировать проход как проход LTO (полный)? Эта передача никогда не выполняется.
static void registerGlobalCollectionPass(const PassManagerBuilder &PB,
legacy::PassManagerBase &PM) {
PM.add(new CollectGlobals());
}
static RegisterStandardPasses
RegisterMyPass(PassManagerBuilder::EP_FullLinkTimeOptimizationEarly,
registerGlobalCollectionPass);
Если взглянуть глубже, то кажется, что PassManagerBuilder::addExtensionsToPM
вызывается отдельными функциями populateXPassManager
, и они просматривают список GlobalExtensions
для вызова соответствующих функций обратного вызова. Для других не-LTO ExtensionPointTy
, таких как EP_EnabledOnOptLevel0
, есть записи, но когда вызывается populateLTOPassManager
, больше нет записей в GlobalExtensions
smallvector. Почему это так?
Это потому, что LTO возникает на более позднем этапе после запуска компоновщика, а аргумент -load, заданный для разделения общих библиотек, загружает только общие объекты на этапе компиляции?