[cfe-commits] r62030 - in /cfe/trunk/lib/CodeGen: CGObjC.cpp CGObjCGNU.cpp CGObjCMac.cpp CGObjCRuntime.h CodeGenFunction.h

steve naroff snaroff at apple.com
Sat Jan 10 13:43:49 PST 2009


Hey Fariborz,

Comment below...

On Jan 10, 2009, at 4:06 PM, Fariborz Jahanian wrote:

> Author: fjahanian
> Date: Sat Jan 10 15:06:09 2009
> New Revision: 62030
>
> URL: http://llvm.org/viewvc/llvm-project?rev=62030&view=rev
> Log:
> This patch fixes the code gen failures which was a fallout from
> not merging protocol properties into the classes which
> use those protocols. With this patch, all my exceutable
> test pass again.
>
> Modified:
>    cfe/trunk/lib/CodeGen/CGObjC.cpp
>    cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
>    cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>    cfe/trunk/lib/CodeGen/CGObjCRuntime.h
>    cfe/trunk/lib/CodeGen/CodeGenFunction.h
>
> Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=62030&r1=62029&r2=62030&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjC.cpp Sat Jan 10 15:06:09 2009
> @@ -103,9 +103,10 @@
> /// StartObjCMethod - Begin emission of an ObjCMethod. This generates
> /// the LLVM function and sets the other context used by
> /// CodeGenFunction.
> -void CodeGenFunction::StartObjCMethod(const ObjCMethodDecl *OMD) {
> +void CodeGenFunction::StartObjCMethod(const ObjCMethodDecl *OMD,
> +                                      const ObjCContainerDecl *CD) {

Why do you need to pass in the ObjCContainerDecl?

Since ObjCMethodDecl's are now ScopedDecl's, why can't you use OMD- 
 >getDeclContext()?

Curious,

snaroff

>
>   FunctionArgList Args;
> -  llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD);
> +  llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD, CD);
>
>   CGM.SetMethodAttributes(OMD, Fn);
>
> @@ -125,7 +126,7 @@
> /// Generate an Objective-C method.  An Objective-C method is a C  
> function with
> /// its pointer, name, and types registered in the class struture.
> void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) {
> -  StartObjCMethod(OMD);
> +  StartObjCMethod(OMD, OMD->getClassInterface());
>   EmitStmt(OMD->getBody());
>   FinishFunction(cast<CompoundStmt>(OMD->getBody())->getRBracLoc());
> }
> @@ -143,12 +144,10 @@
>   const ObjCPropertyDecl *PD = PID->getPropertyDecl();
>   ObjCMethodDecl *OMD = PD->getGetterMethodDecl();
>   assert(OMD && "Invalid call to generate getter (empty method)");
> -  assert (!dyn_cast<ObjCProtocolDecl>(OMD->getDeclContext()) &&
> -          "GenerateObjCMethod - cannot synthesize protocol getter");
>   // FIXME: This is rather murky, we create this here since they will
>   // not have been created by Sema for us.
>   OMD->createImplicitParams(getContext(), IMP->getClassInterface());
> -  StartObjCMethod(OMD);
> +  StartObjCMethod(OMD, IMP->getClassInterface());
>
>   // Determine if we should use an objc_getProperty call for
>   // this. Non-atomic properties are directly evaluated.
> @@ -215,12 +214,10 @@
>   const ObjCPropertyDecl *PD = PID->getPropertyDecl();
>   ObjCMethodDecl *OMD = PD->getSetterMethodDecl();
>   assert(OMD && "Invalid call to generate setter (empty method)");
> -  assert (!dyn_cast<ObjCProtocolDecl>(OMD->getDeclContext()) &&
> -          "GenerateObjCSetter - cannot synthesize protocol setter");
>   // FIXME: This is rather murky, we create this here since they will
>   // not have been created by Sema for us.
>   OMD->createImplicitParams(getContext(), IMP->getClassInterface());
> -  StartObjCMethod(OMD);
> +  StartObjCMethod(OMD, IMP->getClassInterface());
>
>   bool IsCopy = PD->getSetterKind() == ObjCPropertyDecl::Copy;
>   bool IsAtomic =
>
> Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=62030&r1=62029&r2=62030&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Sat Jan 10 15:06:09 2009
> @@ -113,7 +113,8 @@
>                                 const ObjCInterfaceDecl *OID);
>   virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector  
> Sel);
>
> -  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD);
> +  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
> +                                         const ObjCContainerDecl  
> *CD);
>   virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD);
>   virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl);
>   virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
> @@ -932,7 +933,8 @@
>   return LoadFunction;
> }
>
> -llvm::Function *CGObjCGNU::GenerateMethod(const ObjCMethodDecl  
> *OMD) {
> +llvm::Function *CGObjCGNU::GenerateMethod(const ObjCMethodDecl *OMD,
> +                                          const ObjCContainerDecl  
> *CD) {
>   const ObjCCategoryImplDecl *OCD =
>     dyn_cast<ObjCCategoryImplDecl>(OMD->getDeclContext());
>   std::string CategoryName = OCD ? OCD->getNameAsString() : "";
>
> Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=62030&r1=62029&r2=62030&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Sat Jan 10 15:06:09 2009
> @@ -408,6 +408,7 @@
>   /// GetNameForMethod - Return a name for the given method.
>   /// \param[out] NameOut - The return value.
>   void GetNameForMethod(const ObjCMethodDecl *OMD,
> +                        const ObjCContainerDecl *CD,
>                         std::string &NameOut);
>
> public:
> @@ -435,7 +436,8 @@
>
>   virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector  
> Sel);
>
> -  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD);
> +  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
> +                                         const ObjCContainerDecl  
> *CD=0);
>
>   virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD);
>
> @@ -1434,9 +1436,10 @@
>                                         ObjCTypes.MethodListPtrTy);
> }
>
> -llvm::Function *CGObjCMac::GenerateMethod(const ObjCMethodDecl  
> *OMD) {
> +llvm::Function *CGObjCMac::GenerateMethod(const ObjCMethodDecl *OMD,
> +                                          const ObjCContainerDecl  
> *CD) {
>   std::string Name;
> -  GetNameForMethod(OMD, Name);
> +  GetNameForMethod(OMD, CD, Name);
>
>   const llvm::FunctionType *MethodTy =
>     CGM.getTypes().GetFunctionType(CGFunctionInfo(OMD,  
> CGM.getContext()));
> @@ -2141,11 +2144,13 @@
> }
>
> void CGObjCMac::GetNameForMethod(const ObjCMethodDecl *D,
> +                                 const ObjCContainerDecl *CD,
>                                  std::string &NameOut) {
>   // FIXME: Find the mangling GCC uses.
>   NameOut = (D->isInstanceMethod() ? "-" : "+");
>   NameOut += '[';
> -  NameOut += D->getClassInterface()->getNameAsString();
> +  assert (CD && "Missing container decl in GetNameForMethod");
> +  NameOut += CD->getNameAsString();
>   NameOut += ' ';
>   NameOut += D->getSelector().getAsString();
>   NameOut += ']';
>
> Modified: cfe/trunk/lib/CodeGen/CGObjCRuntime.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=62030&r1=62029&r2=62030&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCRuntime.h (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCRuntime.h Sat Jan 10 15:06:09 2009
> @@ -39,6 +39,7 @@
>   class ObjCAtTryStmt;
>   class ObjCAtThrowStmt;
>   class ObjCAtSynchronizedStmt;
> +  class ObjCContainerDecl;
>   class ObjCCategoryImplDecl;
>   class ObjCImplementationDecl;
>   class ObjCInterfaceDecl;
> @@ -116,7 +117,8 @@
>   // really this should also be generating the loads of the
>   // parameters, as the runtime should have full control over how
>   // parameters are passed.
> -  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD)  
> = 0;
> +  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
> +                                         const ObjCContainerDecl  
> *CD) = 0;
>
>   /// Return the runtime function for getting properties.
>   virtual llvm::Function *GetPropertyGetFunction() = 0;
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=62030&r1=62029&r2=62030&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Sat Jan 10 15:06:09 2009
> @@ -42,6 +42,7 @@
>   class FunctionDecl;
>   class FunctionTypeProto;
>   class LabelStmt;
> +  class ObjCContainerDecl;
>   class ObjCInterfaceDecl;
>   class ObjCIvarDecl;
>   class ObjCMethodDecl;
> @@ -184,7 +185,8 @@
>
>   void GenerateObjCMethod(const ObjCMethodDecl *OMD);
>
> -  void StartObjCMethod(const ObjCMethodDecl *MD);
> +  void StartObjCMethod(const ObjCMethodDecl *MD,
> +                       const ObjCContainerDecl *CD);
>
>   /// GenerateObjCGetter - Synthesize an Objective-C property getter
>   /// function.
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list