xref: /aosp_15_r20/external/clang/lib/CodeGen/CodeGenTBAA.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
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