[cfe-commits] r126678 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/fpret.m test/CodeGenObjC/nonvararg-messaging-call.m test/CodeGenObjC/property-type-mismatch.m test/CodeGenObjC/property.m test/CodeGenObjC/variadic-sends.m test/CodeGenObjCXX/property-dot-reference.mm test/CodeGenObjCXX/property-object-conditional-exp.mm

Chris Lattner clattner at apple.com
Mon Feb 28 13:12:36 PST 2011


On Feb 28, 2011, at 11:55 AM, Fariborz Jahanian wrote:

> Author: fjahanian
> Date: Mon Feb 28 13:55:59 2011
> New Revision: 126678
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=126678&view=rev
> Log:
> objc IRGen for Next runtime message API.
> The prototype for objc_msgSend() is technically variadic - 
> `id objc_msgSend(id, SEL, ...)`. 
> But all method calls should use a prototype that matches the method, 
> not the prototype for objc_msgSend itself().
> // rdar://9048030

Hi Fariborz,

If I understand this patch correctly, it is doing the wrong thing.  We don't want to change the definition of objc_msgSend itself to be non-variadic, we want the compiler to cast the function pointer to the correct (non-variadic) function type for the receiver.  With your patch, I see this:

void foo(id x) {
  [x dowhatever: 4.0];
}

compile into:

  %call = call i8* bitcast (i8* (i8*, i8*)* @objc_msgSend to i8* (i8*, i8*, double)*)(i8* %tmp, i8* %tmp1, double 4.000000e+00)

which is technically incorrect, because objc_msgSend *actually is* variadic.  Without your patch I see:

  %call = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*, double)*)(i8* %tmp, i8* %tmp1, double 4.000000e+00)

which is already what we want: objc_msgSend is variadic, but it is cast to the correct nonvariadic type for the call.  I recently fixed an optimizer bug that caused the optimizer to fold this away, introducing the extraneous "xor al, al".

Anyway, long story short, I don't think this patch is needed.

-Chris









More information about the cfe-commits mailing list