最終的な実行可能バイナリを生成せずに、LLVM ビットコードを最適化しようとしています。すべてのプロジェクトビットコードをリンクします。このテストでは、ビットコードにメイン関数はありませんが、LLVM は他の関数をインターナライズするためにモジュール内のメイン関数を見つける必要があります。プログラムのエントリポイントとしてメイン関数を探す代わりに、パスまたはパスマネージャーを変更するにはどうすればよいですか? 、私の特別な関数は foo1 のように見えますが、foo1 にメイン関数のルールがあるとしますか?
1 に答える
No, LLVM doesn't "look for main", it acts according to the linkage types of functions in your LLVM IR files.
The default linkage type is external
meaning that the function may be required from some other object that hasn't been linked yet. The linker will not remove or internalize such functions, and it won't remove functions they call (unless inlined...). But if a function has internal
or private
linkage, it can be internalized or even removed if not called from other externally visible functions.
Update: As Oak points out in the comments, when the LLVM internalize pass is run in the default way, it indeed preserves main
. However, you can control it by running the internalize pass on your own, passing it a list of symbols to preserve.
- If you need link-time optimizations, call
PassManagerBuilder::populatePassManager
withInternalize
set to false. - Add your own
InternalizePass
, with just the symbols you need.
This is already done in another place in the code base, in LTOCodeGenerator.cpp
. Look at the comment in LTOCodeGenerator::generateObjectFile
:
// Enabling internalize here would use its AllButMain variant. It
// keeps only main if it exists and does nothing for libraries. Instead
// we create the pass ourselves with the symbol list provided by the linker.
if (!DisableOpt) {
PassManagerBuilder().populateLTOPassManager(passes,
/*Internalize=*/false,
!DisableInline,
DisableGVNLoadPRE);
}