[prev in list] [next in list] [prev in thread] [next in thread] 

List:       llvm-dev
Subject:    Re: [LLVMdev] MAJOR API CHANGE: Pass initialization without static
From:       Owen Anderson <resistor () mac ! com>
Date:       2010-10-08 20:44:52
Message-ID: 3CDE3C64-E30A-4482-A4ED-39DBD5E5559E () mac ! com
[Download RAW message or body]


On Oct 8, 2010, at 1:37 PM, John Criswell wrote:

> On 10/8/10 3:15 PM, Owen Anderson wrote:
> > 
> > On Oct 8, 2010, at 1:05 PM, John Criswell wrote:
> > 
> > > On 10/8/10 1:29 PM, Owen Anderson wrote:
> > > > Hello fellow LLVM-ers,
> > > > 
> > > > As those of you who follow llvm-commits have probably noticed, I've been hard \
> > > > at work reworking our pass infrastructure to perform pass \
> > > > initialization/registration without static constructors.  This is a boon for \
> > > > clients of the LLVM libraries, as they can now control when and if \
> > > > initialization occurs, as opposed to being forced to incur the initialization \
> > > > cost at startup, negatively impacting their startup times. 
> > > > The new-style solution consists of an llvm::initializeMyPass method for every \
> > > > pass.
> > > 
> > > What is this method of our passes supposed to do?  Is there a default \
> > > implementation in the Pass class?
> > 
> > This method is provided for you by INITIALIZE_PASS macros (and friends).  All you \
> > have to do is add the declaration to InitializePasses.h, and add a call of it to \
> > the library's batch initialization method.
> 
> Is InitializePasses.h an LLVM header file?  If so, I assume modifying \
> InitializePasses.h is only required if the pass is part of LLVM.  Out-of-tree \
> projects need to be able to create new passes without modifying the LLVM source.

I was answering within the context of implementing a new pass in LLVM, where it's an \
API requirement that pass initializations are exposed in InitializePasses.h.  Within \
your own tool, it doesn't really matter where you declare it as long as it's visible \
to wherever you call it from. :-)

Also, as I pointed out, the RegisterPass<> templates do continue to exist and \
function without the need for explicit initialization(and are necessary for continued \
support of dynamically loadable plugins), but come with the cost of a static \
constructor.  For a pass wholly contained within an out-of-tree tool, it would be \
perfectly reasonable to use RegisterPass<> if the cost is acceptable to you.

> Hrm.  I see.
> 
> I still don't like the idea of having every statically-linked tool explicitly \
> initializing every library that gets linked in.  Just dumping the library into the \
> Makefile and being done with it was much nicer. 
> If you can find a reasonable way to support that, it would be nice.  However, if \
> you can't, it's not that big a deal.  As I mentioned before, as long as out-of-tree \
> passes don't have to modify LLVM source files to work properly, I'll live.

I don't especially like it either, but the abundance of static constructors in LLVM \
has been a long-standing performance concern.  I wouldn't be going this way if I had \
a better solution.

--Owen

_______________________________________________
LLVM Developers mailing list
LLVMdev@cs.uiuc.edu         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic