From: Daniel Dunbar Date: Tue, 3 Feb 2009 05:31:23 +0000 (+0000) Subject: Move ABIArgInfo into CGFunctionInfo, computed on creation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=88c2fa96be989571b4afb6229f0ef5a3ef4450cb;p=clang Move ABIArgInfo into CGFunctionInfo, computed on creation. - Still have to convert some consumers over. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63610 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/ABIInfo.h b/lib/CodeGen/ABIInfo.h index 4b33c4e806..e0917f77e0 100644 --- a/lib/CodeGen/ABIInfo.h +++ b/lib/CodeGen/ABIInfo.h @@ -10,6 +10,10 @@ #ifndef CLANG_CODEGEN_ABIINFO_H #define CLANG_CODEGEN_ABIINFO_H +namespace llvm { + class Type; +} + namespace clang { /* FIXME: All of this stuff should be part of the target interface somehow. It is currently here because it is not clear how to factor @@ -59,6 +63,8 @@ namespace clang { TypeData(TD), UIntData(0) {} public: + ABIArgInfo() : TheKind(Default), TypeData(0), UIntData(0) {} + static ABIArgInfo getDefault() { return ABIArgInfo(Default); } diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index c6e804ea0b..dfbd7bfce0 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -87,6 +87,9 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, return getFunctionInfo(ResTy, ArgTys); } +static ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT); +static ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT); + const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, const llvm::SmallVector &ArgTys) { // Lookup or create unique function info. @@ -98,25 +101,17 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, if (FI) return *FI; + // Construct the function info. FI = new CGFunctionInfo(ResTy, ArgTys); FunctionInfos.InsertNode(FI, InsertPos); - return *FI; -} -/***/ + // Compute ABI information. + FI->getReturnInfo() = getABIReturnInfo(ResTy, *this); + for (CGFunctionInfo::arg_iterator it = FI->arg_begin(), ie = FI->arg_end(); + it != ie; ++it) + it->info = getABIArgumentInfo(it->type, *this); -CGFunctionInfo::CGFunctionInfo(QualType ResTy, - const llvm::SmallVector &ArgTys) { - ArgTypes.push_back(ResTy); - ArgTypes.insert(ArgTypes.end(), ArgTys.begin(), ArgTys.end()); -} - -CGFunctionInfo::arg_iterator CGFunctionInfo::arg_begin() const { - return ArgTypes.begin()+1; -} - -CGFunctionInfo::arg_iterator CGFunctionInfo::arg_end() const { - return ArgTypes.end(); + return *FI; } /***/ @@ -721,6 +716,17 @@ static ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT) { /***/ +CGFunctionInfo::CGFunctionInfo(QualType ResTy, + const llvm::SmallVector &ArgTys) { + NumArgs = ArgTys.size(); + Args = new ArgInfo[1 + NumArgs]; + Args[0].type = ResTy; + for (unsigned i = 0; i < NumArgs; ++i) + Args[1 + i].type = ArgTys[i]; +} + +/***/ + void CodeGenTypes::GetExpandedTypes(QualType Ty, std::vector &ArgTys) { const RecordType *RT = Ty->getAsStructureType(); @@ -846,7 +852,7 @@ static void CreateCoercedStore(llvm::Value *Src, uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy); uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(DstTy); - // If store is legal, just bitcase the src pointer. + // If store is legal, just bitcast the src pointer. if (SrcSize == DstSize) { llvm::Value *Casted = CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy)); @@ -907,10 +913,10 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) { break; } - for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); - it != ie; ++it) { - ABIArgInfo AI = getABIArgumentInfo(*it, *this); - const llvm::Type *Ty = ConvertType(*it); + for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), + ie = FI.arg_end(); it != ie; ++it) { + const ABIArgInfo &AI = it->info; + const llvm::Type *Ty = ConvertType(it->type); switch (AI.getKind()) { case ABIArgInfo::Ignore: @@ -931,7 +937,7 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) { break; case ABIArgInfo::Expand: - GetExpandedTypes(*it, ArgTys); + GetExpandedTypes(it->type, ArgTys); break; } } @@ -988,11 +994,11 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, if (RetAttrs) PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs)); - for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); - it != ie; ++it) { - QualType ParamType = *it; + for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), + ie = FI.arg_end(); it != ie; ++it) { + QualType ParamType = it->type; + const ABIArgInfo &AI = it->info; unsigned Attributes = 0; - ABIArgInfo AI = getABIArgumentInfo(ParamType, getTypes()); switch (AI.getKind()) { case ABIArgInfo::StructRet: diff --git a/lib/CodeGen/CGCall.h b/lib/CodeGen/CGCall.h index 611304900f..95e561d6f9 100644 --- a/lib/CodeGen/CGCall.h +++ b/lib/CodeGen/CGCall.h @@ -20,9 +20,13 @@ #include "CGValue.h" +// FIXME: Restructure so we don't have to expose so much stuff. +#include "ABIInfo.h" + namespace llvm { - class Function; struct AttributeWithIndex; + class Function; + class Type; class Value; template class SmallVector; @@ -51,21 +55,35 @@ namespace CodeGen { /// CGFunctionInfo - Class to encapsulate the information about a /// function definition. class CGFunctionInfo : public llvm::FoldingSetNode { - llvm::SmallVector ArgTypes; + struct ArgInfo { + QualType type; + ABIArgInfo info; + }; + + unsigned NumArgs; + ArgInfo *Args; public: - typedef llvm::SmallVector::const_iterator arg_iterator; + typedef const ArgInfo *const_arg_iterator; + typedef ArgInfo *arg_iterator; CGFunctionInfo(QualType ResTy, const llvm::SmallVector &ArgTys); + ~CGFunctionInfo() { delete[] Args; } + + const_arg_iterator arg_begin() const { return Args + 1; } + const_arg_iterator arg_end() const { return Args + 1 + NumArgs; } + arg_iterator arg_begin() { return Args + 1; } + arg_iterator arg_end() { return Args + 1 + NumArgs; } - arg_iterator arg_begin() const; - arg_iterator arg_end() const; + QualType getReturnType() const { return Args[0].type; } - QualType getReturnType() const { return ArgTypes[0]; } + ABIArgInfo &getReturnInfo() { return Args[0].info; } + const ABIArgInfo &getReturnInfo() const { return Args[0].info; } void Profile(llvm::FoldingSetNodeID &ID) { - Profile(ID, getReturnType(), arg_begin(), arg_end()); + for (arg_iterator it = arg_begin(), ie = arg_end(); it != ie; ++it) + it->type.Profile(ID); } template static void Profile(llvm::FoldingSetNodeID &ID,