]> granicus.if.org Git - clang/blob - lib/CodeGen/CGCall.h
Unbreak CGFunctionInfo::Profile method and reenable caching of ABI
[clang] / lib / CodeGen / CGCall.h
1 //===----- CGCall.h - Encapsulate calling convention details ----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // These classes wrap the information about a call or function
11 // definition used to handle ABI compliancy.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef CLANG_CODEGEN_CGCALL_H
16 #define CLANG_CODEGEN_CGCALL_H
17
18 #include <llvm/ADT/FoldingSet.h>
19 #include "clang/AST/Type.h"
20
21 #include "CGValue.h"
22
23 // FIXME: Restructure so we don't have to expose so much stuff.
24 #include "ABIInfo.h"
25
26 namespace llvm {
27   struct AttributeWithIndex;
28   class Function;
29   class Type;
30   class Value;
31
32   template<typename T, unsigned> class SmallVector;
33 }
34
35 namespace clang {
36   class ASTContext;
37   class Decl;
38   class FunctionDecl;
39   class ObjCMethodDecl;
40   class VarDecl;
41
42 namespace CodeGen {
43   typedef llvm::SmallVector<llvm::AttributeWithIndex, 8> AttributeListType;
44
45   /// CallArgList - Type for representing both the value and type of
46   /// arguments in a call.
47   typedef llvm::SmallVector<std::pair<RValue, QualType>, 16> CallArgList;
48
49   /// FunctionArgList - Type for representing both the decl and type
50   /// of parameters to a function. The decl must be either a
51   /// ParmVarDecl or ImplicitParamDecl.
52   typedef llvm::SmallVector<std::pair<const VarDecl*, QualType>, 
53                             16> FunctionArgList;
54   
55   /// CGFunctionInfo - Class to encapsulate the information about a
56   /// function definition.
57   class CGFunctionInfo : public llvm::FoldingSetNode {
58     struct ArgInfo {
59       QualType type;
60       ABIArgInfo info;
61     };
62
63     unsigned NumArgs;
64     ArgInfo *Args;
65
66   public:
67     typedef const ArgInfo *const_arg_iterator;
68     typedef ArgInfo *arg_iterator;
69
70     CGFunctionInfo(QualType ResTy, 
71                    const llvm::SmallVector<QualType, 16> &ArgTys);
72     ~CGFunctionInfo() { delete[] Args; }
73
74     const_arg_iterator arg_begin() const { return Args + 1; }
75     const_arg_iterator arg_end() const { return Args + 1 + NumArgs; }
76     arg_iterator arg_begin() { return Args + 1; }
77     arg_iterator arg_end() { return Args + 1 + NumArgs; }
78
79     unsigned  arg_size() const { return NumArgs; }
80
81     QualType getReturnType() const { return Args[0].type; }
82
83     ABIArgInfo &getReturnInfo() { return Args[0].info; }
84     const ABIArgInfo &getReturnInfo() const { return Args[0].info; }
85
86     void Profile(llvm::FoldingSetNodeID &ID) {
87       getReturnType().Profile(ID);
88       for (arg_iterator it = arg_begin(), ie = arg_end(); it != ie; ++it)
89         it->type.Profile(ID);
90     }
91     template<class Iterator>
92     static void Profile(llvm::FoldingSetNodeID &ID, 
93                         QualType ResTy,
94                         Iterator begin,
95                         Iterator end) {
96       ResTy.Profile(ID);
97       for (; begin != end; ++begin)
98         begin->Profile(ID);
99     }
100   };
101 }  // end namespace CodeGen
102 }  // end namespace clang
103
104 #endif