[LLVMdev] API design (and Boost and tr1)

David Greene dag at cray.com
Thu Jul 5 11:09:19 PDT 2007


On Thursday 05 July 2007 11:54, Chris Lattner wrote:

> > I've opted for the alternate approach: make all clients pass iterators. 
> > That is, get rid of the specialized one- and two-argument constructors
> > entirely.

> That sounds reasonable.  Please keep the "Value* + num elements" ctor as
> well though.

Why?  I can't think of a case where a client uses that but can't use the 
iterator version (just pass Value, Value+num).  I'd rather not maintain two 
interfaces with identical semantics.

> Here's another crazy idea.  Instead of overloading the callinst ctor, why
> not just add a static function to create the call (like binaryoperator and
> friends):
>
>    C = CallInst::CreateWithArgRange(X, B, V.begin(), V.end());
>
> That way you can completely avoid the overloading issues.

That's not a bad idea.  In fact, we ought to think about creating factories
for everything.  Bare new/delete usually comes back to haunt one later on.

I'll get what I've got working and checked in.  I'm not sure I'm ready to go
and change everything to CallInst factories given the tons of other things
I've got to work on.

The iterator and one-argument constructors appear to cover 99% of the
cases and the two-argument clients can often just pass Use::op_iterators
directly.  I've even found one case where we can eliminate a temporary vector.

                                                          -Dave



More information about the llvm-dev mailing list