1 //===--- CodeGenTypeCache.h - Commonly used LLVM types and info -*- 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 // This structure provides a set of common types useful during IR emission. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENTYPECACHE_H 15 #define LLVM_CLANG_LIB_CODEGEN_CODEGENTYPECACHE_H 16 17 #include "clang/AST/CharUnits.h" 18 #include "llvm/IR/CallingConv.h" 19 20 namespace llvm { 21 class Type; 22 class IntegerType; 23 class PointerType; 24 } 25 26 namespace clang { 27 namespace CodeGen { 28 29 /// This structure provides a set of types that are commonly used 30 /// during IR emission. It's initialized once in CodeGenModule's 31 /// constructor and then copied around into new CodeGenFunctions. 32 struct CodeGenTypeCache { 33 /// void 34 llvm::Type *VoidTy; 35 36 /// i8, i16, i32, and i64 37 llvm::IntegerType *Int8Ty, *Int16Ty, *Int32Ty, *Int64Ty; 38 /// float, double 39 llvm::Type *FloatTy, *DoubleTy; 40 41 /// int 42 llvm::IntegerType *IntTy; 43 44 /// intptr_t, size_t, and ptrdiff_t, which we assume are the same size. 45 union { 46 llvm::IntegerType *IntPtrTy; 47 llvm::IntegerType *SizeTy; 48 llvm::IntegerType *PtrDiffTy; 49 }; 50 51 /// void* in address space 0 52 union { 53 llvm::PointerType *VoidPtrTy; 54 llvm::PointerType *Int8PtrTy; 55 }; 56 57 /// void** in address space 0 58 union { 59 llvm::PointerType *VoidPtrPtrTy; 60 llvm::PointerType *Int8PtrPtrTy; 61 }; 62 63 /// The size and alignment of the builtin C type 'int'. This comes 64 /// up enough in various ABI lowering tasks to be worth pre-computing. 65 union { 66 unsigned char IntSizeInBytes; 67 unsigned char IntAlignInBytes; 68 }; getIntSizeCodeGenTypeCache69 CharUnits getIntSize() const { 70 return CharUnits::fromQuantity(IntSizeInBytes); 71 } getIntAlignCodeGenTypeCache72 CharUnits getIntAlign() const { 73 return CharUnits::fromQuantity(IntAlignInBytes); 74 } 75 76 /// The width of a pointer into the generic address space. 77 unsigned char PointerWidthInBits; 78 79 /// The size and alignment of a pointer into the generic address space. 80 union { 81 unsigned char PointerAlignInBytes; 82 unsigned char PointerSizeInBytes; 83 unsigned char SizeSizeInBytes; // sizeof(size_t) 84 unsigned char SizeAlignInBytes; 85 }; getSizeSizeCodeGenTypeCache86 CharUnits getSizeSize() const { 87 return CharUnits::fromQuantity(SizeSizeInBytes); 88 } getSizeAlignCodeGenTypeCache89 CharUnits getSizeAlign() const { 90 return CharUnits::fromQuantity(SizeAlignInBytes); 91 } getPointerSizeCodeGenTypeCache92 CharUnits getPointerSize() const { 93 return CharUnits::fromQuantity(PointerSizeInBytes); 94 } getPointerAlignCodeGenTypeCache95 CharUnits getPointerAlign() const { 96 return CharUnits::fromQuantity(PointerAlignInBytes); 97 } 98 99 llvm::CallingConv::ID RuntimeCC; getRuntimeCCCodeGenTypeCache100 llvm::CallingConv::ID getRuntimeCC() const { return RuntimeCC; } 101 llvm::CallingConv::ID BuiltinCC; getBuiltinCCCodeGenTypeCache102 llvm::CallingConv::ID getBuiltinCC() const { return BuiltinCC; } 103 }; 104 105 } // end namespace CodeGen 106 } // end namespace clang 107 108 #endif 109