We have been investigating an issue when running LTO with our proprietary linker, which links against libLTO dynamically. The issue is that when we pass -time-passes via the lto_codegen_debug_options function in the LTO C API, no time information is produced during compilation. The reason for this is that time information is stored in state owned by a ManagedStatic instance, and is only printed when the state is destroyed. This in turn only happens when ManagedStatics are cleaned up, via the llvm_shutdown function. As we do not link against LLVM (except libLTO dynamically), we have no access to llvm_shutdown, which in turn means we are not able to clean up ManagedStatic instances and thus no timing information is produced.
We have considered a few options and have come up with the following suggestions, and would appreciate some feedback:
Add llvm_shutdown (or rather likely some wrapper function that does the same job) to the C interface of libLTO. This should be called when we are done with the library.
Add a “full-shutdown” command-line option to LLVM - that can be passed via lto_codegen_debug_options - which causes ManagedStatic-owned state to be destroyed on shutdown. This could even be more widely useful outside the LTO case.
Call llvm_shutdown() immediately after compilation as part of the compile function.
None of the above, because there’s a better way that I am unaware of to clean up this state.
I have a marginal preference for 1), but does anybody have any other preferences or suggestions?