13d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman//===--- CodeGenTBAA.h - TBAA information for LLVM CodeGen ------*- C++ -*-===// 23d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman// 33d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman// The LLVM Compiler Infrastructure 43d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman// 53d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman// This file is distributed under the University of Illinois Open Source 63d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman// License. See LICENSE.TXT for details. 73d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman// 83d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman//===----------------------------------------------------------------------===// 93d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman// 10565cc44bea707ff3865fbeb731e4790dd9874786Dan Gohman// This is the code that manages TBAA information and defines the TBAA policy 11565cc44bea707ff3865fbeb731e4790dd9874786Dan Gohman// for the optimizer to use. 123d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman// 133d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman//===----------------------------------------------------------------------===// 143d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 153d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman#ifndef CLANG_CODEGEN_CODEGENTBAA_H 163d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman#define CLANG_CODEGEN_CODEGENTBAA_H 173d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 18686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h" 193d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman#include "llvm/ADT/DenseMap.h" 203b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/MDBuilder.h" 213d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 223d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohmannamespace llvm { 233d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman class LLVMContext; 243d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman class MDNode; 253d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman} 263d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 273d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohmannamespace clang { 283d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman class ASTContext; 29c9fe6056e4ce8ffad1ef439fca3318a5faf1c075Kostya Serebryany class CodeGenOptions; 303d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman class LangOptions; 3114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne class MangleContext; 323d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman class QualType; 333d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman class Type; 343d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 353d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohmannamespace CodeGen { 363d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman class CGRecordLayout; 373d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 38b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren struct TBAAPathTag { 39b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren TBAAPathTag(const Type *B, const llvm::MDNode *A, uint64_t O) 40b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren : BaseT(B), AccessN(A), Offset(O) {} 41b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren const Type *BaseT; 42b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren const llvm::MDNode *AccessN; 43b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren uint64_t Offset; 44b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren }; 45b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren 463d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman/// CodeGenTBAA - This class organizes the cross-module state that is used 473d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman/// while lowering AST types to LLVM types. 483d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohmanclass CodeGenTBAA { 493d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman ASTContext &Context; 50c9fe6056e4ce8ffad1ef439fca3318a5faf1c075Kostya Serebryany const CodeGenOptions &CodeGenOpts; 513d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman const LangOptions &Features; 520b5c4fc2ae3b503c2b1f354bf52b718aa50a6aeeDan Gohman MangleContext &MContext; 533d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 542d7cb069fe101da3971a07900ff583380bcac184Duncan Sands // MDHelper - Helper for creating metadata. 552d7cb069fe101da3971a07900ff583380bcac184Duncan Sands llvm::MDBuilder MDHelper; 562d7cb069fe101da3971a07900ff583380bcac184Duncan Sands 57b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren /// MetadataCache - This maps clang::Types to scalar llvm::MDNodes describing 58b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren /// them. 593d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman llvm::DenseMap<const Type *, llvm::MDNode *> MetadataCache; 60b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren /// This maps clang::Types to a struct node in the type DAG. 61b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren llvm::DenseMap<const Type *, llvm::MDNode *> StructTypeMetadataCache; 62b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren /// This maps TBAAPathTags to a tag node. 63b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren llvm::DenseMap<TBAAPathTag, llvm::MDNode *> StructTagMetadataCache; 64ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren /// This maps a scalar type to a scalar tag node. 65ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren llvm::DenseMap<const llvm::MDNode *, llvm::MDNode *> ScalarTagMetadataCache; 663d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 67b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman /// StructMetadataCache - This maps clang::Types to llvm::MDNodes describing 68b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman /// them for struct assignments. 69b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman llvm::DenseMap<const Type *, llvm::MDNode *> StructMetadataCache; 70b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman 713d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman llvm::MDNode *Root; 72224d75972a836b06e2ca708d1eafdac6f762c487Dan Gohman llvm::MDNode *Char; 733d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 74224d75972a836b06e2ca708d1eafdac6f762c487Dan Gohman /// getRoot - This is the mdnode for the root of the metadata type graph 75224d75972a836b06e2ca708d1eafdac6f762c487Dan Gohman /// for this translation unit. 76224d75972a836b06e2ca708d1eafdac6f762c487Dan Gohman llvm::MDNode *getRoot(); 77224d75972a836b06e2ca708d1eafdac6f762c487Dan Gohman 78224d75972a836b06e2ca708d1eafdac6f762c487Dan Gohman /// getChar - This is the mdnode for "char", which is special, and any types 793d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman /// considered to be equivalent to it. 80224d75972a836b06e2ca708d1eafdac6f762c487Dan Gohman llvm::MDNode *getChar(); 813d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 82b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman /// CollectFields - Collect information about the fields of a type for 83b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman /// !tbaa.struct metadata formation. Return false for an unsupported type. 84b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman bool CollectFields(uint64_t BaseOffset, 85b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman QualType Ty, 86b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman SmallVectorImpl<llvm::MDBuilder::TBAAStructField> &Fields, 87b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman bool MayAlias); 88b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman 89ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren /// A wrapper function to create a scalar type. For struct-path aware TBAA, 90ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren /// the scalar type has the same format as the struct type: name, offset, 91ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren /// pointer to another node in the type DAG. 92ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren llvm::MDNode *createTBAAScalarType(StringRef Name, llvm::MDNode *Parent); 93ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren 943d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohmanpublic: 953d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext, 96c9fe6056e4ce8ffad1ef439fca3318a5faf1c075Kostya Serebryany const CodeGenOptions &CGO, 970b5c4fc2ae3b503c2b1f354bf52b718aa50a6aeeDan Gohman const LangOptions &Features, 980b5c4fc2ae3b503c2b1f354bf52b718aa50a6aeeDan Gohman MangleContext &MContext); 993d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman ~CodeGenTBAA(); 1003d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 101565cc44bea707ff3865fbeb731e4790dd9874786Dan Gohman /// getTBAAInfo - Get the TBAA MDNode to be used for a dereference 102565cc44bea707ff3865fbeb731e4790dd9874786Dan Gohman /// of the given type. 1033d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman llvm::MDNode *getTBAAInfo(QualType QTy); 1048cb4a070d491ddd671b049110cc8d0accb08b905Kostya Serebryany 1058cb4a070d491ddd671b049110cc8d0accb08b905Kostya Serebryany /// getTBAAInfoForVTablePtr - Get the TBAA MDNode to be used for a 1068cb4a070d491ddd671b049110cc8d0accb08b905Kostya Serebryany /// dereference of a vtable pointer. 1078cb4a070d491ddd671b049110cc8d0accb08b905Kostya Serebryany llvm::MDNode *getTBAAInfoForVTablePtr(); 108b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman 109b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman /// getTBAAStructInfo - Get the TBAAStruct MDNode to be used for a memcpy of 110b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman /// the given type. 111b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9bDan Gohman llvm::MDNode *getTBAAStructInfo(QualType QTy); 112b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren 113b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren /// Get the MDNode in the type DAG for given struct type QType. 114b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren llvm::MDNode *getTBAAStructTypeInfo(QualType QType); 115ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren /// Get the tag MDNode for a given base type, the actual scalar access MDNode 116b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren /// and offset into the base type. 117b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren llvm::MDNode *getTBAAStructTagInfo(QualType BaseQType, 118b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren llvm::MDNode *AccessNode, uint64_t Offset); 119ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren 1209aaee92faa84a54a78cc298b1d281c4bce39c122Michael Gottesman /// Get the scalar tag MDNode for a given scalar type. 121ca835180412eb4382fe4cc97e9374489b9ad3946Manman Ren llvm::MDNode *getTBAAScalarTagInfo(llvm::MDNode *AccessNode); 1223d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman}; 1233d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 1243d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman} // end namespace CodeGen 1253d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman} // end namespace clang 1263d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman 127b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Rennamespace llvm { 128b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren 129b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Rentemplate<> struct DenseMapInfo<clang::CodeGen::TBAAPathTag> { 130b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren static clang::CodeGen::TBAAPathTag getEmptyKey() { 131b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren return clang::CodeGen::TBAAPathTag( 132b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren DenseMapInfo<const clang::Type *>::getEmptyKey(), 133b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren DenseMapInfo<const MDNode *>::getEmptyKey(), 134b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren DenseMapInfo<uint64_t>::getEmptyKey()); 135b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren } 136b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren 137b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren static clang::CodeGen::TBAAPathTag getTombstoneKey() { 138b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren return clang::CodeGen::TBAAPathTag( 139b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren DenseMapInfo<const clang::Type *>::getTombstoneKey(), 140b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren DenseMapInfo<const MDNode *>::getTombstoneKey(), 141b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren DenseMapInfo<uint64_t>::getTombstoneKey()); 142b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren } 143b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren 144b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren static unsigned getHashValue(const clang::CodeGen::TBAAPathTag &Val) { 145b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren return DenseMapInfo<const clang::Type *>::getHashValue(Val.BaseT) ^ 146b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren DenseMapInfo<const MDNode *>::getHashValue(Val.AccessN) ^ 147b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren DenseMapInfo<uint64_t>::getHashValue(Val.Offset); 148b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren } 149b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren 150b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren static bool isEqual(const clang::CodeGen::TBAAPathTag &LHS, 151b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren const clang::CodeGen::TBAAPathTag &RHS) { 152b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren return LHS.BaseT == RHS.BaseT && 153b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren LHS.AccessN == RHS.AccessN && 154b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren LHS.Offset == RHS.Offset; 155b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren } 156b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren}; 157b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren 158b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren} // end namespace llvm 159b37a73d5c6a0c8bb1f6e363d3b53980e4fa0ceadManman Ren 1603d5aff5d3036b0ff09d114857cd2276134b3d8c9Dan Gohman#endif 161