1 //===---- llvm/MDBuilder.cpp - Builder for LLVM metadata ------------------===//
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
7 //===----------------------------------------------------------------------===//
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.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/IR/MDBuilder.h"
15 #include "llvm/IR/Constants.h"
16 #include "llvm/IR/Function.h"
17 #include "llvm/IR/Metadata.h"
20 MDString
*MDBuilder::createString(StringRef Str
) {
21 return MDString::get(Context
, Str
);
24 ConstantAsMetadata
*MDBuilder::createConstant(Constant
*C
) {
25 return ConstantAsMetadata::get(C
);
28 MDNode
*MDBuilder::createFPMath(float Accuracy
) {
31 assert(Accuracy
> 0.0 && "Invalid fpmath accuracy!");
33 createConstant(ConstantFP::get(Type::getFloatTy(Context
), Accuracy
));
34 return MDNode::get(Context
, Op
);
37 MDNode
*MDBuilder::createBranchWeights(uint32_t TrueWeight
,
38 uint32_t FalseWeight
) {
39 return createBranchWeights({TrueWeight
, FalseWeight
});
42 MDNode
*MDBuilder::createBranchWeights(ArrayRef
<uint32_t> Weights
) {
43 assert(Weights
.size() >= 1 && "Need at least one branch weights!");
45 SmallVector
<Metadata
*, 4> Vals(Weights
.size() + 1);
46 Vals
[0] = createString("branch_weights");
48 Type
*Int32Ty
= Type::getInt32Ty(Context
);
49 for (unsigned i
= 0, e
= Weights
.size(); i
!= e
; ++i
)
50 Vals
[i
+ 1] = createConstant(ConstantInt::get(Int32Ty
, Weights
[i
]));
52 return MDNode::get(Context
, Vals
);
55 MDNode
*MDBuilder::createUnpredictable() {
56 return MDNode::get(Context
, None
);
59 MDNode
*MDBuilder::createFunctionEntryCount(
60 uint64_t Count
, bool Synthetic
,
61 const DenseSet
<GlobalValue::GUID
> *Imports
) {
62 Type
*Int64Ty
= Type::getInt64Ty(Context
);
63 SmallVector
<Metadata
*, 8> Ops
;
65 Ops
.push_back(createString("synthetic_function_entry_count"));
67 Ops
.push_back(createString("function_entry_count"));
68 Ops
.push_back(createConstant(ConstantInt::get(Int64Ty
, Count
)));
70 SmallVector
<GlobalValue::GUID
, 2> OrderID(Imports
->begin(), Imports
->end());
72 for (auto ID
: OrderID
)
73 Ops
.push_back(createConstant(ConstantInt::get(Int64Ty
, ID
)));
75 return MDNode::get(Context
, Ops
);
78 MDNode
*MDBuilder::createFunctionSectionPrefix(StringRef Prefix
) {
79 return MDNode::get(Context
,
80 {createString("function_section_prefix"),
81 createString(Prefix
)});
84 MDNode
*MDBuilder::createRange(const APInt
&Lo
, const APInt
&Hi
) {
85 assert(Lo
.getBitWidth() == Hi
.getBitWidth() && "Mismatched bitwidths!");
87 Type
*Ty
= IntegerType::get(Context
, Lo
.getBitWidth());
88 return createRange(ConstantInt::get(Ty
, Lo
), ConstantInt::get(Ty
, Hi
));
91 MDNode
*MDBuilder::createRange(Constant
*Lo
, Constant
*Hi
) {
92 // If the range is everything then it is useless.
96 // Return the range [Lo, Hi).
97 return MDNode::get(Context
, {createConstant(Lo
), createConstant(Hi
)});
100 MDNode
*MDBuilder::createCallees(ArrayRef
<Function
*> Callees
) {
101 SmallVector
<Metadata
*, 4> Ops
;
102 for (Function
*F
: Callees
)
103 Ops
.push_back(createConstant(F
));
104 return MDNode::get(Context
, Ops
);
107 MDNode
*MDBuilder::createCallbackEncoding(unsigned CalleeArgNo
,
108 ArrayRef
<int> Arguments
,
109 bool VarArgArePassed
) {
110 SmallVector
<Metadata
*, 4> Ops
;
112 Type
*Int64
= Type::getInt64Ty(Context
);
113 Ops
.push_back(createConstant(ConstantInt::get(Int64
, CalleeArgNo
)));
115 for (int ArgNo
: Arguments
)
116 Ops
.push_back(createConstant(ConstantInt::get(Int64
, ArgNo
, true)));
118 Type
*Int1
= Type::getInt1Ty(Context
);
119 Ops
.push_back(createConstant(ConstantInt::get(Int1
, VarArgArePassed
)));
121 return MDNode::get(Context
, Ops
);
124 MDNode
*MDBuilder::mergeCallbackEncodings(MDNode
*ExistingCallbacks
,
126 if (!ExistingCallbacks
)
127 return MDNode::get(Context
, {NewCB
});
129 auto *NewCBCalleeIdxAsCM
= cast
<ConstantAsMetadata
>(NewCB
->getOperand(0));
130 uint64_t NewCBCalleeIdx
=
131 cast
<ConstantInt
>(NewCBCalleeIdxAsCM
->getValue())->getZExtValue();
132 (void)NewCBCalleeIdx
;
134 SmallVector
<Metadata
*, 4> Ops
;
135 unsigned NumExistingOps
= ExistingCallbacks
->getNumOperands();
136 Ops
.resize(NumExistingOps
+ 1);
138 for (unsigned u
= 0; u
< NumExistingOps
; u
++) {
139 Ops
[u
] = ExistingCallbacks
->getOperand(u
);
141 auto *OldCBCalleeIdxAsCM
= cast
<ConstantAsMetadata
>(Ops
[u
]);
142 uint64_t OldCBCalleeIdx
=
143 cast
<ConstantInt
>(OldCBCalleeIdxAsCM
->getValue())->getZExtValue();
144 (void)OldCBCalleeIdx
;
145 assert(NewCBCalleeIdx
!= OldCBCalleeIdx
&&
146 "Cannot map a callback callee index twice!");
149 Ops
[NumExistingOps
] = NewCB
;
150 return MDNode::get(Context
, Ops
);
153 MDNode
*MDBuilder::createAnonymousAARoot(StringRef Name
, MDNode
*Extra
) {
154 SmallVector
<Metadata
*, 3> Args(1, nullptr);
156 Args
.push_back(Extra
);
158 Args
.push_back(createString(Name
));
159 MDNode
*Root
= MDNode::getDistinct(Context
, Args
);
161 // At this point we have
162 // !0 = distinct !{null} <- root
163 // Replace the reserved operand with the root node itself.
164 Root
->replaceOperandWith(0, Root
);
167 // !0 = distinct !{!0} <- root
171 MDNode
*MDBuilder::createTBAARoot(StringRef Name
) {
172 return MDNode::get(Context
, createString(Name
));
175 /// Return metadata for a non-root TBAA node with the given name,
176 /// parent in the TBAA tree, and value for 'pointsToConstantMemory'.
177 MDNode
*MDBuilder::createTBAANode(StringRef Name
, MDNode
*Parent
,
180 Constant
*Flags
= ConstantInt::get(Type::getInt64Ty(Context
), 1);
181 return MDNode::get(Context
,
182 {createString(Name
), Parent
, createConstant(Flags
)});
184 return MDNode::get(Context
, {createString(Name
), Parent
});
187 MDNode
*MDBuilder::createAliasScopeDomain(StringRef Name
) {
188 return MDNode::get(Context
, createString(Name
));
191 MDNode
*MDBuilder::createAliasScope(StringRef Name
, MDNode
*Domain
) {
192 return MDNode::get(Context
, {createString(Name
), Domain
});
195 /// Return metadata for a tbaa.struct node with the given
196 /// struct field descriptions.
197 MDNode
*MDBuilder::createTBAAStructNode(ArrayRef
<TBAAStructField
> Fields
) {
198 SmallVector
<Metadata
*, 4> Vals(Fields
.size() * 3);
199 Type
*Int64
= Type::getInt64Ty(Context
);
200 for (unsigned i
= 0, e
= Fields
.size(); i
!= e
; ++i
) {
201 Vals
[i
* 3 + 0] = createConstant(ConstantInt::get(Int64
, Fields
[i
].Offset
));
202 Vals
[i
* 3 + 1] = createConstant(ConstantInt::get(Int64
, Fields
[i
].Size
));
203 Vals
[i
* 3 + 2] = Fields
[i
].Type
;
205 return MDNode::get(Context
, Vals
);
208 /// Return metadata for a TBAA struct node in the type DAG
209 /// with the given name, a list of pairs (offset, field type in the type DAG).
210 MDNode
*MDBuilder::createTBAAStructTypeNode(
211 StringRef Name
, ArrayRef
<std::pair
<MDNode
*, uint64_t>> Fields
) {
212 SmallVector
<Metadata
*, 4> Ops(Fields
.size() * 2 + 1);
213 Type
*Int64
= Type::getInt64Ty(Context
);
214 Ops
[0] = createString(Name
);
215 for (unsigned i
= 0, e
= Fields
.size(); i
!= e
; ++i
) {
216 Ops
[i
* 2 + 1] = Fields
[i
].first
;
217 Ops
[i
* 2 + 2] = createConstant(ConstantInt::get(Int64
, Fields
[i
].second
));
219 return MDNode::get(Context
, Ops
);
222 /// Return metadata for a TBAA scalar type node with the
223 /// given name, an offset and a parent in the TBAA type DAG.
224 MDNode
*MDBuilder::createTBAAScalarTypeNode(StringRef Name
, MDNode
*Parent
,
226 ConstantInt
*Off
= ConstantInt::get(Type::getInt64Ty(Context
), Offset
);
227 return MDNode::get(Context
,
228 {createString(Name
), Parent
, createConstant(Off
)});
231 /// Return metadata for a TBAA tag node with the given
232 /// base type, access type and offset relative to the base type.
233 MDNode
*MDBuilder::createTBAAStructTagNode(MDNode
*BaseType
, MDNode
*AccessType
,
234 uint64_t Offset
, bool IsConstant
) {
235 IntegerType
*Int64
= Type::getInt64Ty(Context
);
236 ConstantInt
*Off
= ConstantInt::get(Int64
, Offset
);
238 return MDNode::get(Context
, {BaseType
, AccessType
, createConstant(Off
),
239 createConstant(ConstantInt::get(Int64
, 1))});
241 return MDNode::get(Context
, {BaseType
, AccessType
, createConstant(Off
)});
244 MDNode
*MDBuilder::createTBAATypeNode(MDNode
*Parent
, uint64_t Size
,
246 ArrayRef
<TBAAStructField
> Fields
) {
247 SmallVector
<Metadata
*, 4> Ops(3 + Fields
.size() * 3);
248 Type
*Int64
= Type::getInt64Ty(Context
);
250 Ops
[1] = createConstant(ConstantInt::get(Int64
, Size
));
252 for (unsigned I
= 0, E
= Fields
.size(); I
!= E
; ++I
) {
253 Ops
[I
* 3 + 3] = Fields
[I
].Type
;
254 Ops
[I
* 3 + 4] = createConstant(ConstantInt::get(Int64
, Fields
[I
].Offset
));
255 Ops
[I
* 3 + 5] = createConstant(ConstantInt::get(Int64
, Fields
[I
].Size
));
257 return MDNode::get(Context
, Ops
);
260 MDNode
*MDBuilder::createTBAAAccessTag(MDNode
*BaseType
, MDNode
*AccessType
,
261 uint64_t Offset
, uint64_t Size
,
263 IntegerType
*Int64
= Type::getInt64Ty(Context
);
264 auto *OffsetNode
= createConstant(ConstantInt::get(Int64
, Offset
));
265 auto *SizeNode
= createConstant(ConstantInt::get(Int64
, Size
));
267 auto *ImmutabilityFlagNode
= createConstant(ConstantInt::get(Int64
, 1));
268 return MDNode::get(Context
, {BaseType
, AccessType
, OffsetNode
, SizeNode
,
269 ImmutabilityFlagNode
});
271 return MDNode::get(Context
, {BaseType
, AccessType
, OffsetNode
, SizeNode
});
274 MDNode
*MDBuilder::createMutableTBAAAccessTag(MDNode
*Tag
) {
275 MDNode
*BaseType
= cast
<MDNode
>(Tag
->getOperand(0));
276 MDNode
*AccessType
= cast
<MDNode
>(Tag
->getOperand(1));
277 Metadata
*OffsetNode
= Tag
->getOperand(2);
278 uint64_t Offset
= mdconst::extract
<ConstantInt
>(OffsetNode
)->getZExtValue();
280 bool NewFormat
= isa
<MDNode
>(AccessType
->getOperand(0));
282 // See if the tag is already mutable.
283 unsigned ImmutabilityFlagOp
= NewFormat
? 4 : 3;
284 if (Tag
->getNumOperands() <= ImmutabilityFlagOp
)
287 // If Tag is already mutable then return it.
288 Metadata
*ImmutabilityFlagNode
= Tag
->getOperand(ImmutabilityFlagOp
);
289 if (!mdconst::extract
<ConstantInt
>(ImmutabilityFlagNode
)->getValue())
292 // Otherwise, create another node.
294 return createTBAAStructTagNode(BaseType
, AccessType
, Offset
);
296 Metadata
*SizeNode
= Tag
->getOperand(3);
297 uint64_t Size
= mdconst::extract
<ConstantInt
>(SizeNode
)->getZExtValue();
298 return createTBAAAccessTag(BaseType
, AccessType
, Offset
, Size
);
301 MDNode
*MDBuilder::createIrrLoopHeaderWeight(uint64_t Weight
) {
303 createString("loop_header_weight"),
304 createConstant(ConstantInt::get(Type::getInt64Ty(Context
), Weight
)),
306 return MDNode::get(Context
, Vals
);
309 MDNode
*MDBuilder::createPseudoProbeDesc(uint64_t GUID
, uint64_t Hash
,
311 auto *Int64Ty
= Type::getInt64Ty(Context
);
312 SmallVector
<Metadata
*, 3> Ops(3);
313 Ops
[0] = createConstant(ConstantInt::get(Int64Ty
, GUID
));
314 Ops
[1] = createConstant(ConstantInt::get(Int64Ty
, Hash
));
315 Ops
[2] = createString(F
->getName());
316 return MDNode::get(Context
, Ops
);