I'm writing a Pass that I would like to remain loadable by opt. The
pass also requires DominatorTree(for PromoteMemToReg).
Looking for examples the only way I found to require a dependecny is
by doing something like this:
char Hello::ID = 0;
namespace llvm { void initializeHelloPass(llvm::PassRegistry&); }
INITIALIZE_PASS_BEGIN(Hello, "hello", "Hello World
Pass", false, true)
INITIALIZE_PASS_DEPENDENCY(DominatorTree)
INITIALIZE_PASS_END(Hello, "hello", "Hello World
Pass", false, true)
Unfortunately this gives me(when I try to run it).
opt: Unknown command line argument '-hello'.
If I instead using RegisterPass like in the guide the Pass is loaded
fine, a assert is just tripped for not having DominatorTree info. I
can not seem to mix these 2 ways together or find anything trying todo
the same.
How should this be done?
Thank you
On 11/08/2011 03:20 AM, ret val wrote:> I'm writing a Pass that I would like to remain loadable by opt. The > pass also requires DominatorTree(for PromoteMemToReg). > > Looking for examples the only way I found to require a dependecny is > by doing something like this: > char Hello::ID = 0; > namespace llvm { void initializeHelloPass(llvm::PassRegistry&); } > INITIALIZE_PASS_BEGIN(Hello, "hello", "Hello World Pass", false, true) > INITIALIZE_PASS_DEPENDENCY(DominatorTree) > INITIALIZE_PASS_END(Hello, "hello", "Hello World Pass", false, true) > > Unfortunately this gives me(when I try to run it). > opt: Unknown command line argument '-hello'. > > If I instead using RegisterPass like in the guide the Pass is loaded > fine, a assert is just tripped for not having DominatorTree info. I > can not seem to mix these 2 ways together or find anything trying todo > the same. > > How should this be done?Hi, you can have a look at the approach taken in Polly [1]. Here the relevant file in the git repository: http://repo.or.cz/w/polly-mirror.git/blob/HEAD:/lib/RegisterPasses.cpp Basically we created a class polly::StaticInitializer which initializes in its constructor all passes in the external library (in our case Polly). To make sure the constructor is called when loading the library, we create a global instance of the static initializer. I am not sure if this is the recommended way, but at least it works for us. If there any comments on how to improve this, please let me know. Cheers Tobi [1] http://polly.grosser.es/
I'm confused by your code. StaticInitializer seems to exist so you can
create InitializeEverything, which doesn't get used.
Do I need to do something along the lines of:
static void registerPollyPasses(const llvm::PassManagerBuilder
&Builder,
llvm::PassManagerBase &PM) {
PM.add(llvm::createPromoteMemoryToRegisterPass());
// create my own createHelloPass() method?
}
static llvm::RegisterStandardPasses
PassRegister(llvm::PassManagerBuilder::EP_EarlyAsPossible,
registerPollyPasses);
I'm not sure how to code a possible createHelloPass, as the
constructor for my class takes a argument(ID for ModulePass).
Thanks
On Tue, Nov 8, 2011 at 4:10 AM, Tobias Grosser <tobias at grosser.es>
wrote:> On 11/08/2011 03:20 AM, ret val wrote:
>>
>> I'm writing a Pass that I would like to remain loadable by opt. The
>> pass also requires DominatorTree(for PromoteMemToReg).
>>
>> Looking for examples the only way I found to require a dependecny is
>> by doing something like this:
>> char Hello::ID = 0;
>> namespace llvm { void
initializeHelloPass(llvm::PassRegistry&); }
>> INITIALIZE_PASS_BEGIN(Hello, "hello", "Hello
World Pass", false,
>> true)
>> INITIALIZE_PASS_DEPENDENCY(DominatorTree)
>> INITIALIZE_PASS_END(Hello, "hello", "Hello World
Pass", false,
>> true)
>>
>> Unfortunately this gives me(when I try to run it).
>> opt: Unknown command line argument '-hello'.
>>
>> If I instead using RegisterPass like in the guide the Pass is loaded
>> fine, a assert is just tripped for not having DominatorTree info. I
>> can not seem to mix these 2 ways together or find anything trying todo
>> the same.
>>
>> How should this be done?
>
> Hi,
>
> you can have a look at the approach taken in Polly [1]. Here the relevant
> file in the git repository:
>
> http://repo.or.cz/w/polly-mirror.git/blob/HEAD:/lib/RegisterPasses.cpp
>
> Basically we created a class polly::StaticInitializer which initializes in
> its constructor all passes in the external library (in our case Polly). To
> make sure the constructor is called when loading
> the library, we create a global instance of the static initializer.
>
> I am not sure if this is the recommended way, but at least it works for us.
> If there any comments on how to improve this, please let me know.
>
> Cheers
> Tobi
>
> [1] http://polly.grosser.es/
>