]> granicus.if.org Git - clang/commitdiff
Change ABIInfo to compute information for a full signature at a time
authorDaniel Dunbar <daniel@zuster.org>
Tue, 3 Feb 2009 06:51:18 +0000 (06:51 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 3 Feb 2009 06:51:18 +0000 (06:51 +0000)
(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
lib/CodeGen/CGCall.cpp

index 83348d27655e3bd0af77d2026ef74ce19b8c0be8..a2d80ed78cadc8619508636a415fbe6c8420e378 100644 (file)
@@ -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
 
index 6f7d6f696fcc41de2f0b214a656029530f46c018..f80ae0dc90f3274e1af8e85ae43606975f3a8b10 100644 (file)
@@ -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,