On Feb 25, 2010, at 5:45 PM, David A. Greene wrote:> The RegisterPass template takes care of notifying the PassManager > that the pass exists. One of the advantages of PassManager is > that it decouples pass execution from the rest of the infrastructure > so the class need not be visible to anything outside the > implementation > of the pass itself.Even though the PassManager implements the Hollywood Principle, something outside of the pass implementation still has to invoke one of the runOn* functions. And I'm not understanding how this invocation can occur if the implementation is invisible. Maybe I should just chalk this up to template magic... On a related note, the source code comments in PassSupport.h (line 156) say that the RegisterPass instance should be declared in the global scope, and indeed, the Hello.cpp example puts it in the global scope. However, the "Writing an LLVM Pass" document puts it in the anonymous namespace, and when I tried this on my own pass implementation, it worked fine. Is there a particular reason why it has to be in the global scope? (Maybe if I understood the contradiction, I'd be able to understand my original question.) Thanks, Trevor
On Fri, Feb 26, 2010 at 05:22:49PM -0800, Trevor Harmon wrote:> On Feb 25, 2010, at 5:45 PM, David A. Greene wrote: > > > The RegisterPass template takes care of notifying the PassManager > > that the pass exists. One of the advantages of PassManager is > > that it decouples pass execution from the rest of the infrastructure > > so the class need not be visible to anything outside the > > implementation > > of the pass itself. > > Even though the PassManager implements the Hollywood Principle, > something outside of the pass implementation still has to invoke one > of the runOn* functions. And I'm not understanding how this invocation > can occur if the implementation is invisible. Maybe I should just > chalk this up to template magic...I'm not familiar with this particular code, and haven't looked at the implementation. However, the rule about anonymous namespaces is slightly subtler. You cannot refer to anything in anonymous namespace by name from another file, however, if you have a pointer, say, then you can still use the pointer. I suspect that the template in question registers the pass with the PassManager or something (through a static initialization?). Thus, even though the implementation is invisible (unnameable?) other code still know where it is. Tom
On Feb 26, 2010, at 7:42 PM, Tom Prince wrote:> You cannot refer to anything in anonymous namespace by name from > another file, however, if you have a pointer, say, then you can > still use the > pointer.Yes, that would make sense, except I don't see any pointers being passed. The relevant line in lib/Transforms/Hello.cpp is: static RegisterPass<Hello> X("hello", "Hello World Pass"); This template declaration is, somehow, sufficient to give the PassManager access to Hello. Trevor