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/ >