From 6bad2658b48264629db595f944a3fbe07f61b4e9 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Tue, 3 Feb 2009 06:51:18 +0000 Subject: [PATCH] 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 --- lib/CodeGen/ABIInfo.h | 17 +++++---- lib/CodeGen/CGCall.cpp | 79 ++++++++++++++++++++---------------------- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/lib/CodeGen/ABIInfo.h b/lib/CodeGen/ABIInfo.h index 83348d2765..a2d80ed78c 100644 --- a/lib/CodeGen/ABIInfo.h +++ b/lib/CodeGen/ABIInfo.h @@ -15,6 +15,14 @@ namespace llvm { } namespace clang { + class ASTContext; + + // FIXME: This is a layering issue if we want to move ABIInfo + // down. Fortunately CGFunctionInfo has no real tie to CodeGen. + namespace CodeGen { + class CGFunctionInfo; + } + /* 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 the targets to support this, since the Targets currently live in a @@ -112,12 +120,9 @@ namespace clang { class ABIInfo { public: virtual ~ABIInfo(); - - virtual ABIArgInfo classifyReturnType(QualType RetTy, - ASTContext &Context) const = 0; - - virtual ABIArgInfo classifyArgumentType(QualType Ty, - ASTContext &Context) const = 0; + + virtual void computeInfo(CodeGen::CGFunctionInfo &FI, + ASTContext &Ctx) const = 0; }; } // end namespace clang 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 &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, -- 2.40.0