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)