Running opt passes via Clang on OSX dlclose segfault issue

Hello,

I would like to be able to run the LLVMHello pass (modified to be registered as a standard pass) via clang on OSX, but I am not able to do so because during llvm_shutdown there is a segfault.

I have traced the issue to the fact that in the StaticList (ManagedStatic.cpp) cleanup dlclose gets called on the library followed by the destructor for the std::function stored in the GlobalExtensions (PassManagerBuilder.h) vector, leading to a bad access since the library has been unloaded. On Linux this can be worked around by linking with -znodelete, but on OSX, as far as I can tell, there is not an equivalent linker flag.

The easiest solution I was able to come up with, but that likely isn’t acceptable, is to just pass RTLD_NODELETE to the dlopen arguments in DynamicLibrary.inc.

I am willing to fix this and submit a patch if the work required is not too large, but first I want to see what the general opinion on this issue is and get some guidance on what an acceptable fix would be.

-Cannada Lewis

I think that similar issue is being discussed here:

https://github.com/sampsyo/llvm-pass-skeleton/issues/7

I've experienced similar problem when trying to register a pass using
this extension point:

  llvm::PassManagerBuilder::EP_EarlyAsPossible

I've only tested with 'opt' and noticed that it only seg-faults when
using pre-build packages (checked with LLVM 8), but is fine when
building LLVM from sources.

I haven't had the time to dive deeper.

-Andrzej