1 //===--- CodeGenTBAA.h - TBAA information for LLVM CodeGen ------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This is the code that manages TBAA information and defines the TBAA policy
11 // for the optimizer to use.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef CLANG_CODEGEN_CODEGENTBAA_H
16 #define CLANG_CODEGEN_CODEGENTBAA_H
17 
18 #include "clang/Basic/LLVM.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/IR/MDBuilder.h"
21 
22 namespace llvm {
23   class LLVMContext;
24   class MDNode;
25 }
26 
27 namespace clang {
28   class ASTContext;
29   class CodeGenOptions;
30   class LangOptions;
31   class MangleContext;
32   class QualType;
33   class Type;
34 
35 namespace CodeGen {
36   class CGRecordLayout;
37 
38 /// CodeGenTBAA - This class organizes the cross-module state that is used
39 /// while lowering AST types to LLVM types.
40 class CodeGenTBAA {
41   ASTContext &Context;
42   const CodeGenOptions &CodeGenOpts;
43   const LangOptions &Features;
44   MangleContext &MContext;
45 
46   // MDHelper - Helper for creating metadata.
47   llvm::MDBuilder MDHelper;
48 
49   /// MetadataCache - This maps clang::Types to llvm::MDNodes describing them.
50   llvm::DenseMap<const Type *, llvm::MDNode *> MetadataCache;
51 
52   /// StructMetadataCache - This maps clang::Types to llvm::MDNodes describing
53   /// them for struct assignments.
54   llvm::DenseMap<const Type *, llvm::MDNode *> StructMetadataCache;
55 
56   llvm::MDNode *Root;
57   llvm::MDNode *Char;
58 
59   /// getRoot - This is the mdnode for the root of the metadata type graph
60   /// for this translation unit.
61   llvm::MDNode *getRoot();
62 
63   /// getChar - This is the mdnode for "char", which is special, and any types
64   /// considered to be equivalent to it.
65   llvm::MDNode *getChar();
66 
67   /// CollectFields - Collect information about the fields of a type for
68   /// !tbaa.struct metadata formation. Return false for an unsupported type.
69   bool CollectFields(uint64_t BaseOffset,
70                      QualType Ty,
71                      SmallVectorImpl<llvm::MDBuilder::TBAAStructField> &Fields,
72                      bool MayAlias);
73 
74 public:
75   CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext,
76               const CodeGenOptions &CGO,
77               const LangOptions &Features,
78               MangleContext &MContext);
79   ~CodeGenTBAA();
80 
81   /// getTBAAInfo - Get the TBAA MDNode to be used for a dereference
82   /// of the given type.
83   llvm::MDNode *getTBAAInfo(QualType QTy);
84 
85   /// getTBAAInfoForVTablePtr - Get the TBAA MDNode to be used for a
86   /// dereference of a vtable pointer.
87   llvm::MDNode *getTBAAInfoForVTablePtr();
88 
89   /// getTBAAStructInfo - Get the TBAAStruct MDNode to be used for a memcpy of
90   /// the given type.
91   llvm::MDNode *getTBAAStructInfo(QualType QTy);
92 };
93 
94 }  // end namespace CodeGen
95 }  // end namespace clang
96 
97 #endif
98