[cfe-commits] r63610 - in /cfe/trunk/lib/CodeGen: ABIInfo.h CGCall.cpp CGCall.h

Daniel Dunbar daniel at zuster.org
Mon Feb 2 21:31:23 PST 2009


Author: ddunbar
Date: Mon Feb  2 23:31:23 2009
New Revision: 63610

URL: http://llvm.org/viewvc/llvm-project?rev=63610&view=rev
Log:
Move ABIArgInfo into CGFunctionInfo, computed on creation.
 - Still have to convert some consumers over.

Modified:
    cfe/trunk/lib/CodeGen/ABIInfo.h
    cfe/trunk/lib/CodeGen/CGCall.cpp
    cfe/trunk/lib/CodeGen/CGCall.h

Modified: cfe/trunk/lib/CodeGen/ABIInfo.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ABIInfo.h?rev=63610&r1=63609&r2=63610&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/ABIInfo.h (original)
+++ cfe/trunk/lib/CodeGen/ABIInfo.h Mon Feb  2 23:31:23 2009
@@ -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 @@
                                 TypeData(TD),
                                 UIntData(0) {}
   public:
+    ABIArgInfo() : TheKind(Default), TypeData(0), UIntData(0) {}
+
     static ABIArgInfo getDefault() { 
       return ABIArgInfo(Default); 
     }

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=63610&r1=63609&r2=63610&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Mon Feb  2 23:31:23 2009
@@ -87,6 +87,9 @@
   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.
@@ -98,25 +101,17 @@
   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<QualType, 16> &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 @@
 
 /***/
 
+CGFunctionInfo::CGFunctionInfo(QualType ResTy, 
+                               const llvm::SmallVector<QualType, 16> &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<const llvm::Type*> &ArgTys) {
   const RecordType *RT = Ty->getAsStructureType();
@@ -846,7 +852,7 @@
   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 @@
     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 @@
       break;
      
     case ABIArgInfo::Expand:
-      GetExpandedTypes(*it, ArgTys);
+      GetExpandedTypes(it->type, ArgTys);
       break;
     }
   }
@@ -988,11 +994,11 @@
 
   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:

Modified: cfe/trunk/lib/CodeGen/CGCall.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.h?rev=63610&r1=63609&r2=63610&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.h (original)
+++ cfe/trunk/lib/CodeGen/CGCall.h Mon Feb  2 23:31:23 2009
@@ -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<typename T, unsigned> class SmallVector;
@@ -51,21 +55,35 @@
   /// CGFunctionInfo - Class to encapsulate the information about a
   /// function definition.
   class CGFunctionInfo : public llvm::FoldingSetNode {
-    llvm::SmallVector<QualType, 16> ArgTypes;
+    struct ArgInfo {
+      QualType type;
+      ABIArgInfo info;
+    };
+
+    unsigned NumArgs;
+    ArgInfo *Args;
 
   public:
-    typedef llvm::SmallVector<QualType, 16>::const_iterator arg_iterator;
+    typedef const ArgInfo *const_arg_iterator;
+    typedef ArgInfo *arg_iterator;
 
     CGFunctionInfo(QualType ResTy, 
                    const llvm::SmallVector<QualType, 16> &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<class Iterator>
     static void Profile(llvm::FoldingSetNodeID &ID, 





More information about the cfe-commits mailing list