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
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index 8b7400a..8f6bde4 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -23,53 +23,6 @@
/***/
-static void
-constructParamAttrListInternal(const Decl *TargetDecl,
- const llvm::SmallVector<QualType, 16> &ArgTypes,
- ParamAttrListType &PAL) {
- unsigned FuncAttrs = 0;
-
- if (TargetDecl) {
- if (TargetDecl->getAttr<NoThrowAttr>())
- FuncAttrs |= llvm::ParamAttr::NoUnwind;
- if (TargetDecl->getAttr<NoReturnAttr>())
- 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<QualType, 8>::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 @@
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 @@
return hasAggregateLLVMType(RetTy);
}
+void CodeGenFunction::ConstructParamAttrList(const Decl *TargetDecl,
+ ArgTypeIterator begin,
+ ArgTypeIterator end,
+ ParamAttrListType &PAL) {
+ unsigned FuncAttrs = 0;
+
+ if (TargetDecl) {
+ if (TargetDecl->getAttr<NoThrowAttr>())
+ FuncAttrs |= llvm::ParamAttr::NoUnwind;
+ if (TargetDecl->getAttr<NoReturnAttr>())
+ 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 @@
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 efeb6ee..c51c1d0 100644
--- a/lib/CodeGen/CGCall.h
+++ b/lib/CodeGen/CGCall.h
@@ -46,6 +46,10 @@
/// ParmVarDecl or ImplicitParamDecl.
typedef llvm::SmallVector<std::pair<const VarDecl*, QualType>,
16> FunctionArgList;
+
+ // FIXME: This should be a better iterator type so that we can avoid
+ // construction of the ArgTypes smallvectors.
+ typedef llvm::SmallVector<QualType, 16>::const_iterator ArgTypeIterator;
/// CGFunctionInfo - Class to encapsulate the information about a
/// function definition.
@@ -63,21 +67,20 @@
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<QualType, 16> 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 f5eba15..ef7009c 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -140,7 +140,12 @@
/// 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 8f7ae2e..9f7b977 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -214,7 +214,10 @@
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()));