1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===---- llvm/MDBuilder.h - Builder for LLVM metadata ----------*- C++ -*-===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Compiler Infrastructure 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file defines the MDBuilder class, which is used as a convenient way to 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// create LLVM metadata with a consistent and simplified interface. 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_IR_MDBUILDER_H 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_IR_MDBUILDER_H 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/DenseSet.h" 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringRef.h" 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/GlobalValue.h" 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/DataTypes.h" 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <utility> 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace llvm { 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass APInt; 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robottemplate <typename T> class ArrayRef; 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LLVMContext; 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass Constant; 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConstantAsMetadata; 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MDNode; 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MDString; 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MDBuilder { 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LLVMContext &Context; 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDBuilder(LLVMContext &context) : Context(context) {} 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return the given string as metadata. 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDString *createString(StringRef Str); 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return the given constant as metadata. 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ConstantAsMetadata *createConstant(Constant *C); 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // FPMath metadata. 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata with the given settings. The special value 0.0 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// for the Accuracy parameter indicates the default (maximal precision) 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// setting. 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createFPMath(float Accuracy); 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Prof metadata. 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata containing two branch weights. 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight); 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata containing a number of branch weights. 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createBranchWeights(ArrayRef<uint32_t> Weights); 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return metadata specifying that a branch or switch is unpredictable. 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createUnpredictable(); 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return metadata containing the entry \p Count for a function, and the 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// GUIDs stored in \p Imports that need to be imported for sample PGO, to 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// enable the same inlines as the profiled optimized binary 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createFunctionEntryCount(uint64_t Count, 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const DenseSet<GlobalValue::GUID> *Imports); 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return metadata containing the section prefix for a function. 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createFunctionSectionPrefix(StringRef Prefix); 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Range metadata. 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata describing the range [Lo, Hi). 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createRange(const APInt &Lo, const APInt &Hi); 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata describing the range [Lo, Hi). 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createRange(Constant *Lo, Constant *Hi); 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Callees metadata. 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata indicating the possible callees of indirect 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// calls. 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createCallees(ArrayRef<Function *> Callees); 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // AA metadata. 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===------------------------------------------------------------------===// 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected: 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata appropriate for a AA root node (scope or TBAA). 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Each returned node is distinct from all other metadata and will never 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// be identified (uniqued) with anything else. 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createAnonymousAARoot(StringRef Name = StringRef(), 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *Extra = nullptr); 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata appropriate for a TBAA root node. Each returned 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// node is distinct from all other metadata and will never be identified 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// (uniqued) with anything else. 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createAnonymousTBAARoot() { 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return createAnonymousAARoot(); 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata appropriate for an alias scope domain node. 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Each returned node is distinct from all other metadata and will never 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// be identified (uniqued) with anything else. 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createAnonymousAliasScopeDomain(StringRef Name = StringRef()) { 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return createAnonymousAARoot(Name); 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata appropriate for an alias scope root node. 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Each returned node is distinct from all other metadata and will never 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// be identified (uniqued) with anything else. 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createAnonymousAliasScope(MDNode *Domain, 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef Name = StringRef()) { 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return createAnonymousAARoot(Name, Domain); 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata appropriate for a TBAA root node with the given 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// name. This may be identified (uniqued) with other roots with the same 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// name. 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createTBAARoot(StringRef Name); 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata appropriate for an alias scope domain node with 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the given name. This may be identified (uniqued) with other roots with 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the same name. 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createAliasScopeDomain(StringRef Name); 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata appropriate for an alias scope node with 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the given name. This may be identified (uniqued) with other scopes with 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the same name and domain. 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createAliasScope(StringRef Name, MDNode *Domain); 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata for a non-root TBAA node with the given name, 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// parent in the TBAA tree, and value for 'pointsToConstantMemory'. 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createTBAANode(StringRef Name, MDNode *Parent, 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isConstant = false); 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct TBAAStructField { 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t Offset; 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t Size; 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *TBAA; 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot TBAAStructField(uint64_t Offset, uint64_t Size, MDNode *TBAA) : 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Offset(Offset), Size(Size), TBAA(TBAA) {} 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata for a tbaa.struct node with the given 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// struct field descriptions. 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createTBAAStructNode(ArrayRef<TBAAStructField> Fields); 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata for a TBAA struct node in the type DAG 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// with the given name, a list of pairs (offset, field type in the type DAG). 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode * 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot createTBAAStructTypeNode(StringRef Name, 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ArrayRef<std::pair<MDNode *, uint64_t>> Fields); 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata for a TBAA scalar type node with the 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// given name, an offset and a parent in the TBAA type DAG. 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createTBAAScalarTypeNode(StringRef Name, MDNode *Parent, 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t Offset = 0); 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Return metadata for a TBAA tag node with the given 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// base type, access type and offset relative to the base type. 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDNode *createTBAAStructTagNode(MDNode *BaseType, MDNode *AccessType, 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot uint64_t Offset, bool IsConstant = false); 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace llvm 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif 181