brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · 015306b Raw
131 lines · c
1//===--- CodeGenTypeCache.h - Commonly used LLVM types and info -*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This structure provides a set of common types useful during IR emission.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENTYPECACHE_H14#define LLVM_CLANG_LIB_CODEGEN_CODEGENTYPECACHE_H15 16#include "clang/AST/CharUnits.h"17#include "clang/Basic/AddressSpaces.h"18#include "llvm/IR/CallingConv.h"19 20namespace llvm {21  class Type;22  class IntegerType;23  class PointerType;24}25 26namespace clang {27namespace CodeGen {28 29/// This structure provides a set of types that are commonly used30/// during IR emission.  It's initialized once in CodeGenModule's31/// constructor and then copied around into new CodeGenFunctions.32struct CodeGenTypeCache {33  /// void34  llvm::Type *VoidTy;35 36  /// i8, i16, i32, and i6437  llvm::IntegerType *Int8Ty, *Int16Ty, *Int32Ty, *Int64Ty;38  /// half, bfloat, float, double39  llvm::Type *HalfTy, *BFloatTy, *FloatTy, *DoubleTy;40 41  /// int42  llvm::IntegerType *IntTy;43 44  /// char45  llvm::IntegerType *CharTy;46 47  /// intptr_t, size_t, and ptrdiff_t, which we assume are the same size.48  union {49    llvm::IntegerType *IntPtrTy;50    llvm::IntegerType *SizeTy;51    llvm::IntegerType *PtrDiffTy;52  };53 54  /// void*, void** in the target's default address space (often 0)55  union {56    llvm::PointerType *DefaultPtrTy;57    llvm::PointerType *VoidPtrTy;58    llvm::PointerType *Int8PtrTy;59    llvm::PointerType *VoidPtrPtrTy;60    llvm::PointerType *Int8PtrPtrTy;61  };62 63  /// void* in alloca address space64  union {65    llvm::PointerType *AllocaVoidPtrTy;66    llvm::PointerType *AllocaInt8PtrTy;67  };68 69  /// void* in default globals address space70  union {71    llvm::PointerType *GlobalsVoidPtrTy;72    llvm::PointerType *GlobalsInt8PtrTy;73  };74 75  /// void* in the address space for constant globals76  llvm::PointerType *ConstGlobalsPtrTy;77 78  /// The size and alignment of the builtin C type 'int'.  This comes79  /// up enough in various ABI lowering tasks to be worth pre-computing.80  union {81    unsigned char IntSizeInBytes;82    unsigned char IntAlignInBytes;83  };84  CharUnits getIntSize() const {85    return CharUnits::fromQuantity(IntSizeInBytes);86  }87  CharUnits getIntAlign() const {88    return CharUnits::fromQuantity(IntAlignInBytes);89  }90 91  /// The width of a pointer into the generic address space.92  unsigned char PointerWidthInBits;93 94  /// The size and alignment of a pointer into the generic address space.95  union {96    unsigned char PointerAlignInBytes;97    unsigned char PointerSizeInBytes;98  };99 100  /// The size and alignment of size_t.101  union {102    unsigned char SizeSizeInBytes; // sizeof(size_t)103    unsigned char SizeAlignInBytes;104  };105 106  LangAS ASTAllocaAddressSpace;107 108  CharUnits getSizeSize() const {109    return CharUnits::fromQuantity(SizeSizeInBytes);110  }111  CharUnits getSizeAlign() const {112    return CharUnits::fromQuantity(SizeAlignInBytes);113  }114  CharUnits getPointerSize() const {115    return CharUnits::fromQuantity(PointerSizeInBytes);116  }117  CharUnits getPointerAlign() const {118    return CharUnits::fromQuantity(PointerAlignInBytes);119  }120 121  llvm::CallingConv::ID RuntimeCC;122  llvm::CallingConv::ID getRuntimeCC() const { return RuntimeCC; }123 124  LangAS getASTAllocaAddressSpace() const { return ASTAllocaAddressSpace; }125};126 127}  // end namespace CodeGen128}  // end namespace clang129 130#endif131