Tweak CGCall functions:

- Move actual param attr list creation to
   CodeGenFunction::ConstructParamAttrList.
 - Make ReturnTypeUsesSret static.

llvm-svn: 56038
This commit is contained in:
Daniel Dunbar 2008-09-10 00:32:18 +00:00
parent c6db3ad15f
commit 76c8eb75b1
4 changed files with 82 additions and 66 deletions

View File

@ -23,53 +23,6 @@ using namespace CodeGen;
/***/
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 @@ 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<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 @@ 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()));

View File

@ -46,6 +46,10 @@ namespace CodeGen {
/// 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 @@ 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<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

View File

@ -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

View File

@ -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()));