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