ASTContext.h revision 7ed05071969757ef84d7fd43168a82cb46d610fd
125e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//===--- ASTContext.h - Context to hold long-lived AST nodes ----*- C++ -*-===// 225e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// 325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// The LLVM Compiler Infrastructure 425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// 525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// This file was developed by Chris Lattner and is distributed under 625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// the University of Illinois Open Source License. See LICENSE.TXT for details. 725e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar// 825e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar//===----------------------------------------------------------------------===// 9e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner// 10e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner// This file defines the ASTContext interface. 11e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner// 12e18e0c58dcd740c64e962fefde44249d685d0568Chris Lattner//===----------------------------------------------------------------------===// 1325e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 1425e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#ifndef LLVM_CLANG_AST_ASTCONTEXT_H 1525e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar#define LLVM_CLANG_AST_ASTCONTEXT_H 1625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbar 17255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "clang/AST/Builtins.h" 18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "clang/AST/Expr.h" 1977afbdce53aa740777486b0cc4e9df151ae65468Jack Carter#include "clang/AST/RecordLayout.h" 20a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner#include "clang/AST/Type.h" 2189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola#include "llvm/ADT/DenseMap.h" 220855bc5b973320052c87bdcc2fa17b9711edc3deCharles Davis#include "llvm/ADT/StringMap.h" 23255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/FoldingSet.h" 24cddd236e8a5acb80e9a0e79dc63f6cfaa8205b86Daniel Dunbar#include <vector> 2584a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar 2625e0d8f755736b0a17400adbdd367aee89fbecfcDaniel Dunbarnamespace clang { 27baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling class TargetInfo; 28baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling class IdentifierTable; 29baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 30baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// ASTContext - This class holds long-lived AST nodes (such as types and 31baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling/// decls) that can be referred to throughout the semantic analysis of a file. 32baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingclass ASTContext { 33baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::vector<Type*> Types; 34320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola llvm::FoldingSet<ComplexType> ComplexTypes; 35baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling llvm::FoldingSet<PointerType> PointerTypes; 36baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling llvm::FoldingSet<ReferenceType> ReferenceTypes; 37baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling llvm::FoldingSet<ConstantArrayType> ArrayTypes; 38baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling llvm::FoldingSet<VariableArrayType> IncompleteVariableArrayTypes; 39baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling llvm::FoldingSet<VectorType> VectorTypes; 40baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling llvm::FoldingSet<FunctionTypeNoProto> FunctionTypeNoProtos; 41baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling llvm::FoldingSet<FunctionTypeProto> FunctionTypeProtos; 42baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling llvm::FoldingSet<ObjcQualifiedInterfaceType> ObjcQualifiedInterfaceTypes; 43320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola llvm::DenseMap<const RecordDecl*, const RecordLayout*> RecordLayoutInfo; 44320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 45320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// BuiltinVaListType - built-in va list type. 46320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// This is initially null and set by Sema::LazilyCreateBuiltin when 47320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// a builtin that takes a valist is encountered. 48320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType BuiltinVaListType; 49320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 50320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// ObjcIdType - a psuedo built-in typedef type (set by Sema). 51320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType ObjcIdType; 52320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola const RecordType *IdStructType; 53320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 54320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// ObjcSelType - another psuedo built-in typedef type (set by Sema). 55320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType ObjcSelType; 56320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola const RecordType *SelStructType; 57320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 58320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// ObjcProtoType - another psuedo built-in typedef type (set by Sema). 59320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType ObjcProtoType; 60320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola const RecordType *ProtoStructType; 61320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 62320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType ObjcConstantStringType; 63320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola RecordDecl *CFConstantStringTypeDecl; 64320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolapublic: 65320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 66320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola SourceManager &SourceMgr; 67320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola TargetInfo &Target; 68320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola IdentifierTable &Idents; 69320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola SelectorTable &Selectors; 70320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola Builtin::Context BuiltinInfo; 71320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 72320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola // Builtin Types. 73320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType VoidTy; 74320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType BoolTy; 75320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType CharTy; 76320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType SignedCharTy, ShortTy, IntTy, LongTy, LongLongTy; 77320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType UnsignedCharTy, UnsignedShortTy, UnsignedIntTy, UnsignedLongTy; 78320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType UnsignedLongLongTy; 79320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType FloatTy, DoubleTy, LongDoubleTy; 80320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType FloatComplexTy, DoubleComplexTy, LongDoubleComplexTy; 81320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType VoidPtrTy; 82320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 83320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola ASTContext(SourceManager &SM, TargetInfo &t, IdentifierTable &idents, 84320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola SelectorTable &sels) : 85320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola CFConstantStringTypeDecl(0), SourceMgr(SM), Target(t), 86320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola Idents(idents), Selectors(sels) { 87320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola InitBuiltinTypes(); 88320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola BuiltinInfo.InitializeBuiltins(idents, Target); 89320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola } 90320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola ~ASTContext(); 91320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 92baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void PrintStats() const; 93baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 94baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling //===--------------------------------------------------------------------===// 95baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // Type Constructors 96baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling //===--------------------------------------------------------------------===// 97baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 98baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getComplexType - Return the uniqued reference to the type for a complex 99baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// number with the specified element type. 100baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getComplexType(QualType T); 101baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 102baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getPointerType - Return the uniqued reference to the type for a pointer to 103320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// the specified type. 10489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola QualType getPointerType(QualType T); 105baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 106baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getReferenceType - Return the uniqued reference to the type for a 107dda1bdc962a314bf4fca86f4cd4802ff6c55b172Bill Wendling /// reference to the specified type. 108baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getReferenceType(QualType T); 109baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 11038ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis /// getVariableArrayType - Returns a non-unique reference to the type for a 111baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// variable array of the specified element type. 112baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getVariableArrayType(QualType EltTy, Expr *NumElts, 113baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ArrayType::ArraySizeModifier ASM, 114baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned EltTypeQuals); 11538ea9eecd7c810e11f96c8306b241f9db88fc62fCharles Davis 116baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getConstantArrayType - Return the unique reference to the type for a 117baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// constant array of the specified element type. 118baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, 119baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ArrayType::ArraySizeModifier ASM, 12084a2926fb7ab388d688a133b0b375a26e669fd55Daniel Dunbar unsigned EltTypeQuals); 121baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 1227768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// getVectorType - Return the unique reference to a vector type of 1235cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// the specified element type and size. VectorType must be a built-in type. 1245cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton QualType getVectorType(QualType VectorType, unsigned NumElts); 1255cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 1265cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// getOCUVectorType - Return the unique reference to an OCU vector type of 127baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// the specified element type and size. VectorType must be a built-in type. 128baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getOCUVectorType(QualType VectorType, unsigned NumElts); 129baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 1307768a9dce14431018133cd586f5c8ce3e057f069Rafael Espindola /// getFunctionTypeNoProto - Return a K&R style C function type like 'int()'. 131baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 132df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne QualType getFunctionTypeNoProto(QualType ResultTy); 133baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 134320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// getFunctionType - Return a normal function type with a typed argument 135df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne /// list. isVariadic indicates whether the argument list includes '...'. 136baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getFunctionType(QualType ResultTy, QualType *ArgArray, 137baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned NumArgs, bool isVariadic); 1381674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer 139baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getTypedefType - Return the unique reference to the type for the 1400dd2c9331887b9d0aa06b1e201c5eda4361365fcJim Grosbach /// specified typename decl. 141baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getTypedefType(TypedefDecl *Decl); 142baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getObjcInterfaceType(ObjcInterfaceDecl *Decl); 143baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 144baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getObjcQualifiedInterfaceType - Return a 145da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling /// ObjcQualifiedInterfaceType type for the given interface decl and 146410ef2b263e92d3de1b2acff7437059400daed7dCharles Davis /// the conforming protocol list. 147baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getObjcQualifiedInterfaceType(ObjcInterfaceDecl *Decl, 148baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ObjcProtocolDecl **ProtocolList, unsigned NumProtocols); 149baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 150baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getTypeOfType - GCC extension. 15107f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames QualType getTypeOfExpr(Expr *e); 152baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getTypeOfType(QualType t); 153baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 154baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getTagDeclType - Return the unique reference to the type for the 155baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// specified TagDecl (struct/union/class/enum) decl. 156baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getTagDeclType(TagDecl *Decl); 157baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 158baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getSizeType - Return the unique type for "size_t" (C99 7.17), defined 159baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// in <stddef.h>. The sizeof operator requires this (C99 6.5.3.4p4). 160baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getSizeType() const; 161320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 162320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// getPointerDiffType - Return the unique type for "ptrdiff_t" (ref?) 163320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola /// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9). 164320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola QualType getPointerDiffType() const; 165320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 166baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // getCFConstantStringType - Return the type used for constant CFStrings. 167baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // CURRENTLY UNUSED (10/15/07). ObjCStringLiteral now uses the hook below. 168baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getCFConstantStringType(); 169baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 170baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // This setter/getter represents the ObjC type for an NSConstantString. 171baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setObjcConstantStringInterface(ObjcInterfaceDecl *Decl); 172baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getObjcConstantStringInterface() const { 173baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return ObjcConstantStringType; 174baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 175baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 176baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // Return the ObjC type encoding for a given type. 17707f6a4fde0a1b081fbefd986345c9b2f4f85e88aLang Hames void getObjcEncodingForType(QualType t, std::string &S) const; 178da11df0c22f5d0ba2e2be3ae4a7076c806233db8Bill Wendling 179c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling /// getObjcEncodingForMethodDecl - Return the encoded type for this method 180baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// declaration. 181baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void getObjcEncodingForMethodDecl(ObjcMethodDecl *Decl, std::string &S); 182baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 183baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getObjcEncodingTypeSize returns size of type for objective-c encoding 184baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// purpose. 185baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling int getObjcEncodingTypeSize(QualType t); 186baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 187baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // This setter/getter repreents the ObjC 'id' type. It is setup lazily, by 188baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // Sema. 189baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setObjcIdType(TypedefDecl *Decl); 190baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getObjcIdType() const { return ObjcIdType; } 191baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 192baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setObjcSelType(TypedefDecl *Decl); 193baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getObjcSelType() const { return ObjcSelType; } 194baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 195baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setObjcProtoType(TypedefDecl *Decl); 196baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getObjcProtoType() const { return ObjcProtoType; } 197baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 198baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void setBuiltinVaListType(QualType T); 199baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getBuiltinVaListType() const { return BuiltinVaListType; } 200baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 201baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling //===--------------------------------------------------------------------===// 202baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // Type Sizing and Analysis 203baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling //===--------------------------------------------------------------------===// 204baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 205baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getTypeInfo - Get the size and alignment of the specified complete type in 206baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// bits. 207baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling std::pair<uint64_t, unsigned> getTypeInfo(QualType T, SourceLocation L); 208baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 209baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getTypeSize - Return the size of the specified type, in bits. This method 210baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// does not work on incomplete types. 211baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling uint64_t getTypeSize(QualType T, SourceLocation L) { 212baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return getTypeInfo(T, L).first; 213baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 214baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 215baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getTypeAlign - Return the alignment of the specified type, in bits. This 216baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// method does not work on incomplete types. 217baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling unsigned getTypeAlign(QualType T, SourceLocation L) { 218baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return getTypeInfo(T, L).second; 219baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 220baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 221baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getRecordLayout - Get or compute information about the layout of the 222baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// specified record (struct/union/class), which indicates its size and field 223baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// position information. 224baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling const RecordLayout &getRecordLayout(const RecordDecl *D, SourceLocation L); 225baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 226baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling //===--------------------------------------------------------------------===// 227baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // Type Operators 228baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling //===--------------------------------------------------------------------===// 2295cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 2305cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// maxIntegerType - Returns the highest ranked integer type. Handles 3 2315cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// different type combos: unsigned/unsigned, signed/signed, signed/unsigned. 2325cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton static QualType maxIntegerType(QualType lhs, QualType rhs); 2335cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton 2345cc319a42a914b24b164a94d9a563c728a7a4026Richard Mitton /// compareFloatingType - Handles 3 different combos: 235baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// float/float, float/complex, complex/complex. 236baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// If lt > rt, return 1. If lt == rt, return 0. If lt < rt, return -1. 237baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling static int compareFloatingType(QualType lt, QualType rt); 238baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 239baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// getFloatingTypeOfSizeWithinDomain - Returns a real floating 240baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// point or a complex type (based on typeDomain/typeSize). 241baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 'typeDomain' is a real floating point or complex type. 242baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// 'typeSize' is a real floating point or complex type. 243baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType getFloatingTypeOfSizeWithinDomain(QualType typeSize, 244baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling QualType typeDomain) const; 245baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 246baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling //===--------------------------------------------------------------------===// 247baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling // Type Compatibility Predicates 248baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling //===--------------------------------------------------------------------===// 249baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 250baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Compatibility predicates used to check assignment expressions. 251baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool typesAreCompatible(QualType, QualType); // C99 6.2.7p1 252baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool tagTypesAreCompatible(QualType, QualType); // C99 6.2.7p1 253baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool pointerTypesAreCompatible(QualType, QualType); // C99 6.7.5.1p2 254baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool referenceTypesAreCompatible(QualType, QualType); // C++ 5.17p6 255baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool functionTypesAreCompatible(QualType, QualType); // C99 6.7.5.3p15 256baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool arrayTypesAreCompatible(QualType, QualType); // C99 6.7.5.2p6 257baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool builtinTypesAreCompatible(QualType, QualType); 258baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 259baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling /// Objective-C specific type checking. 260baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool interfaceTypesAreCompatible(QualType, QualType); 261baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool objcTypesAreCompatible(QualType, QualType); 262baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling bool isObjcIdType(QualType T) const { 263baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling assert(IdStructType && "isObjcIdType used before 'id' type is built"); 264baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling return T->getAsStructureType() == IdStructType; 265baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling } 266baaefaf828beb3527a3554af99505822fd4dfabfBill Wendlingprivate: 267baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling ASTContext(const ASTContext&); // DO NOT IMPLEMENT 268baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void operator=(const ASTContext&); // DO NOT IMPLEMENT 269baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 270baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void InitBuiltinTypes(); 271baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling void InitBuiltinType(QualType &R, BuiltinType::Kind K); 272baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling}; 273baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 274baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling} // end namespace clang 275baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling 276baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling#endif 277baaefaf828beb3527a3554af99505822fd4dfabfBill Wendling