[LLVMdev] r139934 requires (correct?) code organization changes
Garrison Venn
gvenn.cfe.dev at gmail.com
Mon Nov 7 07:18:28 PST 2011
I've tracked down a problem I've been having with llvm code ensconced in shared
libraries that priori to r139934, on OS X 10.7.1-10.7.2 worked fine. Since r139934,
which involves a configure change (and configure.ac), resulting in the default clang
compiler to be used when building clang, and llvm, it seems I can no longer deposit
llvm code involving jit, and IR gen functionality into shared libraries, if the translation
unit containing main also contains such features. For example using the attached
files, place externalVerify.cpp into a dynamic shared library, and build createAndVerifyFunctionTest.cpp
against it. Running it (with asserts on) creates:
Two passes with the same argument (-domtree) attempted to be registered!
UNREACHABLE executed at <root dir>/llvm/include/llvm/Support/PassNameParser.h:73!
Prior to patch r139934 (prior to the default platform's installed clang building clang
and llvm), this example works fine. From a llvm pass internals perspective this is
because PassNameParser::passRegistered(...) tries to add a new option containing
info for a pass; in this case the DominatorTree pass. The state of the system asserts
because a DominatorTree pass option has already been created. This is perplexing since
this means that the atomic compare and swap operation on static var "initialized"
contained in CALL_ONCE_INITIALIZATION(...) did not prevent the pass's associated
initialize""PassOnce(...) function from being invoked more than once. Logically, baring
other knowledge, the only way this can happen is that CALL_ONCE_INITIALIZATION(...)
is instantiated in at least two places. Although I forced the example to exemplify the issue
for the DominatorTree pass, this problem has nothing to do with this pass specifically.
Given that when directly linking the example's createAndVerifyFunctionTest.o with
externalVerify.o, does not manifest the issue, the above means that using a shared
library, with such a main, is the incorrect way to organize such projects. Is this correct?
Should I be now using static libs instead? Please note that the example is NOT
directly registering a pass, in fact up till now, for this example, I've only be able to generate
this pass registration conflict by having the main translation unit include llvm/ExecutionEngine/JIT.h.
As doing the manual svn bijection effort to locate the commit was a slow process, I
thought I would go to the list for help (I have real code which organizes its files with
shared libraries), to short cut to a solution--finding out why a clang (platform dependent?),
built clang/llvm manifests the issue would be another long effort.
My platform's (OS X 10.7.2), default clang is:
Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)
Target: x86_64-apple-darwin11.2.0
Thread model: posix
The clang/llvm I used to build my example is at (r143900)
Thanks in advance
Garrison
-------------- next part --------------
A non-text attachment was scrubbed...
Name: createAndVerifyFunctionTest.cpp
Type: application/octet-stream
Size: 1771 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111107/abd4965d/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: externalVerify.cpp
Type: application/octet-stream
Size: 594 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111107/abd4965d/attachment-0001.obj>
-------------- next part --------------
More information about the llvm-dev
mailing list