[LLVMdev] loadable passes with dependencies?
Tobias Grosser
tobias at grosser.es
Tue Nov 8 07:18:29 PST 2011
On 11/08/2011 03:40 PM, ret val wrote:
> 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).
This is the code interesting to you:
66 void initializePollyPasses(PassRegistry &Registry) {
67 initializeCloogInfoPass(Registry);
68 initializeCodeGenerationPass(Registry);
69 initializeCodePreparationPass(Registry);
70 initializeDependencesPass(Registry);
71 initializeIndependentBlocksPass(Registry);
72 initializeIslScheduleOptimizerPass(Registry);
73 #ifdef SCOPLIB_FOUND
74 initializePoccPass(Registry);
75 #endif
76 initializeRegionSimplifyPass(Registry);
77 initializeScopDetectionPass(Registry);
78 initializeScopInfoPass(Registry);
79 initializeTempScopInfoPass(Registry);
80 }
81
82 // Statically register all Polly passes such that they are available
after
83 // loading Polly.
84 class StaticInitializer {
85
86 public:
87 StaticInitializer() {
88 PassRegistry &Registry = *PassRegistry::getPassRegistry();
89 initializePollyPasses(Registry);
90 }
91 };
92
93 static StaticInitializer InitializeEverything;
For your example, the INITIALIZE_PASS_ macros create for your Hello pass
a function initializeHelloPass(PassRegistry &). This function
initializes your pass and all dependent passes. It needs to be called
before your pass is scheduled.
To achieve this we create a class StaticInitializer, which does this in
its constructor. It get's the global pass registry and uses the pass
registry as a parameter for the intialize*Pass() functions. As we create
a static variable of type StaticIntializer, its constructor is called as
soon as the module is loaded such that the intialization is performed on
load.
Let me know if this helped you.
Cheers
Tobi
More information about the llvm-dev
mailing list