[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