From 5323a4b0a1c248fa2ffdf886bb41a5d8fba71d2d Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 10 Sep 2008 00:32:18 +0000 Subject: [PATCH] Tweak CGCall functions: - Move actual param attr list creation to CodeGenFunction::ConstructParamAttrList. - Make ReturnTypeUsesSret static. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56038 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCall.cpp | 121 ++++++++++++++++++---------------- lib/CodeGen/CGCall.h | 15 +++-- lib/CodeGen/CodeGenFunction.h | 7 +- lib/CodeGen/CodeGenModule.cpp | 5 +- 4 files changed, 82 insertions(+), 66 deletions(-) diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 8b7400af56..8f6bde412b 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -23,53 +23,6 @@ using namespace CodeGen; /***/ -static void -constructParamAttrListInternal(const Decl *TargetDecl, - const llvm::SmallVector &ArgTypes, - ParamAttrListType &PAL) { - unsigned FuncAttrs = 0; - - if (TargetDecl) { - if (TargetDecl->getAttr()) - FuncAttrs |= llvm::ParamAttr::NoUnwind; - if (TargetDecl->getAttr()) - FuncAttrs |= llvm::ParamAttr::NoReturn; - } - - unsigned Index = 1; - if (CodeGenFunction::hasAggregateLLVMType(ArgTypes[0])) { - PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, - llvm::ParamAttr::StructRet)); - ++Index; - } else if (ArgTypes[0]->isPromotableIntegerType()) { - if (ArgTypes[0]->isSignedIntegerType()) { - FuncAttrs |= llvm::ParamAttr::SExt; - } else if (ArgTypes[0]->isUnsignedIntegerType()) { - FuncAttrs |= llvm::ParamAttr::ZExt; - } - } - if (FuncAttrs) - PAL.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs)); - for (llvm::SmallVector::const_iterator i = ArgTypes.begin() + 1, - e = ArgTypes.end(); i != e; ++i, ++Index) { - QualType ParamType = *i; - unsigned ParamAttrs = 0; - if (ParamType->isRecordType()) - ParamAttrs |= llvm::ParamAttr::ByVal; - if (ParamType->isPromotableIntegerType()) { - if (ParamType->isSignedIntegerType()) { - ParamAttrs |= llvm::ParamAttr::SExt; - } else if (ParamType->isUnsignedIntegerType()) { - ParamAttrs |= llvm::ParamAttr::ZExt; - } - } - if (ParamAttrs) - PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, ParamAttrs)); - } -} - -/***/ - // FIXME: Use iterator and sidestep silly type array creation. CGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD) @@ -96,23 +49,28 @@ CGFunctionInfo::CGFunctionInfo(const ObjCMethodDecl *MD, ArgTypes.push_back((*i)->getType()); } -void CGFunctionInfo::constructParamAttrList(ParamAttrListType &PAL) const { - constructParamAttrListInternal(TheDecl, ArgTypes, PAL); +ArgTypeIterator CGFunctionInfo::argtypes_begin() const { + return ArgTypes.begin(); +} + +ArgTypeIterator CGFunctionInfo::argtypes_end() const { + return ArgTypes.end(); } /***/ -CGCallInfo::CGCallInfo(QualType _ResultType, const CallArgList &_Args) - : ResultType(_ResultType), - Args(_Args) { - ArgTypes.push_back(ResultType); - for (CallArgList::const_iterator i = Args.begin(), e = Args.end(); i!=e; ++i) +CGCallInfo::CGCallInfo(QualType _ResultType, const CallArgList &_Args) { + ArgTypes.push_back(_ResultType); + for (CallArgList::const_iterator i = _Args.begin(), e = _Args.end(); i!=e; ++i) ArgTypes.push_back(i->second); } -void CGCallInfo::constructParamAttrList(ParamAttrListType &PAL) const { - // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set. - constructParamAttrListInternal(0, ArgTypes, PAL); +ArgTypeIterator CGCallInfo::argtypes_begin() const { + return ArgTypes.begin(); +} + +ArgTypeIterator CGCallInfo::argtypes_end() const { + return ArgTypes.end(); } /***/ @@ -121,6 +79,51 @@ bool CodeGenFunction::ReturnTypeUsesSret(QualType RetTy) { return hasAggregateLLVMType(RetTy); } +void CodeGenFunction::ConstructParamAttrList(const Decl *TargetDecl, + ArgTypeIterator begin, + ArgTypeIterator end, + ParamAttrListType &PAL) { + unsigned FuncAttrs = 0; + + if (TargetDecl) { + if (TargetDecl->getAttr()) + FuncAttrs |= llvm::ParamAttr::NoUnwind; + if (TargetDecl->getAttr()) + FuncAttrs |= llvm::ParamAttr::NoReturn; + } + + QualType ResTy = *begin; + unsigned Index = 1; + if (CodeGenFunction::hasAggregateLLVMType(ResTy)) { + PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, + llvm::ParamAttr::StructRet)); + ++Index; + } else if (ResTy->isPromotableIntegerType()) { + if (ResTy->isSignedIntegerType()) { + FuncAttrs |= llvm::ParamAttr::SExt; + } else if (ResTy->isUnsignedIntegerType()) { + FuncAttrs |= llvm::ParamAttr::ZExt; + } + } + if (FuncAttrs) + PAL.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs)); + for (++begin; begin != end; ++begin, ++Index) { + QualType ParamType = *begin; + unsigned ParamAttrs = 0; + if (ParamType->isRecordType()) + ParamAttrs |= llvm::ParamAttr::ByVal; + if (ParamType->isPromotableIntegerType()) { + if (ParamType->isSignedIntegerType()) { + ParamAttrs |= llvm::ParamAttr::SExt; + } else if (ParamType->isUnsignedIntegerType()) { + ParamAttrs |= llvm::ParamAttr::ZExt; + } + } + if (ParamAttrs) + PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, ParamAttrs)); + } +} + void CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn, QualType RetTy, const FunctionArgList &Args) { @@ -198,8 +201,10 @@ RValue CodeGenFunction::EmitCall(llvm::Value *Callee, llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size()); CGCallInfo CallInfo(ResultType, CallArgs); + // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set. CodeGen::ParamAttrListType ParamAttrList; - CallInfo.constructParamAttrList(ParamAttrList); + ConstructParamAttrList(0, CallInfo.argtypes_begin(), CallInfo.argtypes_end(), + ParamAttrList); CI->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(), ParamAttrList.size())); diff --git a/lib/CodeGen/CGCall.h b/lib/CodeGen/CGCall.h index efeb6ee49f..c51c1d0565 100644 --- a/lib/CodeGen/CGCall.h +++ b/lib/CodeGen/CGCall.h @@ -46,6 +46,10 @@ namespace CodeGen { /// ParmVarDecl or ImplicitParamDecl. typedef llvm::SmallVector, 16> FunctionArgList; + + // FIXME: This should be a better iterator type so that we can avoid + // construction of the ArgTypes smallvectors. + typedef llvm::SmallVector::const_iterator ArgTypeIterator; /// CGFunctionInfo - Class to encapsulate the information about a /// function definition. @@ -63,21 +67,20 @@ namespace CodeGen { const Decl* getDecl() const { return TheDecl; } - void constructParamAttrList(ParamAttrListType &Args) const; + ArgTypeIterator argtypes_begin() const; + ArgTypeIterator argtypes_end() const; }; /// CGCallInfo - Class to encapsulate the arguments and clang types /// used in a call. class CGCallInfo { - QualType ResultType; - const CallArgList &Args; - llvm::SmallVector ArgTypes; public: CGCallInfo(QualType _ResultType, const CallArgList &Args); - - void constructParamAttrList(ParamAttrListType &Args) const; + + ArgTypeIterator argtypes_begin() const; + ArgTypeIterator argtypes_end() const; }; } // end namespace CodeGen } // end namespace clang diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index f5eba15a24..ef7009c5aa 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -140,7 +140,12 @@ public: /// ReturnTypeUsesSret - Return true iff the given type uses 'sret' /// when used as a return type. - bool ReturnTypeUsesSret(QualType RetTy); + static bool ReturnTypeUsesSret(QualType RetTy); + + static void ConstructParamAttrList(const Decl *TargetDecl, + const ArgTypeIterator begin, + const ArgTypeIterator end, + ParamAttrListType &PAL); /// EmitFunctionProlog - Emit the target specific LLVM code to load /// the arguments for the given function. This is also responsible diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 8f7ae2eb56..9f7b977276 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -214,7 +214,10 @@ static void SetGlobalValueAttributes(const Decl *D, static void SetFunctionParamAttrs(const CGFunctionInfo &Info, llvm::Function *F) { ParamAttrListType ParamAttrList; - Info.constructParamAttrList(ParamAttrList); + CodeGenFunction::ConstructParamAttrList(Info.getDecl(), + Info.argtypes_begin(), + Info.argtypes_end(), + ParamAttrList); F->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(), ParamAttrList.size())); -- 2.40.0