1*67e74705SXin Li //===--- CodeGenTBAA.h - TBAA information for LLVM CodeGen ------*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li // 10*67e74705SXin Li // This is the code that manages TBAA information and defines the TBAA policy 11*67e74705SXin Li // for the optimizer to use. 12*67e74705SXin Li // 13*67e74705SXin Li //===----------------------------------------------------------------------===// 14*67e74705SXin Li 15*67e74705SXin Li #ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENTBAA_H 16*67e74705SXin Li #define LLVM_CLANG_LIB_CODEGEN_CODEGENTBAA_H 17*67e74705SXin Li 18*67e74705SXin Li #include "clang/AST/Type.h" 19*67e74705SXin Li #include "clang/Basic/LLVM.h" 20*67e74705SXin Li #include "llvm/ADT/DenseMap.h" 21*67e74705SXin Li #include "llvm/IR/MDBuilder.h" 22*67e74705SXin Li #include "llvm/IR/Metadata.h" 23*67e74705SXin Li 24*67e74705SXin Li namespace clang { 25*67e74705SXin Li class ASTContext; 26*67e74705SXin Li class CodeGenOptions; 27*67e74705SXin Li class LangOptions; 28*67e74705SXin Li class MangleContext; 29*67e74705SXin Li class QualType; 30*67e74705SXin Li class Type; 31*67e74705SXin Li 32*67e74705SXin Li namespace CodeGen { 33*67e74705SXin Li class CGRecordLayout; 34*67e74705SXin Li 35*67e74705SXin Li struct TBAAPathTag { TBAAPathTagTBAAPathTag36*67e74705SXin Li TBAAPathTag(const Type *B, const llvm::MDNode *A, uint64_t O) 37*67e74705SXin Li : BaseT(B), AccessN(A), Offset(O) {} 38*67e74705SXin Li const Type *BaseT; 39*67e74705SXin Li const llvm::MDNode *AccessN; 40*67e74705SXin Li uint64_t Offset; 41*67e74705SXin Li }; 42*67e74705SXin Li 43*67e74705SXin Li /// CodeGenTBAA - This class organizes the cross-module state that is used 44*67e74705SXin Li /// while lowering AST types to LLVM types. 45*67e74705SXin Li class CodeGenTBAA { 46*67e74705SXin Li ASTContext &Context; 47*67e74705SXin Li const CodeGenOptions &CodeGenOpts; 48*67e74705SXin Li const LangOptions &Features; 49*67e74705SXin Li MangleContext &MContext; 50*67e74705SXin Li 51*67e74705SXin Li // MDHelper - Helper for creating metadata. 52*67e74705SXin Li llvm::MDBuilder MDHelper; 53*67e74705SXin Li 54*67e74705SXin Li /// MetadataCache - This maps clang::Types to scalar llvm::MDNodes describing 55*67e74705SXin Li /// them. 56*67e74705SXin Li llvm::DenseMap<const Type *, llvm::MDNode *> MetadataCache; 57*67e74705SXin Li /// This maps clang::Types to a struct node in the type DAG. 58*67e74705SXin Li llvm::DenseMap<const Type *, llvm::MDNode *> StructTypeMetadataCache; 59*67e74705SXin Li /// This maps TBAAPathTags to a tag node. 60*67e74705SXin Li llvm::DenseMap<TBAAPathTag, llvm::MDNode *> StructTagMetadataCache; 61*67e74705SXin Li /// This maps a scalar type to a scalar tag node. 62*67e74705SXin Li llvm::DenseMap<const llvm::MDNode *, llvm::MDNode *> ScalarTagMetadataCache; 63*67e74705SXin Li 64*67e74705SXin Li /// StructMetadataCache - This maps clang::Types to llvm::MDNodes describing 65*67e74705SXin Li /// them for struct assignments. 66*67e74705SXin Li llvm::DenseMap<const Type *, llvm::MDNode *> StructMetadataCache; 67*67e74705SXin Li 68*67e74705SXin Li llvm::MDNode *Root; 69*67e74705SXin Li llvm::MDNode *Char; 70*67e74705SXin Li 71*67e74705SXin Li /// getRoot - This is the mdnode for the root of the metadata type graph 72*67e74705SXin Li /// for this translation unit. 73*67e74705SXin Li llvm::MDNode *getRoot(); 74*67e74705SXin Li 75*67e74705SXin Li /// getChar - This is the mdnode for "char", which is special, and any types 76*67e74705SXin Li /// considered to be equivalent to it. 77*67e74705SXin Li llvm::MDNode *getChar(); 78*67e74705SXin Li 79*67e74705SXin Li /// CollectFields - Collect information about the fields of a type for 80*67e74705SXin Li /// !tbaa.struct metadata formation. Return false for an unsupported type. 81*67e74705SXin Li bool CollectFields(uint64_t BaseOffset, 82*67e74705SXin Li QualType Ty, 83*67e74705SXin Li SmallVectorImpl<llvm::MDBuilder::TBAAStructField> &Fields, 84*67e74705SXin Li bool MayAlias); 85*67e74705SXin Li 86*67e74705SXin Li /// A wrapper function to create a scalar type. For struct-path aware TBAA, 87*67e74705SXin Li /// the scalar type has the same format as the struct type: name, offset, 88*67e74705SXin Li /// pointer to another node in the type DAG. 89*67e74705SXin Li llvm::MDNode *createTBAAScalarType(StringRef Name, llvm::MDNode *Parent); 90*67e74705SXin Li 91*67e74705SXin Li public: 92*67e74705SXin Li CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext, 93*67e74705SXin Li const CodeGenOptions &CGO, 94*67e74705SXin Li const LangOptions &Features, 95*67e74705SXin Li MangleContext &MContext); 96*67e74705SXin Li ~CodeGenTBAA(); 97*67e74705SXin Li 98*67e74705SXin Li /// getTBAAInfo - Get the TBAA MDNode to be used for a dereference 99*67e74705SXin Li /// of the given type. 100*67e74705SXin Li llvm::MDNode *getTBAAInfo(QualType QTy); 101*67e74705SXin Li 102*67e74705SXin Li /// getTBAAInfoForVTablePtr - Get the TBAA MDNode to be used for a 103*67e74705SXin Li /// dereference of a vtable pointer. 104*67e74705SXin Li llvm::MDNode *getTBAAInfoForVTablePtr(); 105*67e74705SXin Li 106*67e74705SXin Li /// getTBAAStructInfo - Get the TBAAStruct MDNode to be used for a memcpy of 107*67e74705SXin Li /// the given type. 108*67e74705SXin Li llvm::MDNode *getTBAAStructInfo(QualType QTy); 109*67e74705SXin Li 110*67e74705SXin Li /// Get the MDNode in the type DAG for given struct type QType. 111*67e74705SXin Li llvm::MDNode *getTBAAStructTypeInfo(QualType QType); 112*67e74705SXin Li /// Get the tag MDNode for a given base type, the actual scalar access MDNode 113*67e74705SXin Li /// and offset into the base type. 114*67e74705SXin Li llvm::MDNode *getTBAAStructTagInfo(QualType BaseQType, 115*67e74705SXin Li llvm::MDNode *AccessNode, uint64_t Offset); 116*67e74705SXin Li 117*67e74705SXin Li /// Get the scalar tag MDNode for a given scalar type. 118*67e74705SXin Li llvm::MDNode *getTBAAScalarTagInfo(llvm::MDNode *AccessNode); 119*67e74705SXin Li }; 120*67e74705SXin Li 121*67e74705SXin Li } // end namespace CodeGen 122*67e74705SXin Li } // end namespace clang 123*67e74705SXin Li 124*67e74705SXin Li namespace llvm { 125*67e74705SXin Li 126*67e74705SXin Li template<> struct DenseMapInfo<clang::CodeGen::TBAAPathTag> { 127*67e74705SXin Li static clang::CodeGen::TBAAPathTag getEmptyKey() { 128*67e74705SXin Li return clang::CodeGen::TBAAPathTag( 129*67e74705SXin Li DenseMapInfo<const clang::Type *>::getEmptyKey(), 130*67e74705SXin Li DenseMapInfo<const MDNode *>::getEmptyKey(), 131*67e74705SXin Li DenseMapInfo<uint64_t>::getEmptyKey()); 132*67e74705SXin Li } 133*67e74705SXin Li 134*67e74705SXin Li static clang::CodeGen::TBAAPathTag getTombstoneKey() { 135*67e74705SXin Li return clang::CodeGen::TBAAPathTag( 136*67e74705SXin Li DenseMapInfo<const clang::Type *>::getTombstoneKey(), 137*67e74705SXin Li DenseMapInfo<const MDNode *>::getTombstoneKey(), 138*67e74705SXin Li DenseMapInfo<uint64_t>::getTombstoneKey()); 139*67e74705SXin Li } 140*67e74705SXin Li 141*67e74705SXin Li static unsigned getHashValue(const clang::CodeGen::TBAAPathTag &Val) { 142*67e74705SXin Li return DenseMapInfo<const clang::Type *>::getHashValue(Val.BaseT) ^ 143*67e74705SXin Li DenseMapInfo<const MDNode *>::getHashValue(Val.AccessN) ^ 144*67e74705SXin Li DenseMapInfo<uint64_t>::getHashValue(Val.Offset); 145*67e74705SXin Li } 146*67e74705SXin Li 147*67e74705SXin Li static bool isEqual(const clang::CodeGen::TBAAPathTag &LHS, 148*67e74705SXin Li const clang::CodeGen::TBAAPathTag &RHS) { 149*67e74705SXin Li return LHS.BaseT == RHS.BaseT && 150*67e74705SXin Li LHS.AccessN == RHS.AccessN && 151*67e74705SXin Li LHS.Offset == RHS.Offset; 152*67e74705SXin Li } 153*67e74705SXin Li }; 154*67e74705SXin Li 155*67e74705SXin Li } // end namespace llvm 156*67e74705SXin Li 157*67e74705SXin Li #endif 158