ASTContext.h revision 7fb5e4888221cd36652d078c6b171ac55e7f406d
12edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar//===--- ASTContext.h - Context to hold long-lived AST nodes ----*- C++ -*-===// 22edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// 32edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// The LLVM Compiler Infrastructure 42edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// 52edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// This file is distributed under the University of Illinois Open Source 62edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// License. See LICENSE.TXT for details. 72edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// 82edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar//===----------------------------------------------------------------------===// 92edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// 102edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// This file defines the ASTContext interface. 112edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar// 122edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar//===----------------------------------------------------------------------===// 132edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 142edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#ifndef LLVM_CLANG_AST_ASTCONTEXT_H 152edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#define LLVM_CLANG_AST_ASTCONTEXT_H 162edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 172edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "clang/Basic/LangOptions.h" 182edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "clang/AST/Builtins.h" 192edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "clang/AST/DeclBase.h" 202edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "clang/AST/Type.h" 212edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "clang/Basic/SourceLocation.h" 22a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar#include "llvm/ADT/DenseMap.h" 232edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "llvm/ADT/FoldingSet.h" 242edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "llvm/Bitcode/SerializationFwd.h" 252edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "llvm/Support/Allocator.h" 262edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include <vector> 272edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 282edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarnamespace llvm { 292edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar struct fltSemantics; 302edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar} 31a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 322edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarnamespace clang { 332edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar class ASTRecordLayout; 342edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar class Expr; 352edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar class IdentifierTable; 362edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar class TargetInfo; 372edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar class SelectorTable; 382edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar class SourceManager; 39a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // Decls 40a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar class Decl; 41a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar class ObjCPropertyDecl; 42a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar class RecordDecl; 43a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar class TagDecl; 44a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar class TranslationUnitDecl; 45a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar class TypeDecl; 46a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar class TypedefDecl; 47a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 48a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar/// ASTContext - This class holds long-lived AST nodes (such as types and 49a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar/// decls) that can be referred to throughout the semantic analysis of a file. 50a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnarclass ASTContext { 51a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar std::vector<Type*> Types; 52a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::FoldingSet<ASQualType> ASQualTypes; 53a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::FoldingSet<ComplexType> ComplexTypes; 542edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar llvm::FoldingSet<PointerType> PointerTypes; 552edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar llvm::FoldingSet<BlockPointerType> BlockPointerTypes; 56a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::FoldingSet<ReferenceType> ReferenceTypes; 57a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::FoldingSet<ConstantArrayType> ConstantArrayTypes; 58a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::FoldingSet<IncompleteArrayType> IncompleteArrayTypes; 59a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar std::vector<VariableArrayType*> VariableArrayTypes; 60a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::FoldingSet<VectorType> VectorTypes; 61a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::FoldingSet<FunctionTypeNoProto> FunctionTypeNoProtos; 622edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar llvm::FoldingSet<FunctionTypeProto> FunctionTypeProtos; 632edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar llvm::FoldingSet<ObjCQualifiedInterfaceType> ObjCQualifiedInterfaceTypes; 642edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar llvm::FoldingSet<ObjCQualifiedIdType> ObjCQualifiedIdTypes; 652edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// ASTRecordLayouts - A cache mapping from RecordDecls to ASTRecordLayouts. 66a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// This is lazily created. This is intentionally not serialized. 67a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*> ASTRecordLayouts; 68a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::DenseMap<const ObjCInterfaceDecl*, 69a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const ASTRecordLayout*> ASTObjCInterfaces; 70a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 71a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// BuiltinVaListType - built-in va list type. 72a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// This is initially null and set by Sema::LazilyCreateBuiltin when 73a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// a builtin that takes a valist is encountered. 74a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType BuiltinVaListType; 75a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 76a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// ObjCIdType - a pseudo built-in typedef type (set by Sema). 77a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType ObjCIdType; 78a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const RecordType *IdStructType; 79a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 80a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// ObjCSelType - another pseudo built-in typedef type (set by Sema). 81a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType ObjCSelType; 82a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const RecordType *SelStructType; 83a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 84a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// ObjCProtoType - another pseudo built-in typedef type (set by Sema). 85a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType ObjCProtoType; 86a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const RecordType *ProtoStructType; 87a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 88a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// ObjCClassType - another pseudo built-in typedef type (set by Sema). 89a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType ObjCClassType; 90a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const RecordType *ClassStructType; 91a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 92a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType ObjCConstantStringType; 93a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar RecordDecl *CFConstantStringTypeDecl; 94a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 95a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar RecordDecl *ObjCFastEnumerationStateTypeDecl; 96a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 97a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar TranslationUnitDecl *TUDecl; 98a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 99a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// SourceMgr - The associated SourceManager object. 100a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar SourceManager &SourceMgr; 101a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 102a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// LangOpts - The language options used to create the AST associated with 103a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// this ASTContext object. 104a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar LangOptions LangOpts; 105a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 106a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// Allocator - The allocator object used to create AST objects. 107a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::MallocAllocator Allocator; 108a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 109a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnarpublic: 110a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar TargetInfo &Target; 111a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar IdentifierTable &Idents; 112a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar SelectorTable &Selectors; 113a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 114a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar SourceManager& getSourceManager() { return SourceMgr; } 115a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar llvm::MallocAllocator &getAllocator() { return Allocator; } 116a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const LangOptions& getLangOptions() const { return LangOpts; } 117a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 118a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar FullSourceLoc getFullLoc(SourceLocation Loc) const { 119a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return FullSourceLoc(Loc,SourceMgr); 120a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar } 121a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 122a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar TranslationUnitDecl *getTranslationUnitDecl() const { return TUDecl; } 123a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 124a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// This is intentionally not serialized. It is populated by the 125a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// ASTContext ctor, and there are no external pointers/references to 126a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// internal variables of BuiltinInfo. 127a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar Builtin::Context BuiltinInfo; 128a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 129a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // Builtin Types. 130a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType VoidTy; 131a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType BoolTy; 132a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType CharTy; 133a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType WCharTy; // [C++ 3.9.1p5] 134a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType SignedCharTy, ShortTy, IntTy, LongTy, LongLongTy; 135a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType UnsignedCharTy, UnsignedShortTy, UnsignedIntTy, UnsignedLongTy; 136a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType UnsignedLongLongTy; 137a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType FloatTy, DoubleTy, LongDoubleTy; 138a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType FloatComplexTy, DoubleComplexTy, LongDoubleComplexTy; 139a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType VoidPtrTy; 140a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType OverloadTy; 141a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 142a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar ASTContext(const LangOptions& LOpts, SourceManager &SM, TargetInfo &t, 143a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar IdentifierTable &idents, SelectorTable &sels, 144a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar unsigned size_reserve=0); 145a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 146a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar ~ASTContext(); 147a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 148a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void PrintStats() const; 149a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const std::vector<Type*>& getTypes() const { return Types; } 150a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 151a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar //===--------------------------------------------------------------------===// 152a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // Type Constructors 153a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar //===--------------------------------------------------------------------===// 154a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 155a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getASQualType - Return the uniqued reference to the type for an address 156a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// space qualified type with the specified type and address space. The 157a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// resulting type has a union of the qualifiers from T and the address space. 158a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // If T already has an address space specifier, it is silently replaced. 159a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getASQualType(QualType T, unsigned AddressSpace); 160a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 161a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getComplexType - Return the uniqued reference to the type for a complex 162a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// number with the specified element type. 163a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getComplexType(QualType T); 164a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 165a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getPointerType - Return the uniqued reference to the type for a pointer to 166a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// the specified type. 167a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getPointerType(QualType T); 168a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 169a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getBlockPointerType - Return the uniqued reference to the type for a block 170a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// of the specified type. 171a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getBlockPointerType(QualType T); 172a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 173a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getReferenceType - Return the uniqued reference to the type for a 174a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// reference to the specified type. 175a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getReferenceType(QualType T); 176a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 177a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getVariableArrayType - Returns a non-unique reference to the type for a 178a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// variable array of the specified element type. 179a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getVariableArrayType(QualType EltTy, Expr *NumElts, 180a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar ArrayType::ArraySizeModifier ASM, 181a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar unsigned EltTypeQuals); 182a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 183a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getIncompleteArrayType - Returns a unique reference to the type for a 184a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// incomplete array of the specified element type. 185a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getIncompleteArrayType(QualType EltTy, 186a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar ArrayType::ArraySizeModifier ASM, 187a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar unsigned EltTypeQuals); 188a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 189a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getConstantArrayType - Return the unique reference to the type for a 190a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// constant array of the specified element type. 191a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, 192a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar ArrayType::ArraySizeModifier ASM, 193a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar unsigned EltTypeQuals); 194a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 195a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getVectorType - Return the unique reference to a vector type of 196a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// the specified element type and size. VectorType must be a built-in type. 197a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getVectorType(QualType VectorType, unsigned NumElts); 198a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 199a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getExtVectorType - Return the unique reference to an extended vector type 200a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// of the specified element type and size. VectorType must be a built-in 201a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// type. 202a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getExtVectorType(QualType VectorType, unsigned NumElts); 203a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 204a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getFunctionTypeNoProto - Return a K&R style C function type like 'int()'. 205a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// 206a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getFunctionTypeNoProto(QualType ResultTy); 207a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 208a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getFunctionType - Return a normal function type with a typed argument 209a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// list. isVariadic indicates whether the argument list includes '...'. 210a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getFunctionType(QualType ResultTy, const QualType *ArgArray, 211a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar unsigned NumArgs, bool isVariadic, 212a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar unsigned TypeQuals); 213a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 214a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getTypeDeclType - Return the unique reference to the type for 215a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// the specified type declaration. 216a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getTypeDeclType(TypeDecl *Decl, TypeDecl* PrevDecl=0); 217a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 218a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getTypedefType - Return the unique reference to the type for the 219a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// specified typename decl. 220a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getTypedefType(TypedefDecl *Decl); 221a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCInterfaceType(ObjCInterfaceDecl *Decl); 222a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 223a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getObjCQualifiedInterfaceType - Return a 224a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// ObjCQualifiedInterfaceType type for the given interface decl and 225a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// the conforming protocol list. 226a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCQualifiedInterfaceType(ObjCInterfaceDecl *Decl, 227a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar ObjCProtocolDecl **ProtocolList, unsigned NumProtocols); 228a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 229a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getObjCQualifiedIdType - Return an ObjCQualifiedIdType for a 230a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// given 'id' and conforming protocol list. 231a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCQualifiedIdType(ObjCProtocolDecl **ProtocolList, 232a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar unsigned NumProtocols); 233a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 234a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 235a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getTypeOfType - GCC extension. 236a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getTypeOfExpr(Expr *e); 237a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getTypeOfType(QualType t); 238a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 239a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getTagDeclType - Return the unique reference to the type for the 240a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// specified TagDecl (struct/union/class/enum) decl. 241a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getTagDeclType(TagDecl *Decl); 242a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 243a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getSizeType - Return the unique type for "size_t" (C99 7.17), defined 244a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// in <stddef.h>. The sizeof operator requires this (C99 6.5.3.4p4). 245a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getSizeType() const; 246a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 247a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getWCharType - Return the unique type for "wchar_t" (C99 7.17), defined 248a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// in <stddef.h>. Wide strings require this (C99 6.4.5p5). 249a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getWCharType() const; 250a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 251a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getSignedWCharType - Return the type of "signed wchar_t". 252a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// Used when in C++, as a GCC extension. 253a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getSignedWCharType() const; 254a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 255a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getUnsignedWCharType - Return the type of "unsigned wchar_t". 256a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// Used when in C++, as a GCC extension. 257a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getUnsignedWCharType() const; 258a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 259a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getPointerDiffType - Return the unique type for "ptrdiff_t" (ref?) 260a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9). 261a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getPointerDiffType() const; 262a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 263a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // getCFConstantStringType - Return the C structure type used to represent 264a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // constant CFStrings. 265a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getCFConstantStringType(); 266a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 267a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // This setter/getter represents the ObjC type for an NSConstantString. 268a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl); 269a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCConstantStringInterface() const { 270a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return ObjCConstantStringType; 271a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar } 272a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 273a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar //// This gets the struct used to keep track of fast enumerations. 274a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCFastEnumerationStateType(); 275a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 276a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getObjCEncodingForType - Emit the ObjC type encoding for the 277a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// given type into \arg S. If \arg NameFields is specified then 278a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// record field names are also encoded. 279a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void getObjCEncodingForType(QualType t, std::string &S, 280a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar bool NameFields=false) const; 281a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 282a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // Put the string version of type qualifiers into S. 283a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, 284a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar std::string &S) const; 285a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 286a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getObjCEncodingForMethodDecl - Return the encoded type for this method 287a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// declaration. 288a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, std::string &S); 289a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 290a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getObjCEncodingForPropertyDecl - Return the encoded type for 291a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// this method declaration. If non-NULL, Container must be either 292a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// an ObjCCategoryImplDecl or ObjCImplementationDecl; it should 293a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// only be NULL when getting encodings for protocol properties. 294a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, 295a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const Decl *Container, 296a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar std::string &S); 297a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 298a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getObjCEncodingTypeSize returns size of type for objective-c encoding 299a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// purpose. 300a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar int getObjCEncodingTypeSize(QualType t); 301a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 302a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// This setter/getter represents the ObjC 'id' type. It is setup lazily, by 303a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// Sema. id is always a (typedef for a) pointer type, a pointer to a struct. 304a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCIdType() const { return ObjCIdType; } 305a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void setObjCIdType(TypedefDecl *Decl); 306a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 307a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void setObjCSelType(TypedefDecl *Decl); 308a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCSelType() const { return ObjCSelType; } 309a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 310a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void setObjCProtoType(QualType QT); 311a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCProtoType() const { return ObjCProtoType; } 312a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 313a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// This setter/getter repreents the ObjC 'Class' type. It is setup lazily, by 314a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// Sema. 'Class' is always a (typedef for a) pointer type, a pointer to a 315a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// struct. 316a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getObjCClassType() const { return ObjCClassType; } 317a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void setObjCClassType(TypedefDecl *Decl); 318a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 319a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar void setBuiltinVaListType(QualType T); 320a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar QualType getBuiltinVaListType() const { return BuiltinVaListType; } 321a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 322a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar //===--------------------------------------------------------------------===// 323a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // Type Predicates. 324a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar //===--------------------------------------------------------------------===// 325a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 326a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// isObjCObjectPointerType - Returns true if type is an Objective-C pointer 327a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// to an object type. This includes "id" and "Class" (two 'special' pointers 328a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// to struct), Interface* (pointer to ObjCInterfaceType) and id<P> (qualified 329a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// ID type). 330a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar bool isObjCObjectPointerType(QualType Ty) const; 331a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 332a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar //===--------------------------------------------------------------------===// 333a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // Type Sizing and Analysis 334a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar //===--------------------------------------------------------------------===// 335a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 336a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified 337a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// scalar floating point type. 338a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const llvm::fltSemantics &getFloatTypeSemantics(QualType T) const; 339a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 340a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getTypeInfo - Get the size and alignment of the specified complete type in 341a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// bits. 342a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar std::pair<uint64_t, unsigned> getTypeInfo(QualType T); 343a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 344a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// getTypeSize - Return the size of the specified type, in bits. This method 345a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar /// does not work on incomplete types. 346a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar uint64_t getTypeSize(QualType T) { 347a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return getTypeInfo(T).first; 348a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar } 3492edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 3502edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// getTypeAlign - Return the alignment of the specified type, in bits. This 3512edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// method does not work on incomplete types. 3522edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar unsigned getTypeAlign(QualType T) { 3532edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return getTypeInfo(T).second; 3542edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar } 3552edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 3562edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// getASTRecordLayout - Get or compute information about the layout of the 3572edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// specified record (struct/union/class), which indicates its size and field 3582edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// position information. 3592edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D); 3602edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 3612edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const ASTRecordLayout &getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D); 3622edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 3632edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Type Operators 3642edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 3652edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 3662edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// getCanonicalType - Return the canonical (structural) type corresponding to 3672edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// the specified potentially non-canonical type. The non-canonical version 3682edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// of a type may have many "decorated" versions of types. Decorators can 3692edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// include typedefs, 'typeof' operators, etc. The returned type is guaranteed 3702edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// to be free of any of these, allowing two canonical types to be compared 3712edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// for exact equality with a simple pointer comparison. 3722edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar QualType getCanonicalType(QualType T); 3732edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 3742edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// Type Query functions. If the type is an instance of the specified class, 3752edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// return the Type pointer for the underlying maximally pretty type. This 3762edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// is a member of ASTContext because this may need to do some amount of 3772edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// canonicalization, e.g. to move type qualifiers into the element type. 3782edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const ArrayType *getAsArrayType(QualType T); 3792edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const ConstantArrayType *getAsConstantArrayType(QualType T) { 3802edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return dyn_cast_or_null<ConstantArrayType>(getAsArrayType(T)); 3812edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar } 3822edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const VariableArrayType *getAsVariableArrayType(QualType T) { 3832edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return dyn_cast_or_null<VariableArrayType>(getAsArrayType(T)); 3842edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar } 3852edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const IncompleteArrayType *getAsIncompleteArrayType(QualType T) { 3862edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return dyn_cast_or_null<IncompleteArrayType>(getAsArrayType(T)); 3872edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar } 3882edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 3892edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// getArrayDecayedType - Return the properly qualified result of decaying the 3902edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// specified array type to a pointer. This operation is non-trivial when 3912edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// handling typedefs etc. The canonical type of "T" must be an array type, 3922edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// this returns a pointer to a properly qualified element of the array. 3932edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// 3942edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// See C99 6.7.5.3p7 and C99 6.3.2.1p3. 3952edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar QualType getArrayDecayedType(QualType T); 3962edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 3972edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// getIntegerTypeOrder - Returns the highest ranked integer type: 3982edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If 3992edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// LHS < RHS, return -1. 4002edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar int getIntegerTypeOrder(QualType LHS, QualType RHS); 4012edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4022edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// getFloatingTypeOrder - Compare the rank of the two specified floating 4032edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// point types, ignoring the domain of the type (i.e. 'double' == 4042edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If 4052edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// LHS < RHS, return -1. 4062edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar int getFloatingTypeOrder(QualType LHS, QualType RHS); 4072edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4082edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// getFloatingTypeOfSizeWithinDomain - Returns a real floating 4092edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// point or a complex type (based on typeDomain/typeSize). 4102edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// 'typeDomain' is a real floating point or complex type. 4112edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// 'typeSize' is a real floating point or complex type. 4122edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar QualType getFloatingTypeOfSizeWithinDomain(QualType typeSize, 4132edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar QualType typeDomain) const; 4142edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4152edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 4162edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Type Compatibility Predicates 4172edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 4182edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4192edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// Compatibility predicates used to check assignment expressions. 4202edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool typesAreCompatible(QualType, QualType); // C99 6.2.7p1 4212edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool typesAreBlockCompatible(QualType lhs, QualType rhs); 4222edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4232edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool isObjCIdType(QualType T) const { 4242edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar if (!IdStructType) // ObjC isn't enabled 4252edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return false; 4262edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return T->getAsStructureType() == IdStructType; 4272edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar } 4282edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool isObjCClassType(QualType T) const { 4292edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar if (!ClassStructType) // ObjC isn't enabled 4302edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return false; 4312edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return T->getAsStructureType() == ClassStructType; 4322edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar } 4332edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool isObjCSelType(QualType T) const { 4342edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar assert(SelStructType && "isObjCSelType used before 'SEL' type is built"); 4352edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return T->getAsStructureType() == SelStructType; 4362edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar } 4372edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4382edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Check the safety of assignment from LHS to RHS 4392edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool canAssignObjCInterfaces(const ObjCInterfaceType *LHS, 4402edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const ObjCInterfaceType *RHS); 4412edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4422edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Functions for calculating composite types 4432edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar QualType mergeTypes(QualType, QualType); 4442edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar QualType mergeFunctionTypes(QualType, QualType); 4452edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4462edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 4472edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Integer Predicates 4482edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 4492edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4502edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // The width of an integer, as defined in C99 6.2.6.2. This is the number 4512edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // of bits in an integer type excluding any padding bits. 4522edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar unsigned getIntWidth(QualType T); 4532edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4542edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Per C99 6.2.5p6, for every signed integer type, there is a corresponding 4552edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // unsigned integer type. This method takes a signed type, and returns the 4562edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // corresponding unsigned integer type. 4572edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar QualType getCorrespondingUnsignedType(QualType T); 4582edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4592edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 4602edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Type Iterators. 4612edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 4622edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4632edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar typedef std::vector<Type*>::iterator type_iterator; 4642edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar typedef std::vector<Type*>::const_iterator const_type_iterator; 4652edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4662edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar type_iterator types_begin() { return Types.begin(); } 4672edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar type_iterator types_end() { return Types.end(); } 4682edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const_type_iterator types_begin() const { return Types.begin(); } 4692edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const_type_iterator types_end() const { return Types.end(); } 4702edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4712edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 4722edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Serialization 4732edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar //===--------------------------------------------------------------------===// 4742edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4752edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar void Emit(llvm::Serializer& S) const; 4762edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar static ASTContext* Create(llvm::Deserializer& D); 4772edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4782edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarprivate: 4792edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar ASTContext(const ASTContext&); // DO NOT IMPLEMENT 4802edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar void operator=(const ASTContext&); // DO NOT IMPLEMENT 4812edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4822edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar void InitBuiltinTypes(); 4832edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar void InitBuiltinType(QualType &R, BuiltinType::Kind K); 4842edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4852edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// setRecordDefinition - Used by RecordDecl::defineBody to inform ASTContext 4862edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// about which RecordDecl serves as the definition of a particular 4872edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar /// struct/union/class. This will eventually be used by enums as well. 4882edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar void setTagDefinition(TagDecl* R); 4892edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar friend class RecordDecl; 4902edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4912edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar // Return the ObjC type encoding for a given type. 4922edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar void getObjCEncodingForTypeImpl(QualType t, std::string &S, 4932edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool ExpandPointedToStructures, 4942edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool ExpandStructures, 4952edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar bool NameFields) const; 4962edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4972edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar}; 4982edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 4992edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar} // end namespace clang 5002edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar 5012edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#endif 5022edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar