[llvm-dev] custom LLVM Pass with options fails to load

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

[llvm-dev] custom LLVM Pass with options fails to load

Zhizhou Yang via llvm-dev
Hi,
I'm working on an LLVM Pass plugin and I'm running into a problem when  
loading it into opt.
I want to have a custom option for my pass and added an llvm::cl::opt  
#include'ing "llvm/Support/CommandLine.h"

linking the dependant libs causes the following error when loading it  
with opt:
opt: CommandLine Error: Option 'debug-pass' registered more than once!

I narrowed it down to the Core lib but without it I get this

opt:  
/home/qwert/projects/ext/repos/llvm/6.0.0/lib/Support/CommandLine.cpp:281:  
void (anonymous  
namespace)::CommandLineParser::registerCategory(llvm::cl::OptionCategory *):  
Assertion `count_if(RegisteredOptionCategories, [cat](const  
OptionCategory *Category) { return cat->getName() ==  
Category->getName(); }) == 0 && "Duplicate option categories"' failed.
LLVMSymbolizer: error reading file: No such file or directory
#0 0x0000000001d8eea4 (opt+0x1d8eea4)
#1 0x0000000001d8f206 (opt+0x1d8f206)
#2 0x00007fb283220390 __restore_rt  
(/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
#3 0x00007fb2821cd428 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x35428)
#4 0x00007fb2821cf02a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a)
#5 0x00007fb2821c5bd7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dbd7)
#6 0x00007fb2821c5c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
#7 0x0000000001d2b2a9 (opt+0x1d2b2a9)
#8 0x00007fb281efebc2 _GLOBAL__sub_I_CommandLine.cpp  
(/home/qwert/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so+0x28bc2)
#9 0x00007fb28343c6ba (/lib64/ld-linux-x86-64.so.2+0x106ba)
#10 0x00007fb28343c7cb (/lib64/ld-linux-x86-64.so.2+0x107cb)
#11 0x00007fb2834418e2 (/lib64/ld-linux-x86-64.so.2+0x158e2)
#12 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
#13 0x00007fb283440da9 (/lib64/ld-linux-x86-64.so.2+0x14da9)
#14 0x00007fb282e03f09 __asprintf (/lib/x86_64-linux-gnu/libdl.so.2+0xf09)
#15 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
#16 0x00007fb282e04571 (/lib/x86_64-linux-gnu/libdl.so.2+0x1571)
#17 0x00007fb282e03fa1 dlopen (/lib/x86_64-linux-gnu/libdl.so.2+0xfa1)
#18 0x0000000001d7b88b (opt+0x1d7b88b)
#19 0x0000000001d44de9 (opt+0x1d44de9)
#20 0x000000000069f0b4 (opt+0x69f0b4)
#21 0x0000000001d35a91 (opt+0x1d35a91)
#22 0x0000000001d2e3b9 (opt+0x1d2e3b9)
#23 0x00000000006958b4 (opt+0x6958b4)
#24 0x00007fb2821b8830 __libc_start_main  
(/lib/x86_64-linux-gnu/libc.so.6+0x20830)
#25 0x0000000000686be9 (opt+0x686be9)
Stack dump:
0. Program arguments: opt -load  
/home/maliusarth/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so  
-testPass test.cpp
Aborted


in my cmakelists.txt I have the following:

set(CMAKE_BUILD_TYPE Debug)

set(LLVM_LINK_COMPONENTS
        Core # narrowed it down to this
        BinaryFormat
        Support
        Demangle
)

add_llvm_loadable_module( TestPass
        TestPass.cpp

        DEPENDS
        intrinsics_gen
        PLUGIN_TOOL
        opt
)

in my cpp I have this:

#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/CommandLine.h"

#include <string>

namespace
{
// Apply a custom category to all command-line options so that they are the
// only ones displayed.
static llvm::cl::OptionCategory testCategory("testPass Options");

static llvm::cl::opt<std::string>
        testOpt("testOpt", llvm::cl::desc("testOpt"),
                   llvm::cl::value_desc("test pass opt"), llvm::cl::cat(testCategory));
}

namespace test
{
char TestPass::ID = 0;

static ::llvm::RegisterPass<test::TestPass>
        X("testPass", "test pass", false /* Only looks at CFG */,
          false /* Analysis Pass */);
}

the rest of the file is more or less straight out of the Hello example.

I'm working with this llvm version  
http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_600/final

I'd appreciate any help on this issue.

Viktor

_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] custom LLVM Pass with options fails to load

Zhizhou Yang via llvm-dev
Hi Viktor,

I believe you shouldn't set LLVM_LINK_COMPONENTS.

You don't need to link your TestPass against anything since opt is expected to have everything loaded already. If you're linking against a statically built LLVM, then this way you'll pull in other definitions of cl::opt'ions, which'll then clash with the ones that are in opt.

Cheers,
Philip

On Tue, Jul 10, 2018 at 3:26 PM Viktor Was via llvm-dev <[hidden email]> wrote:
Hi,
I'm working on an LLVM Pass plugin and I'm running into a problem when 
loading it into opt.
I want to have a custom option for my pass and added an llvm::cl::opt 
#include'ing "llvm/Support/CommandLine.h"

linking the dependant libs causes the following error when loading it 
with opt:
opt: CommandLine Error: Option 'debug-pass' registered more than once!

I narrowed it down to the Core lib but without it I get this

opt: 
/home/qwert/projects/ext/repos/llvm/6.0.0/lib/Support/CommandLine.cpp:281: 
void (anonymous 
namespace)::CommandLineParser::registerCategory(llvm::cl::OptionCategory *): 
Assertion `count_if(RegisteredOptionCategories, [cat](const 
OptionCategory *Category) { return cat->getName() == 
Category->getName(); }) == 0 && "Duplicate option categories"' failed.
LLVMSymbolizer: error reading file: No such file or directory
#0 0x0000000001d8eea4 (opt+0x1d8eea4)
#1 0x0000000001d8f206 (opt+0x1d8f206)
#2 0x00007fb283220390 __restore_rt 
(/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
#3 0x00007fb2821cd428 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x35428)
#4 0x00007fb2821cf02a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a)
#5 0x00007fb2821c5bd7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dbd7)
#6 0x00007fb2821c5c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
#7 0x0000000001d2b2a9 (opt+0x1d2b2a9)
#8 0x00007fb281efebc2 _GLOBAL__sub_I_CommandLine.cpp 
(/home/qwert/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so+0x28bc2)
#9 0x00007fb28343c6ba (/lib64/ld-linux-x86-64.so.2+0x106ba)
#10 0x00007fb28343c7cb (/lib64/ld-linux-x86-64.so.2+0x107cb)
#11 0x00007fb2834418e2 (/lib64/ld-linux-x86-64.so.2+0x158e2)
#12 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
#13 0x00007fb283440da9 (/lib64/ld-linux-x86-64.so.2+0x14da9)
#14 0x00007fb282e03f09 __asprintf (/lib/x86_64-linux-gnu/libdl.so.2+0xf09)
#15 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
#16 0x00007fb282e04571 (/lib/x86_64-linux-gnu/libdl.so.2+0x1571)
#17 0x00007fb282e03fa1 dlopen (/lib/x86_64-linux-gnu/libdl.so.2+0xfa1)
#18 0x0000000001d7b88b (opt+0x1d7b88b)
#19 0x0000000001d44de9 (opt+0x1d44de9)
#20 0x000000000069f0b4 (opt+0x69f0b4)
#21 0x0000000001d35a91 (opt+0x1d35a91)
#22 0x0000000001d2e3b9 (opt+0x1d2e3b9)
#23 0x00000000006958b4 (opt+0x6958b4)
#24 0x00007fb2821b8830 __libc_start_main 
(/lib/x86_64-linux-gnu/libc.so.6+0x20830)
#25 0x0000000000686be9 (opt+0x686be9)
Stack dump:
0.      Program arguments: opt -load 
/home/maliusarth/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so 
-testPass test.cpp
Aborted


in my cmakelists.txt I have the following:

set(CMAKE_BUILD_TYPE Debug)

set(LLVM_LINK_COMPONENTS
        Core # narrowed it down to this
        BinaryFormat
        Support
        Demangle
)

add_llvm_loadable_module( TestPass
        TestPass.cpp

        DEPENDS
        intrinsics_gen
        PLUGIN_TOOL
        opt
)

in my cpp I have this:

#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/CommandLine.h"

#include <string>

namespace
{
// Apply a custom category to all command-line options so that they are the
// only ones displayed.
static llvm::cl::OptionCategory testCategory("testPass Options");

static llvm::cl::opt<std::string>
        testOpt("testOpt", llvm::cl::desc("testOpt"),
                   llvm::cl::value_desc("test pass opt"), llvm::cl::cat(testCategory));
}

namespace test
{
char TestPass::ID = 0;

static ::llvm::RegisterPass<test::TestPass>
        X("testPass", "test pass", false /* Only looks at CFG */,
          false /* Analysis Pass */);
}

the rest of the file is more or less straight out of the Hello example.

I'm working with this llvm version 
http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_600/final

I'd appreciate any help on this issue.

Viktor

_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] custom LLVM Pass with options fails to load

Zhizhou Yang via llvm-dev
Hi Philip,

thanks for the quick answer.
That makes sense, but when leaving the set LLVM_LINK_COMPONENTS out
I get an undefined symbol when loading the plugin:  
_ZTVN4llvm2cl3optINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0ENS0_6parserIS7_EEEE

which boils down to

llvm::cl::opt<std::__cxx11::basic_string<char, std::char_traits<char>,  
std::allocator<char>>, false,  
llvm::cl::parser<std::__cxx11::basic_string<char,  
std::char_traits<char>, std::allocator<char>>>>

aka

llvm::cl::opt<std::string, false, llvm::cl::parser<std::string>>

I guess...

any ideas?

Viktor

Quoting Philip Pfaffe <[hidden email]>:

> Hi Viktor,
>
> I believe you shouldn't set LLVM_LINK_COMPONENTS.
>
> You don't need to link your TestPass against anything since opt is expected
> to have everything loaded already. If you're linking against a statically
> built LLVM, then this way you'll pull in other definitions of cl::opt'ions,
> which'll then clash with the ones that are in opt.
>
> Cheers,
> Philip
>
> On Tue, Jul 10, 2018 at 3:26 PM Viktor Was via llvm-dev <
> [hidden email]> wrote:
>
>> Hi,
>> I'm working on an LLVM Pass plugin and I'm running into a problem when
>> loading it into opt.
>> I want to have a custom option for my pass and added an llvm::cl::opt
>> #include'ing "llvm/Support/CommandLine.h"
>>
>> linking the dependant libs causes the following error when loading it
>> with opt:
>> opt: CommandLine Error: Option 'debug-pass' registered more than once!
>>
>> I narrowed it down to the Core lib but without it I get this
>>
>> opt:
>> /home/qwert/projects/ext/repos/llvm/6.0.0/lib/Support/CommandLine.cpp:281:
>>
>> void (anonymous
>> namespace)::CommandLineParser::registerCategory(llvm::cl::OptionCategory
>> *):
>> Assertion `count_if(RegisteredOptionCategories, [cat](const
>> OptionCategory *Category) { return cat->getName() ==
>> Category->getName(); }) == 0 && "Duplicate option categories"' failed.
>> LLVMSymbolizer: error reading file: No such file or directory
>> #0 0x0000000001d8eea4 (opt+0x1d8eea4)
>> #1 0x0000000001d8f206 (opt+0x1d8f206)
>> #2 0x00007fb283220390 __restore_rt
>> (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
>> #3 0x00007fb2821cd428 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x35428)
>> #4 0x00007fb2821cf02a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a)
>> #5 0x00007fb2821c5bd7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dbd7)
>> #6 0x00007fb2821c5c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
>> #7 0x0000000001d2b2a9 (opt+0x1d2b2a9)
>> #8 0x00007fb281efebc2 _GLOBAL__sub_I_CommandLine.cpp
>>
>> (/home/qwert/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so+0x28bc2)
>> #9 0x00007fb28343c6ba (/lib64/ld-linux-x86-64.so.2+0x106ba)
>> #10 0x00007fb28343c7cb (/lib64/ld-linux-x86-64.so.2+0x107cb)
>> #11 0x00007fb2834418e2 (/lib64/ld-linux-x86-64.so.2+0x158e2)
>> #12 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
>> #13 0x00007fb283440da9 (/lib64/ld-linux-x86-64.so.2+0x14da9)
>> #14 0x00007fb282e03f09 __asprintf (/lib/x86_64-linux-gnu/libdl.so.2+0xf09)
>> #15 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
>> #16 0x00007fb282e04571 (/lib/x86_64-linux-gnu/libdl.so.2+0x1571)
>> #17 0x00007fb282e03fa1 dlopen (/lib/x86_64-linux-gnu/libdl.so.2+0xfa1)
>> #18 0x0000000001d7b88b (opt+0x1d7b88b)
>> #19 0x0000000001d44de9 (opt+0x1d44de9)
>> #20 0x000000000069f0b4 (opt+0x69f0b4)
>> #21 0x0000000001d35a91 (opt+0x1d35a91)
>> #22 0x0000000001d2e3b9 (opt+0x1d2e3b9)
>> #23 0x00000000006958b4 (opt+0x6958b4)
>> #24 0x00007fb2821b8830 __libc_start_main
>> (/lib/x86_64-linux-gnu/libc.so.6+0x20830)
>> #25 0x0000000000686be9 (opt+0x686be9)
>> Stack dump:
>> 0.      Program arguments: opt -load
>> /home/maliusarth/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so
>> -testPass test.cpp
>> Aborted
>>
>>
>> in my cmakelists.txt I have the following:
>>
>> set(CMAKE_BUILD_TYPE Debug)
>>
>> set(LLVM_LINK_COMPONENTS
>>         Core # narrowed it down to this
>>         BinaryFormat
>>         Support
>>         Demangle
>> )
>>
>> add_llvm_loadable_module( TestPass
>>         TestPass.cpp
>>
>>         DEPENDS
>>         intrinsics_gen
>>         PLUGIN_TOOL
>>         opt
>> )
>>
>> in my cpp I have this:
>>
>> #include "llvm/IR/Constants.h"
>> #include "llvm/IR/Function.h"
>> #include "llvm/IR/Module.h"
>> #include "llvm/IR/PassManager.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include "llvm/Support/CommandLine.h"
>>
>> #include <string>
>>
>> namespace
>> {
>> // Apply a custom category to all command-line options so that they are the
>> // only ones displayed.
>> static llvm::cl::OptionCategory testCategory("testPass Options");
>>
>> static llvm::cl::opt<std::string>
>>         testOpt("testOpt", llvm::cl::desc("testOpt"),
>>                    llvm::cl::value_desc("test pass opt"),
>> llvm::cl::cat(testCategory));
>> }
>>
>> namespace test
>> {
>> char TestPass::ID = 0;
>>
>> static ::llvm::RegisterPass<test::TestPass>
>>         X("testPass", "test pass", false /* Only looks at CFG */,
>>           false /* Analysis Pass */);
>> }
>>
>> the rest of the file is more or less straight out of the Hello example.
>>
>> I'm working with this llvm version
>> http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_600/final
>>
>> I'd appreciate any help on this issue.
>>
>> Viktor
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> [hidden email]
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>



_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] custom LLVM Pass with options fails to load

Zhizhou Yang via llvm-dev
No quite, that's the _vtable_ for cl::opt<...>. Are you loading a library that's built with RTTI in an LLVM linked without?

Philip

On Thu, Jul 12, 2018 at 2:20 AM Viktor Was <[hidden email]> wrote:
Hi Philip,

thanks for the quick answer.
That makes sense, but when leaving the set LLVM_LINK_COMPONENTS out
I get an undefined symbol when loading the plugin: 
_ZTVN4llvm2cl3optINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0ENS0_6parserIS7_EEEE

which boils down to

llvm::cl::opt<std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char>>, false, 
llvm::cl::parser<std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char>>>>

aka

llvm::cl::opt<std::string, false, llvm::cl::parser<std::string>>

I guess...

any ideas?

Viktor

Quoting Philip Pfaffe <[hidden email]>:

> Hi Viktor,
>
> I believe you shouldn't set LLVM_LINK_COMPONENTS.
>
> You don't need to link your TestPass against anything since opt is expected
> to have everything loaded already. If you're linking against a statically
> built LLVM, then this way you'll pull in other definitions of cl::opt'ions,
> which'll then clash with the ones that are in opt.
>
> Cheers,
> Philip
>
> On Tue, Jul 10, 2018 at 3:26 PM Viktor Was via llvm-dev <
> [hidden email]> wrote:
>
>> Hi,
>> I'm working on an LLVM Pass plugin and I'm running into a problem when
>> loading it into opt.
>> I want to have a custom option for my pass and added an llvm::cl::opt
>> #include'ing "llvm/Support/CommandLine.h"
>>
>> linking the dependant libs causes the following error when loading it
>> with opt:
>> opt: CommandLine Error: Option 'debug-pass' registered more than once!
>>
>> I narrowed it down to the Core lib but without it I get this
>>
>> opt:
>> /home/qwert/projects/ext/repos/llvm/6.0.0/lib/Support/CommandLine.cpp:281:
>>
>> void (anonymous
>> namespace)::CommandLineParser::registerCategory(llvm::cl::OptionCategory
>> *):
>> Assertion `count_if(RegisteredOptionCategories, [cat](const
>> OptionCategory *Category) { return cat->getName() ==
>> Category->getName(); }) == 0 && "Duplicate option categories"' failed.
>> LLVMSymbolizer: error reading file: No such file or directory
>> #0 0x0000000001d8eea4 (opt+0x1d8eea4)
>> #1 0x0000000001d8f206 (opt+0x1d8f206)
>> #2 0x00007fb283220390 __restore_rt
>> (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
>> #3 0x00007fb2821cd428 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x35428)
>> #4 0x00007fb2821cf02a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a)
>> #5 0x00007fb2821c5bd7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dbd7)
>> #6 0x00007fb2821c5c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
>> #7 0x0000000001d2b2a9 (opt+0x1d2b2a9)
>> #8 0x00007fb281efebc2 _GLOBAL__sub_I_CommandLine.cpp
>>
>> (/home/qwert/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so+0x28bc2)
>> #9 0x00007fb28343c6ba (/lib64/ld-linux-x86-64.so.2+0x106ba)
>> #10 0x00007fb28343c7cb (/lib64/ld-linux-x86-64.so.2+0x107cb)
>> #11 0x00007fb2834418e2 (/lib64/ld-linux-x86-64.so.2+0x158e2)
>> #12 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
>> #13 0x00007fb283440da9 (/lib64/ld-linux-x86-64.so.2+0x14da9)
>> #14 0x00007fb282e03f09 __asprintf (/lib/x86_64-linux-gnu/libdl.so.2+0xf09)
>> #15 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
>> #16 0x00007fb282e04571 (/lib/x86_64-linux-gnu/libdl.so.2+0x1571)
>> #17 0x00007fb282e03fa1 dlopen (/lib/x86_64-linux-gnu/libdl.so.2+0xfa1)
>> #18 0x0000000001d7b88b (opt+0x1d7b88b)
>> #19 0x0000000001d44de9 (opt+0x1d44de9)
>> #20 0x000000000069f0b4 (opt+0x69f0b4)
>> #21 0x0000000001d35a91 (opt+0x1d35a91)
>> #22 0x0000000001d2e3b9 (opt+0x1d2e3b9)
>> #23 0x00000000006958b4 (opt+0x6958b4)
>> #24 0x00007fb2821b8830 __libc_start_main
>> (/lib/x86_64-linux-gnu/libc.so.6+0x20830)
>> #25 0x0000000000686be9 (opt+0x686be9)
>> Stack dump:
>> 0.      Program arguments: opt -load
>> /home/maliusarth/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so
>> -testPass test.cpp
>> Aborted
>>
>>
>> in my cmakelists.txt I have the following:
>>
>> set(CMAKE_BUILD_TYPE Debug)
>>
>> set(LLVM_LINK_COMPONENTS
>>         Core # narrowed it down to this
>>         BinaryFormat
>>         Support
>>         Demangle
>> )
>>
>> add_llvm_loadable_module( TestPass
>>         TestPass.cpp
>>
>>         DEPENDS
>>         intrinsics_gen
>>         PLUGIN_TOOL
>>         opt
>> )
>>
>> in my cpp I have this:
>>
>> #include "llvm/IR/Constants.h"
>> #include "llvm/IR/Function.h"
>> #include "llvm/IR/Module.h"
>> #include "llvm/IR/PassManager.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include "llvm/Support/CommandLine.h"
>>
>> #include <string>
>>
>> namespace
>> {
>> // Apply a custom category to all command-line options so that they are the
>> // only ones displayed.
>> static llvm::cl::OptionCategory testCategory("testPass Options");
>>
>> static llvm::cl::opt<std::string>
>>         testOpt("testOpt", llvm::cl::desc("testOpt"),
>>                    llvm::cl::value_desc("test pass opt"),
>> llvm::cl::cat(testCategory));
>> }
>>
>> namespace test
>> {
>> char TestPass::ID = 0;
>>
>> static ::llvm::RegisterPass<test::TestPass>
>>         X("testPass", "test pass", false /* Only looks at CFG */,
>>           false /* Analysis Pass */);
>> }
>>
>> the rest of the file is more or less straight out of the Hello example.
>>
>> I'm working with this llvm version
>> http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_600/final
>>
>> I'd appreciate any help on this issue.
>>
>> Viktor
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> [hidden email]
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>




_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] custom LLVM Pass with options fails to load

Zhizhou Yang via llvm-dev

I'm building the plugin from inside the LLVM directory structure (LLVMBuild?).
I haven't changed any compile options and looking into the build.ninja the flags for my plugin files match the flags of other files with -fno-rtti being set.
So that's not it, unfortunately.

Viktor

Quoting Philip Pfaffe <[hidden email]>:

> No quite, that's the _vtable_ for cl::opt<...>. Are you loading a library
> that's built with RTTI in an LLVM linked without?
>
> Philip
>
> On Thu, Jul 12, 2018 at 2:20 AM Viktor Was <[hidden email]>
> wrote:
>
>> Hi Philip,
>>
>> thanks for the quick answer.
>> That makes sense, but when leaving the set LLVM_LINK_COMPONENTS out
>> I get an undefined symbol when loading the plugin:
>>
>> _ZTVN4llvm2cl3optINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0ENS0_6parserIS7_EEEE
>>
>> which boils down to
>>
>> llvm::cl::opt<std::__cxx11::basic_string<char, std::char_traits<char>,
>> std::allocator<char>>, false,
>> llvm::cl::parser<std::__cxx11::basic_string<char,
>> std::char_traits<char>, std::allocator<char>>>>
>>
>> aka
>>
>> llvm::cl::opt<std::string, false, llvm::cl::parser<std::string>>
>>
>> I guess...
>>
>> any ideas?
>>
>> Viktor
>>
>> Quoting Philip Pfaffe <[hidden email]>:
>>
>> > Hi Viktor,
>> >
>> > I believe you shouldn't set LLVM_LINK_COMPONENTS.
>> >
>> > You don't need to link your TestPass against anything since opt is
>> expected
>> > to have everything loaded already. If you're linking against a statically
>> > built LLVM, then this way you'll pull in other definitions of
>> cl::opt'ions,
>> > which'll then clash with the ones that are in opt.
>> >
>> > Cheers,
>> > Philip
>> >
>> > On Tue, Jul 10, 2018 at 3:26 PM Viktor Was via llvm-dev <
>> > [hidden email]> wrote:
>> >
>> >> Hi,
>> >> I'm working on an LLVM Pass plugin and I'm running into a problem when
>> >> loading it into opt.
>> >> I want to have a custom option for my pass and added an llvm::cl::opt
>> >> #include'ing "llvm/Support/CommandLine.h"
>> >>
>> >> linking the dependant libs causes the following error when loading it
>> >> with opt:
>> >> opt: CommandLine Error: Option 'debug-pass' registered more than once!
>> >>
>> >> I narrowed it down to the Core lib but without it I get this
>> >>
>> >> opt:
>> >>
>> /home/qwert/projects/ext/repos/llvm/6.0.0/lib/Support/CommandLine.cpp:281:
>> >>
>> >> void (anonymous
>> >> namespace)::CommandLineParser::registerCategory(llvm::cl::OptionCategory
>> >> *):
>> >> Assertion `count_if(RegisteredOptionCategories, [cat](const
>> >> OptionCategory *Category) { return cat->getName() ==
>> >> Category->getName(); }) == 0 && "Duplicate option categories"' failed.
>> >> LLVMSymbolizer: error reading file: No such file or directory
>> >> #0 0x0000000001d8eea4 (opt+0x1d8eea4)
>> >> #1 0x0000000001d8f206 (opt+0x1d8f206)
>> >> #2 0x00007fb283220390 __restore_rt
>> >> (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
>> >> #3 0x00007fb2821cd428 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x35428)
>> >> #4 0x00007fb2821cf02a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a)
>> >> #5 0x00007fb2821c5bd7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dbd7)
>> >> #6 0x00007fb2821c5c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
>> >> #7 0x0000000001d2b2a9 (opt+0x1d2b2a9)
>> >> #8 0x00007fb281efebc2 _GLOBAL__sub_I_CommandLine.cpp
>> >>
>> >>
>> (/home/qwert/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so+0x28bc2)
>> >> #9 0x00007fb28343c6ba (/lib64/ld-linux-x86-64.so.2+0x106ba)
>> >> #10 0x00007fb28343c7cb (/lib64/ld-linux-x86-64.so.2+0x107cb)
>> >> #11 0x00007fb2834418e2 (/lib64/ld-linux-x86-64.so.2+0x158e2)
>> >> #12 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
>> >> #13 0x00007fb283440da9 (/lib64/ld-linux-x86-64.so.2+0x14da9)
>> >> #14 0x00007fb282e03f09 __asprintf
>> (/lib/x86_64-linux-gnu/libdl.so.2+0xf09)
>> >> #15 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
>> >> #16 0x00007fb282e04571 (/lib/x86_64-linux-gnu/libdl.so.2+0x1571)
>> >> #17 0x00007fb282e03fa1 dlopen (/lib/x86_64-linux-gnu/libdl.so.2+0xfa1)
>> >> #18 0x0000000001d7b88b (opt+0x1d7b88b)
>> >> #19 0x0000000001d44de9 (opt+0x1d44de9)
>> >> #20 0x000000000069f0b4 (opt+0x69f0b4)
>> >> #21 0x0000000001d35a91 (opt+0x1d35a91)
>> >> #22 0x0000000001d2e3b9 (opt+0x1d2e3b9)
>> >> #23 0x00000000006958b4 (opt+0x6958b4)
>> >> #24 0x00007fb2821b8830 __libc_start_main
>> >> (/lib/x86_64-linux-gnu/libc.so.6+0x20830)
>> >> #25 0x0000000000686be9 (opt+0x686be9)
>> >> Stack dump:
>> >> 0.      Program arguments: opt -load
>> >> /home/maliusarth/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so
>> >> -testPass test.cpp
>> >> Aborted
>> >>
>> >>
>> >> in my cmakelists.txt I have the following:
>> >>
>> >> set(CMAKE_BUILD_TYPE Debug)
>> >>
>> >> set(LLVM_LINK_COMPONENTS
>> >>         Core # narrowed it down to this
>> >>         BinaryFormat
>> >>         Support
>> >>         Demangle
>> >> )
>> >>
>> >> add_llvm_loadable_module( TestPass
>> >>         TestPass.cpp
>> >>
>> >>         DEPENDS
>> >>         intrinsics_gen
>> >>         PLUGIN_TOOL
>> >>         opt
>> >> )
>> >>
>> >> in my cpp I have this:
>> >>
>> >> #include "llvm/IR/Constants.h"
>> >> #include "llvm/IR/Function.h"
>> >> #include "llvm/IR/Module.h"
>> >> #include "llvm/IR/PassManager.h"
>> >> #include "llvm/Support/raw_ostream.h"
>> >> #include "llvm/Support/CommandLine.h"
>> >>
>> >> #include <string>
>> >>
>> >> namespace
>> >> {
>> >> // Apply a custom category to all command-line options so that they are
>> the
>> >> // only ones displayed.
>> >> static llvm::cl::OptionCategory testCategory("testPass Options");
>> >>
>> >> static llvm::cl::opt<std::string>
>> >>         testOpt("testOpt", llvm::cl::desc("testOpt"),
>> >>                    llvm::cl::value_desc("test pass opt"),
>> >> llvm::cl::cat(testCategory));
>> >> }
>> >>
>> >> namespace test
>> >> {
>> >> char TestPass::ID = 0;
>> >>
>> >> static ::llvm::RegisterPass<test::TestPass>
>> >>         X("testPass", "test pass", false /* Only looks at CFG */,
>> >>           false /* Analysis Pass */);
>> >> }
>> >>
>> >> the rest of the file is more or less straight out of the Hello example.
>> >>
>> >> I'm working with this llvm version
>> >> http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_600/final
>> >>
>> >> I'd appreciate any help on this issue.
>> >>
>> >> Viktor
>> >>
>> >> _______________________________________________
>> >> LLVM Developers mailing list
>> >> [hidden email]
>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> >>
>>
>>
>>
>>


_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] custom LLVM Pass with options fails to load

Zhizhou Yang via llvm-dev
I don't know your setup, but the error message is unambiguous. You're linking/loading a binary _with_ rtti into a context _without_.

Cheers,
Philip

On Thu, Jul 12, 2018 at 2:55 PM Viktor Was <[hidden email]> wrote:

I'm building the plugin from inside the LLVM directory structure (LLVMBuild?).
I haven't changed any compile options and looking into the build.ninja the flags for my plugin files match the flags of other files with -fno-rtti being set.
So that's not it, unfortunately.

Viktor

Quoting Philip Pfaffe <[hidden email]>:

> No quite, that's the _vtable_ for cl::opt<...>. Are you loading a library
> that's built with RTTI in an LLVM linked without?
>
> Philip
>
> On Thu, Jul 12, 2018 at 2:20 AM Viktor Was <[hidden email]>
> wrote:
>
>> Hi Philip,
>>
>> thanks for the quick answer.
>> That makes sense, but when leaving the set LLVM_LINK_COMPONENTS out
>> I get an undefined symbol when loading the plugin:
>>
>> _ZTVN4llvm2cl3optINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0ENS0_6parserIS7_EEEE
>>
>> which boils down to
>>
>> llvm::cl::opt<std::__cxx11::basic_string<char, std::char_traits<char>,
>> std::allocator<char>>, false,
>> llvm::cl::parser<std::__cxx11::basic_string<char,
>> std::char_traits<char>, std::allocator<char>>>>
>>
>> aka
>>
>> llvm::cl::opt<std::string, false, llvm::cl::parser<std::string>>
>>
>> I guess...
>>
>> any ideas?
>>
>> Viktor
>>
>> Quoting Philip Pfaffe <[hidden email]>:
>>
>> > Hi Viktor,
>> >
>> > I believe you shouldn't set LLVM_LINK_COMPONENTS.
>> >
>> > You don't need to link your TestPass against anything since opt is
>> expected
>> > to have everything loaded already. If you're linking against a statically
>> > built LLVM, then this way you'll pull in other definitions of
>> cl::opt'ions,
>> > which'll then clash with the ones that are in opt.
>> >
>> > Cheers,
>> > Philip
>> >
>> > On Tue, Jul 10, 2018 at 3:26 PM Viktor Was via llvm-dev <
>> > [hidden email]> wrote:
>> >
>> >> Hi,
>> >> I'm working on an LLVM Pass plugin and I'm running into a problem when
>> >> loading it into opt.
>> >> I want to have a custom option for my pass and added an llvm::cl::opt
>> >> #include'ing "llvm/Support/CommandLine.h"
>> >>
>> >> linking the dependant libs causes the following error when loading it
>> >> with opt:
>> >> opt: CommandLine Error: Option 'debug-pass' registered more than once!
>> >>
>> >> I narrowed it down to the Core lib but without it I get this
>> >>
>> >> opt:
>> >>
>> /home/qwert/projects/ext/repos/llvm/6.0.0/lib/Support/CommandLine.cpp:281:
>> >>
>> >> void (anonymous
>> >> namespace)::CommandLineParser::registerCategory(llvm::cl::OptionCategory
>> >> *):
>> >> Assertion `count_if(RegisteredOptionCategories, [cat](const
>> >> OptionCategory *Category) { return cat->getName() ==
>> >> Category->getName(); }) == 0 && "Duplicate option categories"' failed.
>> >> LLVMSymbolizer: error reading file: No such file or directory
>> >> #0 0x0000000001d8eea4 (opt+0x1d8eea4)
>> >> #1 0x0000000001d8f206 (opt+0x1d8f206)
>> >> #2 0x00007fb283220390 __restore_rt
>> >> (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
>> >> #3 0x00007fb2821cd428 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x35428)
>> >> #4 0x00007fb2821cf02a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a)
>> >> #5 0x00007fb2821c5bd7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dbd7)
>> >> #6 0x00007fb2821c5c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82)
>> >> #7 0x0000000001d2b2a9 (opt+0x1d2b2a9)
>> >> #8 0x00007fb281efebc2 _GLOBAL__sub_I_CommandLine.cpp
>> >>
>> >>
>> (/home/qwert/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so+0x28bc2)
>> >> #9 0x00007fb28343c6ba (/lib64/ld-linux-x86-64.so.2+0x106ba)
>> >> #10 0x00007fb28343c7cb (/lib64/ld-linux-x86-64.so.2+0x107cb)
>> >> #11 0x00007fb2834418e2 (/lib64/ld-linux-x86-64.so.2+0x158e2)
>> >> #12 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
>> >> #13 0x00007fb283440da9 (/lib64/ld-linux-x86-64.so.2+0x14da9)
>> >> #14 0x00007fb282e03f09 __asprintf
>> (/lib/x86_64-linux-gnu/libdl.so.2+0xf09)
>> >> #15 0x00007fb28343c564 (/lib64/ld-linux-x86-64.so.2+0x10564)
>> >> #16 0x00007fb282e04571 (/lib/x86_64-linux-gnu/libdl.so.2+0x1571)
>> >> #17 0x00007fb282e03fa1 dlopen (/lib/x86_64-linux-gnu/libdl.so.2+0xfa1)
>> >> #18 0x0000000001d7b88b (opt+0x1d7b88b)
>> >> #19 0x0000000001d44de9 (opt+0x1d44de9)
>> >> #20 0x000000000069f0b4 (opt+0x69f0b4)
>> >> #21 0x0000000001d35a91 (opt+0x1d35a91)
>> >> #22 0x0000000001d2e3b9 (opt+0x1d2e3b9)
>> >> #23 0x00000000006958b4 (opt+0x6958b4)
>> >> #24 0x00007fb2821b8830 __libc_start_main
>> >> (/lib/x86_64-linux-gnu/libc.so.6+0x20830)
>> >> #25 0x0000000000686be9 (opt+0x686be9)
>> >> Stack dump:
>> >> 0.      Program arguments: opt -load
>> >> /home/maliusarth/projects/ext/projects/cmake/llvm/6.0.0/lib/TestPass.so
>> >> -testPass test.cpp
>> >> Aborted
>> >>
>> >>
>> >> in my cmakelists.txt I have the following:
>> >>
>> >> set(CMAKE_BUILD_TYPE Debug)
>> >>
>> >> set(LLVM_LINK_COMPONENTS
>> >>         Core # narrowed it down to this
>> >>         BinaryFormat
>> >>         Support
>> >>         Demangle
>> >> )
>> >>
>> >> add_llvm_loadable_module( TestPass
>> >>         TestPass.cpp
>> >>
>> >>         DEPENDS
>> >>         intrinsics_gen
>> >>         PLUGIN_TOOL
>> >>         opt
>> >> )
>> >>
>> >> in my cpp I have this:
>> >>
>> >> #include "llvm/IR/Constants.h"
>> >> #include "llvm/IR/Function.h"
>> >> #include "llvm/IR/Module.h"
>> >> #include "llvm/IR/PassManager.h"
>> >> #include "llvm/Support/raw_ostream.h"
>> >> #include "llvm/Support/CommandLine.h"
>> >>
>> >> #include <string>
>> >>
>> >> namespace
>> >> {
>> >> // Apply a custom category to all command-line options so that they are
>> the
>> >> // only ones displayed.
>> >> static llvm::cl::OptionCategory testCategory("testPass Options");
>> >>
>> >> static llvm::cl::opt<std::string>
>> >>         testOpt("testOpt", llvm::cl::desc("testOpt"),
>> >>                    llvm::cl::value_desc("test pass opt"),
>> >> llvm::cl::cat(testCategory));
>> >> }
>> >>
>> >> namespace test
>> >> {
>> >> char TestPass::ID = 0;
>> >>
>> >> static ::llvm::RegisterPass<test::TestPass>
>> >>         X("testPass", "test pass", false /* Only looks at CFG */,
>> >>           false /* Analysis Pass */);
>> >> }
>> >>
>> >> the rest of the file is more or less straight out of the Hello example.
>> >>
>> >> I'm working with this llvm version
>> >> http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_600/final
>> >>
>> >> I'd appreciate any help on this issue.
>> >>
>> >> Viktor
>> >>
>> >> _______________________________________________
>> >> LLVM Developers mailing list
>> >> [hidden email]
>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> >>
>>
>>
>>
>>


_______________________________________________
LLVM Developers mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev