"Duplicate option categories" assertion triggered loading an LLVM-project

Hi all,

I am trying to create an out-of-tree LLVM project.

I have written a Test project following the guide in [1] that triggers the problem.

Pass body is in [2].
The CMakeLists.txt file for the “root” directory is in [3]
The CMakeLists.txt file for the “pass” directory is in [4]

When I run opt --load=libTest.so
I trigger the following assertion:

opt: CommandLine.cpp:134: void llvm::cl::OptionCategory::registerCategory(): Assertion `std::count_if(RegisteredOptionCategories->begin(), RegisteredOptionCategories->end(), [this](const OptionCategory *Category) { return getName() == Category->getName(); }) == 0 && “Duplicate option categories”’ failed.

Note that my pass does not even define any command line option.

I am using LLVM 3.5 git fa840e7dfb9115a3ac9891d898e7fe2543c65948
gcc 4.8.1
cmake 2.8.11

Am I doing anything wrong in the project setup ?
Any help is appreciated.


[1] http://llvm.org/docs/CMake.html#embedding-llvm-in-your-project
[2] https://gist.github.com/HariSeldon/9a310312a4e1a0039483#file-test-cpp
[3] https://gist.github.com/HariSeldon/d979d38cf8ee52d9d134#file-cmakelists-txt
[4] https://gist.github.com/HariSeldon/5f60a6bf6b28617593f2#file-cmakelists-txt

Hi Alberto,

See [0], first argument of RegisterPass' constructor is argument name.
Try changing it to something more unique than "test", I guess it might
cause your issue.


[0]: http://www.llvm.org/docs/doxygen/html/structllvm_1_1RegisterPass.html

Hello Sergey,

thanks for the suggestion.

The name of the pass is not what triggers the assertion.

The test case I attached to the email is a stripped-down version of a much more complicated pass
(with a proper name) that originally caused the problem.

Also, to be sure, I just tried to change the name of the pass to something more significant.

It did not work.


Sorry for the wrong suggestion. I built your project and the library is
about 17 MiB as it includes LLVM libraries statically linked to it. opt
has same libraries, same global variables that define command-line
categories, which causes raising of the assertion. If I comment out

    target_link_libraries(Test ${REQ_LLVM_LIBS})

in pass/CMakeLists.txt, so file is about 27 KiB and prints function
names just as expected.


Oh I see now.

Thank you Sergey your suggestion made the trick.