]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypeCache.h
Merge ^/head r313055 through r313300.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / CodeGen / CodeGenTypeCache.h
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   };
69   CharUnits getIntSize() const {
70     return CharUnits::fromQuantity(IntSizeInBytes);
71   }
72   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   };
84
85   /// The size and alignment of size_t.
86   union {
87     unsigned char SizeSizeInBytes; // sizeof(size_t)
88     unsigned char SizeAlignInBytes;
89   };
90
91   CharUnits getSizeSize() const {
92     return CharUnits::fromQuantity(SizeSizeInBytes);
93   }
94   CharUnits getSizeAlign() const {
95     return CharUnits::fromQuantity(SizeAlignInBytes);
96   }
97   CharUnits getPointerSize() const {
98     return CharUnits::fromQuantity(PointerSizeInBytes);
99   }
100   CharUnits getPointerAlign() const {
101     return CharUnits::fromQuantity(PointerAlignInBytes);
102   }
103
104   llvm::CallingConv::ID RuntimeCC;
105   llvm::CallingConv::ID getRuntimeCC() const { return RuntimeCC; }
106   llvm::CallingConv::ID BuiltinCC;
107   llvm::CallingConv::ID getBuiltinCC() const { return BuiltinCC; }
108 };
109
110 }  // end namespace CodeGen
111 }  // end namespace clang
112
113 #endif