[cfe-commits] r55812 - in /cfe/trunk/lib/CodeGen: CGObjC.cpp CodeGenModule.cpp CodeGenModule.h

Daniel Dunbar daniel at zuster.org
Thu Sep 4 16:41:35 PDT 2008


Author: ddunbar
Date: Thu Sep  4 18:41:35 2008
New Revision: 55812

URL: http://llvm.org/viewvc/llvm-project?rev=55812&view=rev
Log:
Set function attributes (sext, zext, etc.) on Objective-C methods.

Modified:
    cfe/trunk/lib/CodeGen/CGObjC.cpp
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/lib/CodeGen/CodeGenModule.h

Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=55812&r1=55811&r2=55812&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Thu Sep  4 18:41:35 2008
@@ -106,6 +106,9 @@
 // FIXME: This should really be merged with GenerateCode.
 void CodeGenFunction::StartObjCMethod(const ObjCMethodDecl *OMD) {
   CurFn = CGM.getObjCRuntime().GenerateMethod(OMD);
+
+  CGM.SetMethodAttributes(OMD, CurFn);
+  
   llvm::BasicBlock *EntryBB = llvm::BasicBlock::Create("entry", CurFn);
   
   // Create a marker to make it easy to insert allocas into the entryblock

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=55812&r1=55811&r2=55812&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Sep  4 18:41:35 2008
@@ -196,9 +196,10 @@
   }
 }
 
-void CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
-                                          llvm::Function *F,
-                                          const llvm::FunctionType *FTy) {
+static void 
+SetFunctionAttributesFromTypes(const Decl *FD,
+                               llvm::Function *F,
+                               const llvm::SmallVector<QualType, 16> &ArgTypes) {
   unsigned FuncAttrs = 0;
   if (FD->getAttr<NoThrowAttr>())
     FuncAttrs |= llvm::ParamAttr::NoUnwind;
@@ -209,28 +210,26 @@
   if (FuncAttrs)
     ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs));
   // Note that there is parallel code in CodeGenFunction::EmitCallExpr
-  bool AggregateReturn = CodeGenFunction::hasAggregateLLVMType(FD->getResultType());
+  bool AggregateReturn = CodeGenFunction::hasAggregateLLVMType(ArgTypes[0]);
   if (AggregateReturn)
     ParamAttrList.push_back(
         llvm::ParamAttrsWithIndex::get(1, llvm::ParamAttr::StructRet));
   unsigned increment = AggregateReturn ? 2 : 1;
-  const FunctionTypeProto* FTP = dyn_cast<FunctionTypeProto>(FD->getType());
-  if (FTP) {
-    for (unsigned i = 0; i < FTP->getNumArgs(); i++) {
-      QualType ParamType = FTP->getArgType(i);
-      unsigned ParamAttrs = 0;
-      if (ParamType->isRecordType())
-        ParamAttrs |= llvm::ParamAttr::ByVal;
-      if (ParamType->isSignedIntegerType() &&
-          ParamType->isPromotableIntegerType())
-        ParamAttrs |= llvm::ParamAttr::SExt;
-      if (ParamType->isUnsignedIntegerType() &&
-          ParamType->isPromotableIntegerType())
-        ParamAttrs |= llvm::ParamAttr::ZExt;
-      if (ParamAttrs)
-        ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(i + increment,
-                                                               ParamAttrs));
-    }
+  for (llvm::SmallVector<QualType, 8>::const_iterator i = ArgTypes.begin() + 1,
+         e = ArgTypes.end(); i != e; ++i, ++increment) {
+    QualType ParamType = *i;
+    unsigned ParamAttrs = 0;
+    if (ParamType->isRecordType())
+      ParamAttrs |= llvm::ParamAttr::ByVal;
+    if (ParamType->isSignedIntegerType() &&
+        ParamType->isPromotableIntegerType())
+      ParamAttrs |= llvm::ParamAttr::SExt;
+    if (ParamType->isUnsignedIntegerType() &&
+        ParamType->isPromotableIntegerType())
+      ParamAttrs |= llvm::ParamAttr::ZExt;
+    if (ParamAttrs)
+      ParamAttrList.push_back(llvm::ParamAttrsWithIndex::get(increment,
+                                                             ParamAttrs));
   }
 
   F->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(),
@@ -239,6 +238,45 @@
   // Set the appropriate calling convention for the Function.
   if (FD->getAttr<FastCallAttr>())
     F->setCallingConv(llvm::CallingConv::Fast);
+}
+
+/// SetFunctionAttributesForDefinition - Set function attributes
+/// specific to a function definition.
+void CodeGenModule::SetFunctionAttributesForDefinition(llvm::Function *F) {
+  if (!Features.Exceptions)
+    F->addParamAttr(0, llvm::ParamAttr::NoUnwind);  
+}
+
+void CodeGenModule::SetMethodAttributes(const ObjCMethodDecl *MD,
+                                        llvm::Function *F) {
+  llvm::SmallVector<QualType, 16> ArgTypes;
+  
+  ArgTypes.push_back(MD->getResultType());
+  ArgTypes.push_back(MD->getSelfDecl()->getType());
+  ArgTypes.push_back(Context.getObjCSelType());
+  for (ObjCMethodDecl::param_const_iterator i = MD->param_begin(),
+         e = MD->param_end(); i != e; ++i)
+    ArgTypes.push_back((*i)->getType());
+
+  SetFunctionAttributesFromTypes(MD, F, ArgTypes);
+  
+  SetFunctionAttributesForDefinition(F);
+
+  // FIXME: set visibility
+}
+
+void CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
+                                          llvm::Function *F) {
+  llvm::SmallVector<QualType, 16> ArgTypes;
+  const FunctionType *FTy = FD->getType()->getAsFunctionType();
+  const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(FTy);
+  
+  ArgTypes.push_back(FTy->getResultType());
+  if (FTP)
+    for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
+      ArgTypes.push_back(FTP->getArgType(i));
+
+  SetFunctionAttributesFromTypes(FD, F, ArgTypes);
 
   SetGlobalValueAttributes(FD, F);
 }
@@ -533,12 +571,11 @@
     return alias;
   } else {
     const llvm::Type *Ty = getTypes().ConvertType(D->getType());
-    const llvm::FunctionType *FTy = cast<llvm::FunctionType>(Ty);
-    llvm::Function *F = llvm::Function::Create(FTy, 
+    llvm::Function *F = llvm::Function::Create(cast<llvm::FunctionType>(Ty), 
                                                llvm::Function::ExternalLinkage,
                                                D->getName(), &getModule());
     
-    SetFunctionAttributes(D, F, FTy);
+    SetFunctionAttributes(D, F);
     return F;
   }
 }
@@ -601,11 +638,7 @@
     llvm::Function *Fn = cast<llvm::Function>(Entry);    
     CodeGenFunction(*this).GenerateCode(D, Fn);
 
-    // Set attributes specific to definition. 
-    // FIXME: This needs to be cleaned up by clearly emitting the
-    // declaration / definition at separate times.
-    if (!Features.Exceptions)
-      Fn->addParamAttr(0, llvm::ParamAttr::NoUnwind);  
+    SetFunctionAttributesForDefinition(Fn);
 
     if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) {
       AddGlobalCtor(Fn, CA->getPriority());

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=55812&r1=55811&r2=55812&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.h Thu Sep  4 18:41:35 2008
@@ -207,10 +207,16 @@
   void ErrorUnsupported(const Decl *D, const char *Type,
                         bool OmitOnError=false);
 
+  void SetMethodAttributes(const ObjCMethodDecl *MD,
+                           llvm::Function *F);
+
 private:
+  /// SetFunctionAttributesForDefinition - Set function attributes
+  /// specific to a function definition.
+  void SetFunctionAttributesForDefinition(llvm::Function *F);
+
   void SetFunctionAttributes(const FunctionDecl *FD,
-                             llvm::Function *F,
-                             const llvm::FunctionType *FTy);
+                             llvm::Function *F);
 
   void SetGlobalValueAttributes(const FunctionDecl *FD,
                                 llvm::GlobalValue *GV);





More information about the cfe-commits mailing list