Как написать из дерева LLVM LTO Pass? - PullRequest
1 голос
/ 01 мая 2020

Мне известны подобные вопросы здесь и здесь , однако база кода 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, заданный для разделения общих библиотек, загружает только общие объекты на этапе компиляции?

...