CodeGenTBAA.h revision b37a73d5c6a0c8bb1f6e363d3b53980e4fa0cead
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- CodeGenTBAA.h - TBAA information for LLVM CodeGen ------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// This is the code that manages TBAA information and defines the TBAA policy 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the optimizer to use. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CLANG_CODEGEN_CODEGENTBAA_H 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define CLANG_CODEGEN_CODEGENTBAA_H 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Basic/LLVM.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/ADT/DenseMap.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/MDBuilder.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochnamespace llvm { 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) class LLVMContext; 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class MDNode; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochnamespace clang { 282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch class ASTContext; 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) class CodeGenOptions; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class LangOptions; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class MangleContext; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class QualType; 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch class Type; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace CodeGen { 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class CGRecordLayout; 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TBAAPathTag { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TBAAPathTag(const Type *B, const llvm::MDNode *A, uint64_t O) 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : BaseT(B), AccessN(A), Offset(O) {} 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const Type *BaseT; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const llvm::MDNode *AccessN; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64_t Offset; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// CodeGenTBAA - This class organizes the cross-module state that is used 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// while lowering AST types to LLVM types. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CodeGenTBAA { 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASTContext &Context; 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const CodeGenOptions &CodeGenOpts; 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const LangOptions &Features; 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MangleContext &MContext; 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // MDHelper - Helper for creating metadata. 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) llvm::MDBuilder MDHelper; 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /// MetadataCache - This maps clang::Types to scalar llvm::MDNodes describing 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /// them. 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) llvm::DenseMap<const Type *, llvm::MDNode *> MetadataCache; 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /// This maps clang::Types to a struct node in the type DAG. 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) llvm::DenseMap<const Type *, llvm::MDNode *> StructTypeMetadataCache; 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /// This maps TBAAPathTags to a tag node. 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) llvm::DenseMap<TBAAPathTag, llvm::MDNode *> StructTagMetadataCache; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// StructMetadataCache - This maps clang::Types to llvm::MDNodes describing 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// them for struct assignments. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::DenseMap<const Type *, llvm::MDNode *> StructMetadataCache; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::MDNode *Root; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) llvm::MDNode *Char; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getRoot - This is the mdnode for the root of the metadata type graph 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// for this translation unit. 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) llvm::MDNode *getRoot(); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getChar - This is the mdnode for "char", which is special, and any types 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// considered to be equivalent to it. 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::MDNode *getChar(); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// CollectFields - Collect information about the fields of a type for 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// !tbaa.struct metadata formation. Return false for an unsupported type. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool CollectFields(uint64_t BaseOffset, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QualType Ty, 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SmallVectorImpl<llvm::MDBuilder::TBAAStructField> &Fields, 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool MayAlias); 86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)public: 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext, 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const CodeGenOptions &CGO, 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const LangOptions &Features, 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MangleContext &MContext); 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ~CodeGenTBAA(); 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// getTBAAInfo - Get the TBAA MDNode to be used for a dereference 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /// of the given type. 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) llvm::MDNode *getTBAAInfo(QualType QTy); 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) /// getTBAAInfoForVTablePtr - Get the TBAA MDNode to be used for a 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /// dereference of a vtable pointer. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::MDNode *getTBAAInfoForVTablePtr(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// getTBAAStructInfo - Get the TBAAStruct MDNode to be used for a memcpy of 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// the given type. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::MDNode *getTBAAStructInfo(QualType QTy); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// Get the MDNode in the type DAG for given struct type QType. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::MDNode *getTBAAStructTypeInfo(QualType QType); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// Get the tag MDNode for a given base type, the actual sclar access MDNode 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// and offset into the base type. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::MDNode *getTBAAStructTagInfo(QualType BaseQType, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::MDNode *AccessNode, uint64_t Offset); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // end namespace CodeGen 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // end namespace clang 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace llvm { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtemplate<> struct DenseMapInfo<clang::CodeGen::TBAAPathTag> { 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static clang::CodeGen::TBAAPathTag getEmptyKey() { 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return clang::CodeGen::TBAAPathTag( 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DenseMapInfo<const clang::Type *>::getEmptyKey(), 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DenseMapInfo<const MDNode *>::getEmptyKey(), 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DenseMapInfo<uint64_t>::getEmptyKey()); 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static clang::CodeGen::TBAAPathTag getTombstoneKey() { 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return clang::CodeGen::TBAAPathTag( 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DenseMapInfo<const clang::Type *>::getTombstoneKey(), 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DenseMapInfo<const MDNode *>::getTombstoneKey(), 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DenseMapInfo<uint64_t>::getTombstoneKey()); 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static unsigned getHashValue(const clang::CodeGen::TBAAPathTag &Val) { 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return DenseMapInfo<const clang::Type *>::getHashValue(Val.BaseT) ^ 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DenseMapInfo<const MDNode *>::getHashValue(Val.AccessN) ^ 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DenseMapInfo<uint64_t>::getHashValue(Val.Offset); 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static bool isEqual(const clang::CodeGen::TBAAPathTag &LHS, 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const clang::CodeGen::TBAAPathTag &RHS) { 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return LHS.BaseT == RHS.BaseT && 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LHS.AccessN == RHS.AccessN && 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LHS.Offset == RHS.Offset; 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // end namespace llvm 149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)