[cfe-dev] New diff

Chris Lattner clattner at apple.com
Mon Jun 30 22:36:01 PDT 2008


On Jun 30, 2008, at 6:43 AM, David Chisnall wrote:
> On 29 Jun 2008, at 00:16, Chris Lattner wrote:
>> <moving this to cfe-dev, which should have been cc'd the whole time>
>>> Here's a new version.  It pulls out most of the cases where the  
>>> value from an llvm::Constant is taken in CodeGen and passes in the  
>>> initialisers instead.
>>
>> Now you're copying strings around all over the place for no  
>> reason.  Converting things to a vector<std::string> does a bunch of  
>> string copies.  Why do we want this?
>
> Ideally I wouldn't.  I'd want it to just take references, but since  
> Selector returns a string, rather than a pointer to a string, a copy  
> is required, and I made the others strings for consistency.

Why not pass the selector around?  It is exactly one word and is cheap  
to copy.  It is perfect for this sort of interface.

> Selector objects are not an adequate abstraction here because they  
> do not contain type information,

Neither do strings.

> which we can extract from  the AST, and they are not really the  
> right thing to pass in semantically since it is the method name, not  
> the selector, that we want (the two are often used interchangeably,  
> but are not the same).

Why not?

>>> I've also changed it so that the Selector passed to the the  
>>> methods for generating message sends is a selector, rather than  
>>> the name of a selector.  This should be previously obtained by  
>>> GetSelector.  There are now two versions of this, one taking a  
>>> pair of char*s and one taking a pair of llvm::Value*s as arguments.
>>
>> I don't understand where you're going with this.  You've taken all  
>> the nice simple APIs that take Selectors and pass Value*'s around.   
>> You are inverting the logic of the code generator to avoid passing  
>> in clang data structures.
>
> This part of the change is definitely cleaner.  The runtime  
> interface now more closely mirrors how message dispatch works (as a  
> two stage process, getting the selector and sending the message).   
> It also allows as much type information to be provided to the  
> runtime as is available.  Since clang knows the types of the  
> arguments being passed, it can pass this when looking up the  
> selector (it doesn't yet), without changing the message send  
> method.  This will aid debugging Objective-C code in the future,  
> since a runtime exception can be thrown if a method is called with  
> arguments of the wrong type: this is not always possible to detect  
> at compile time, and currently causes a corrupt stack and is a  
> colossal pain to trace.

Is this something supported by existing ObjC runtimes or some new  
feature you are prototyping?  I don't see how this relates to the  
Selector vs string issue, since neither provides type info.

>> Further, I don't see why the ObjC codegen stuff shouldn't pull in  
>> CodeGenModule.  It seems that you're again inverting control flow  
>> here to eliminate a very reasonable dependency.  Because of this,  
>> you've reinvented things (like CGObjCGNU::MakeConstantString), and  
>> introduced problems (e.g. MakeConstantString doesn't unique the  
>> strings like CGM's does).
>
> I would be more than happy to refactor this to reuse existing code  
> if it can be done in a way that didn't introduce direct dependencies  
> on clang.  I would propose creating a delegate object that can be  
> passed in, which exposes any methods in CGM that are needed and can  
> be replaced by a different delegate in other implementations, if  
> this would be acceptable.

Not acceptable.  Why not just have your other implementations provide  
a corresponding version of CGM and Selector that they can pass around?


>> I understand (now) that you are trying to reuse the clang codegen  
>> in the context of your smalltalk implementation.
>
> And in other compilers.  The Nu team recently approached me to  
> discuss using the code for their object model (currently they target  
> the Apple runtime directly), and others are planning on using it for  
> JavaScript and Io ports.
>
> I have found bugs in the clang code directly as a result of using it  
> in other work, and I consider reuse to be an important way of  
> testing the code.  I would rather not have to maintain a portable  
> and a clang version of this code, since it would mean that bug fixes  
> would take much longer to make their way into clang.

That is very cool and I don't want to lose that.  However, clang  
maintainability and performance is my #1 prio, so it trumps  
reusability of the code in other contexts.  I think that we really  
just need to find the right way to factor this, I think we can come to  
a design that fits both purposes reasonably well.

>> While this is an interesting goal, this is *not* an acceptable  
>> reason to make the clang ObjC codegen code inefficient and weird.
>
> Weird is highly subjective - I consider that the code now  
> corresponds closely to the object model semantics, and so don't find  
> it weird.  Inefficient is probably true, and I would welcome any  
> constructive suggestions for optimisation.

You're right and I was being overly critical here.  The thing I really  
didn't like about the old design is that you emitted dead strings to  
LLVM IR and read them back out on the "other side" of the boundary.   
Passing std::strings around *is* a step up from that, but it still  
isn't as efficient as passing around Selectors.

>> I'm somewhat ok with you adding codepaths that are not used by  
>> clang (and are thus dead) as long as they are not huge, but making  
>> codepaths clang *does* use inefficient and inelegant is not  
>> acceptable.
>
> I have not written anything in this file which is not intended for  
> use in compiling Objective-C.  Some parts are not yet connected to  
> implementations, however anything intended for other languages I  
> have kept in separate files and not submitted.  The only code paths  
> that are dead are ones where I have not yet written the calling code.

There was code in the file for handling "typed selectors" which was  
dead.

-Chris




More information about the cfe-dev mailing list