CodeGenTBAA.h revision b22c7dc707cf3770ff3b5e5f11f11fd0aaa06d9b
18c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose//===--- CodeGenTBAA.h - TBAA information for LLVM CodeGen ------*- C++ -*-===//
28c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose//
38c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose//                     The LLVM Compiler Infrastructure
48c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose//
58c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// This file is distributed under the University of Illinois Open Source
6eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks// License. See LICENSE.TXT for details.
7eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks//
8262e0d41e49c6b823d62743535e2accb117a6ea9Jordan Rose//===----------------------------------------------------------------------===//
9262e0d41e49c6b823d62743535e2accb117a6ea9Jordan Rose//
10262e0d41e49c6b823d62743535e2accb117a6ea9Jordan Rose// This is the code that manages TBAA information and defines the TBAA policy
11262e0d41e49c6b823d62743535e2accb117a6ea9Jordan Rose// for the optimizer to use.
12eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks//
13eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks//===----------------------------------------------------------------------===//
14ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks
15ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks#ifndef CLANG_CODEGEN_CODEGENTBAA_H
16ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks#define CLANG_CODEGEN_CODEGENTBAA_H
17ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks
18ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks#include "clang/Basic/LLVM.h"
19ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks#include "llvm/MDBuilder.h"
20ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks#include "llvm/ADT/DenseMap.h"
219a0b3c2f7c440c53b65bd1b085a7471d9f7ed490Jordan Rose
22ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaksnamespace llvm {
239a0b3c2f7c440c53b65bd1b085a7471d9f7ed490Jordan Rose  class LLVMContext;
249a0b3c2f7c440c53b65bd1b085a7471d9f7ed490Jordan Rose  class MDNode;
259a0b3c2f7c440c53b65bd1b085a7471d9f7ed490Jordan Rose}
26eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
27eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksnamespace clang {
28eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  class ASTContext;
29eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks  class CodeGenOptions;
309620aa8c6726330c0357799706aa51f64cc449daNAKAMURA Takumi  class LangOptions;
319620aa8c6726330c0357799706aa51f64cc449daNAKAMURA Takumi  class MangleContext;
329620aa8c6726330c0357799706aa51f64cc449daNAKAMURA Takumi  class QualType;
3315d0ae170c2037815b6383c532253585fcd3d04eAnna Zaks  class Type;
34ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks
35b7a747b0c271faeeb8d0f886f0e691eb25f637d9Anton Yartsevnamespace CodeGen {
3615d0ae170c2037815b6383c532253585fcd3d04eAnna Zaks  class CGRecordLayout;
370d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks
380d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks/// CodeGenTBAA - This class organizes the cross-module state that is used
39ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks/// while lowering AST types to LLVM types.
40ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaksclass CodeGenTBAA {
41ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  ASTContext &Context;
42ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  const CodeGenOptions &CodeGenOpts;
43ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  const LangOptions &Features;
44ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  MangleContext &MContext;
45ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks
46ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  // MDHelper - Helper for creating metadata.
47ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  llvm::MDBuilder MDHelper;
489a0b3c2f7c440c53b65bd1b085a7471d9f7ed490Jordan Rose
499a0b3c2f7c440c53b65bd1b085a7471d9f7ed490Jordan Rose  /// MetadataCache - This maps clang::Types to llvm::MDNodes describing them.
50ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  llvm::DenseMap<const Type *, llvm::MDNode *> MetadataCache;
51ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks
52ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  /// StructMetadataCache - This maps clang::Types to llvm::MDNodes describing
53ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  /// them for struct assignments.
54ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks  llvm::DenseMap<const Type *, llvm::MDNode *> StructMetadataCache;
55ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks
56aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks  llvm::MDNode *Root;
57b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks  llvm::MDNode *Char;
58b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks
59b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks  /// getRoot - This is the mdnode for the root of the metadata type graph
60b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks  /// for this translation unit.
61b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks  llvm::MDNode *getRoot();
62b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks
63b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks  /// getChar - This is the mdnode for "char", which is special, and any types
64b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks  /// considered to be equivalent to it.
65b79d862af66d8dd9d059863813b9a27d744bd990Anna Zaks  llvm::MDNode *getChar();
661bf908df57cc43f3bc7296f4e51f5708bd323c6bJordan Rose
671bf908df57cc43f3bc7296f4e51f5708bd323c6bJordan Rose  /// CollectFields - Collect information about the fields of a type for
681bf908df57cc43f3bc7296f4e51f5708bd323c6bJordan Rose  /// !tbaa.struct metadata formation. Return false for an unsupported type.
691bf908df57cc43f3bc7296f4e51f5708bd323c6bJordan Rose  bool CollectFields(uint64_t BaseOffset,
701bf908df57cc43f3bc7296f4e51f5708bd323c6bJordan Rose                     QualType Ty,
711bf908df57cc43f3bc7296f4e51f5708bd323c6bJordan Rose                     SmallVectorImpl<llvm::MDBuilder::TBAAStructField> &Fields,
721bf908df57cc43f3bc7296f4e51f5708bd323c6bJordan Rose                     bool MayAlias);
7352a04812e5767dab68efb33ad044760b5b168941Anna Zaks
7452a04812e5767dab68efb33ad044760b5b168941Anna Zakspublic:
7552a04812e5767dab68efb33ad044760b5b168941Anna Zaks  CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext,
7652a04812e5767dab68efb33ad044760b5b168941Anna Zaks              const CodeGenOptions &CGO,
7752a04812e5767dab68efb33ad044760b5b168941Anna Zaks              const LangOptions &Features,
7852a04812e5767dab68efb33ad044760b5b168941Anna Zaks              MangleContext &MContext);
7952a04812e5767dab68efb33ad044760b5b168941Anna Zaks  ~CodeGenTBAA();
80233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks
81374ae320b87c15b0262c40e5c46e8990111df5caJordan Rose  /// getTBAAInfo - Get the TBAA MDNode to be used for a dereference
82233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks  /// of the given type.
83374ae320b87c15b0262c40e5c46e8990111df5caJordan Rose  llvm::MDNode *getTBAAInfo(QualType QTy);
84233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks
85233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks  /// getTBAAInfoForVTablePtr - Get the TBAA MDNode to be used for a
86233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks  /// dereference of a vtable pointer.
87233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks  llvm::MDNode *getTBAAInfoForVTablePtr();
88233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks
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