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 105