1 //===---- llvm/MDBuilder.h - Builder for LLVM metadata ----------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the MDBuilder class, which is used as a convenient way to 10 // create LLVM metadata with a consistent and simplified interface. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_IR_MDBUILDER_H 15 #define LLVM_IR_MDBUILDER_H 16 17 #include "llvm/ADT/DenseSet.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/IR/Constants.h" 20 #include "llvm/IR/GlobalValue.h" 21 #include "llvm/Support/DataTypes.h" 22 #include <utility> 23 24 namespace llvm { 25 26 class APInt; 27 template <typename T> class ArrayRef; 28 class LLVMContext; 29 class Constant; 30 class ConstantAsMetadata; 31 class MDNode; 32 class MDString; 33 class Metadata; 34 35 class MDBuilder { 36 LLVMContext &Context; 37 38 public: 39 MDBuilder(LLVMContext &context) : Context(context) {} 40 41 /// Return the given string as metadata. 42 MDString *createString(StringRef Str); 43 44 /// Return the given constant as metadata. 45 ConstantAsMetadata *createConstant(Constant *C); 46 47 //===------------------------------------------------------------------===// 48 // FPMath metadata. 49 //===------------------------------------------------------------------===// 50 51 /// Return metadata with the given settings. The special value 0.0 52 /// for the Accuracy parameter indicates the default (maximal precision) 53 /// setting. 54 MDNode *createFPMath(float Accuracy); 55 56 //===------------------------------------------------------------------===// 57 // Prof metadata. 58 //===------------------------------------------------------------------===// 59 60 /// Return metadata containing two branch weights. 61 MDNode *createBranchWeights(uint32_t TrueWeight, uint32_t FalseWeight); 62 63 /// Return metadata containing a number of branch weights. 64 MDNode *createBranchWeights(ArrayRef<uint32_t> Weights); 65 66 /// Return metadata specifying that a branch or switch is unpredictable. 67 MDNode *createUnpredictable(); 68 69 /// Return metadata containing the entry \p Count for a function, a boolean 70 /// \Synthetic indicating whether the counts were synthetized, and the 71 /// GUIDs stored in \p Imports that need to be imported for sample PGO, to 72 /// enable the same inlines as the profiled optimized binary 73 MDNode *createFunctionEntryCount(uint64_t Count, bool Synthetic, 74 const DenseSet<GlobalValue::GUID> *Imports); 75 76 /// Return metadata containing the section prefix for a function. 77 MDNode *createFunctionSectionPrefix(StringRef Prefix); 78 79 /// Return metadata containing the pseudo probe descriptor for a function. 80 MDNode *createPseudoProbeDesc(uint64_t GUID, uint64_t Hash, Function *F); 81 82 //===------------------------------------------------------------------===// 83 // Range metadata. 84 //===------------------------------------------------------------------===// 85 86 /// Return metadata describing the range [Lo, Hi). 87 MDNode *createRange(const APInt &Lo, const APInt &Hi); 88 89 /// Return metadata describing the range [Lo, Hi). 90 MDNode *createRange(Constant *Lo, Constant *Hi); 91 92 //===------------------------------------------------------------------===// 93 // Callees metadata. 94 //===------------------------------------------------------------------===// 95 96 /// Return metadata indicating the possible callees of indirect 97 /// calls. 98 MDNode *createCallees(ArrayRef<Function *> Callees); 99 100 //===------------------------------------------------------------------===// 101 // Callback metadata. 102 //===------------------------------------------------------------------===// 103 104 /// Return metadata describing a callback (see llvm::AbstractCallSite). 105 MDNode *createCallbackEncoding(unsigned CalleeArgNo, ArrayRef<int> Arguments, 106 bool VarArgsArePassed); 107 108 /// Merge the new callback encoding \p NewCB into \p ExistingCallbacks. 109 MDNode *mergeCallbackEncodings(MDNode *ExistingCallbacks, MDNode *NewCB); 110 111 //===------------------------------------------------------------------===// 112 // AA metadata. 113 //===------------------------------------------------------------------===// 114 115 protected: 116 /// Return metadata appropriate for a AA root node (scope or TBAA). 117 /// Each returned node is distinct from all other metadata and will never 118 /// be identified (uniqued) with anything else. 119 MDNode *createAnonymousAARoot(StringRef Name = StringRef(), 120 MDNode *Extra = nullptr); 121 122 public: 123 /// Return metadata appropriate for a TBAA root node. Each returned 124 /// node is distinct from all other metadata and will never be identified 125 /// (uniqued) with anything else. 126 MDNode *createAnonymousTBAARoot() { 127 return createAnonymousAARoot(); 128 } 129 130 /// Return metadata appropriate for an alias scope domain node. 131 /// Each returned node is distinct from all other metadata and will never 132 /// be identified (uniqued) with anything else. 133 MDNode *createAnonymousAliasScopeDomain(StringRef Name = StringRef()) { 134 return createAnonymousAARoot(Name); 135 } 136 137 /// Return metadata appropriate for an alias scope root node. 138 /// Each returned node is distinct from all other metadata and will never 139 /// be identified (uniqued) with anything else. 140 MDNode *createAnonymousAliasScope(MDNode *Domain, 141 StringRef Name = StringRef()) { 142 return createAnonymousAARoot(Name, Domain); 143 } 144 145 /// Return metadata appropriate for a TBAA root node with the given 146 /// name. This may be identified (uniqued) with other roots with the same 147 /// name. 148 MDNode *createTBAARoot(StringRef Name); 149 150 /// Return metadata appropriate for an alias scope domain node with 151 /// the given name. This may be identified (uniqued) with other roots with 152 /// the same name. 153 MDNode *createAliasScopeDomain(StringRef Name); 154 155 /// Return metadata appropriate for an alias scope node with 156 /// the given name. This may be identified (uniqued) with other scopes with 157 /// the same name and domain. 158 MDNode *createAliasScope(StringRef Name, MDNode *Domain); 159 160 /// Return metadata for a non-root TBAA node with the given name, 161 /// parent in the TBAA tree, and value for 'pointsToConstantMemory'. 162 MDNode *createTBAANode(StringRef Name, MDNode *Parent, 163 bool isConstant = false); 164 165 struct TBAAStructField { 166 uint64_t Offset; 167 uint64_t Size; 168 MDNode *Type; 169 TBAAStructField(uint64_t Offset, uint64_t Size, MDNode *Type) : 170 Offset(Offset), Size(Size), Type(Type) {} 171 }; 172 173 /// Return metadata for a tbaa.struct node with the given 174 /// struct field descriptions. 175 MDNode *createTBAAStructNode(ArrayRef<TBAAStructField> Fields); 176 177 /// Return metadata for a TBAA struct node in the type DAG 178 /// with the given name, a list of pairs (offset, field type in the type DAG). 179 MDNode * 180 createTBAAStructTypeNode(StringRef Name, 181 ArrayRef<std::pair<MDNode *, uint64_t>> Fields); 182 183 /// Return metadata for a TBAA scalar type node with the 184 /// given name, an offset and a parent in the TBAA type DAG. 185 MDNode *createTBAAScalarTypeNode(StringRef Name, MDNode *Parent, 186 uint64_t Offset = 0); 187 188 /// Return metadata for a TBAA tag node with the given 189 /// base type, access type and offset relative to the base type. 190 MDNode *createTBAAStructTagNode(MDNode *BaseType, MDNode *AccessType, 191 uint64_t Offset, bool IsConstant = false); 192 193 /// Return metadata for a TBAA type node in the TBAA type DAG with the 194 /// given parent type, size in bytes, type identifier and a list of fields. 195 MDNode *createTBAATypeNode(MDNode *Parent, uint64_t Size, Metadata *Id, 196 ArrayRef<TBAAStructField> Fields = 197 ArrayRef<TBAAStructField>()); 198 199 /// Return metadata for a TBAA access tag with the given base type, 200 /// final access type, offset of the access relative to the base type, size of 201 /// the access and flag indicating whether the accessed object can be 202 /// considered immutable for the purposes of the TBAA analysis. 203 MDNode *createTBAAAccessTag(MDNode *BaseType, MDNode *AccessType, 204 uint64_t Offset, uint64_t Size, 205 bool IsImmutable = false); 206 207 /// Return mutable version of the given mutable or immutable TBAA 208 /// access tag. 209 MDNode *createMutableTBAAAccessTag(MDNode *Tag); 210 211 /// Return metadata containing an irreducible loop header weight. 212 MDNode *createIrrLoopHeaderWeight(uint64_t Weight); 213 }; 214 215 } // end namespace llvm 216 217 #endif 218