diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-02-03 06:51:18 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-02-03 06:51:18 +0000 |
commit | 6bad2658b48264629db595f944a3fbe07f61b4e9 (patch) | |
tree | e4915bbb928b0e097b575551f5c713f00bb2f3df /lib/CodeGen/CGCall.cpp | |
parent | 0bcc52114e37a8d152d9a05095ee7f7687c9aa94 (diff) |
Change ABIInfo to compute information for a full signature at a time
(the main point of this restructing).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63619 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCall.cpp')
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 79 |
1 files changed, 38 insertions, 41 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 6f7d6f696f..f80ae0dc90 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -87,9 +87,6 @@ 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<QualType, 16> &ArgTys) { // Lookup or create unique function info. @@ -106,10 +103,7 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy, FunctionInfos.InsertNode(FI, InsertPos); // 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); + getABIInfo().computeInfo(*FI, getContext()); return *FI; } @@ -207,24 +201,38 @@ static bool areAllFields32Or64BitBasicType(const RecordDecl *RD, namespace { /// DefaultABIInfo - The default implementation for ABI specific /// details. This implementation provides information which results in -/// sensible LLVM IR generation, but does not conform to any -/// particular ABI. +/// self-consistent and sensible LLVM IR generation, but does not +/// conform to any particular ABI. class DefaultABIInfo : public ABIInfo { - virtual ABIArgInfo classifyReturnType(QualType RetTy, - ASTContext &Context) const; - - virtual ABIArgInfo classifyArgumentType(QualType RetTy, - ASTContext &Context) const; + ABIArgInfo classifyReturnType(QualType RetTy, + ASTContext &Context) const; + + ABIArgInfo classifyArgumentType(QualType RetTy, + ASTContext &Context) const; + + virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const { + FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context); + for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); + it != ie; ++it) + it->info = classifyArgumentType(it->type, Context); + } }; /// X86_32ABIInfo - The X86-32 ABI information. class X86_32ABIInfo : public ABIInfo { public: - virtual ABIArgInfo classifyReturnType(QualType RetTy, - ASTContext &Context) const; + ABIArgInfo classifyReturnType(QualType RetTy, + ASTContext &Context) const; - virtual ABIArgInfo classifyArgumentType(QualType RetTy, - ASTContext &Context) const; + ABIArgInfo classifyArgumentType(QualType RetTy, + ASTContext &Context) const; + + virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const { + FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context); + for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); + it != ie; ++it) + it->info = classifyArgumentType(it->type, Context); + } }; } @@ -353,11 +361,18 @@ class X86_64ABIInfo : public ABIInfo { Class &Lo, Class &Hi) const; public: - virtual ABIArgInfo classifyReturnType(QualType RetTy, - ASTContext &Context) const; - - virtual ABIArgInfo classifyArgumentType(QualType RetTy, - ASTContext &Context) const; + ABIArgInfo classifyReturnType(QualType RetTy, + ASTContext &Context) const; + + ABIArgInfo classifyArgumentType(QualType RetTy, + ASTContext &Context) const; + + virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const { + FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context); + for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); + it != ie; ++it) + it->info = classifyArgumentType(it->type, Context); + } }; } @@ -706,24 +721,6 @@ const ABIInfo &CodeGenTypes::getABIInfo() const { return *(TheABIInfo = new DefaultABIInfo); } -// getABIReturnInfo - Wrap the ABIInfo getABIReturnInfo, altering -// "default" types to StructRet when appropriate for simplicity. -static ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT) { - assert(!Ty->isArrayType() && - "Array types cannot be passed directly."); - ABIArgInfo Info = CGT.getABIInfo().classifyReturnType(Ty, CGT.getContext()); - return Info; -} - -// getABIArgumentInfo - Wrap the ABIInfo getABIReturnInfo, altering -// "default" types to ByVal when appropriate for simplicity. -static ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT) { - assert(!Ty->isArrayType() && - "Array types cannot be passed directly."); - ABIArgInfo Info = CGT.getABIInfo().classifyArgumentType(Ty, CGT.getContext()); - return Info; -} - /***/ CGFunctionInfo::CGFunctionInfo(QualType ResTy, |