LLVM 23.0.0git
Constants.h
Go to the documentation of this file.
1//===-- llvm/Constants.h - Constant class subclass definitions --*- 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/// @file
10/// This file contains the declarations for the subclasses of Constant,
11/// which represent the different flavors of constant values that live in LLVM.
12/// Note that Constants are immutable (once created they never change) and are
13/// fully shared by structural equivalence. This means that two structurally
14/// equivalent constants will always have the same address. Constants are
15/// created on demand as needed and never deleted: thus clients don't have to
16/// worry about the lifetime of the objects.
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef LLVM_IR_CONSTANTS_H
21#define LLVM_IR_CONSTANTS_H
22
23#include "llvm/ADT/APFloat.h"
24#include "llvm/ADT/APInt.h"
25#include "llvm/ADT/ArrayRef.h"
26#include "llvm/ADT/STLExtras.h"
27#include "llvm/ADT/StringRef.h"
28#include "llvm/IR/Constant.h"
32#include "llvm/IR/Intrinsics.h"
34#include "llvm/IR/User.h"
35#include "llvm/IR/Value.h"
39#include <cassert>
40#include <cstddef>
41#include <cstdint>
42#include <optional>
43
44namespace llvm {
45
46template <class ConstantClass> struct ConstantAggrKeyType;
47
48/// Base class for constants with no operands.
49///
50/// These constants have no operands; they represent their data directly.
51/// Since they can be in use by unrelated modules (and are never based on
52/// GlobalValues), it never makes sense to RAUW them.
53///
54/// These do not have use lists. It is illegal to inspect the uses. These behave
55/// as if they have no uses (i.e. use_empty() is always true).
56class ConstantData : public Constant {
57 constexpr static IntrusiveOperandsAllocMarker AllocMarker{0};
58
59 friend class Constant;
60
61 Value *handleOperandChangeImpl(Value *From, Value *To) {
62 llvm_unreachable("Constant data does not have operands!");
63 }
64
65protected:
66 explicit ConstantData(Type *Ty, ValueTy VT) : Constant(Ty, VT, AllocMarker) {}
67
68 void *operator new(size_t S) { return ::operator new(S); }
69
70public:
71 void operator delete(void *Ptr) { ::operator delete(Ptr); }
72
73 ConstantData(const ConstantData &) = delete;
74
75 /// Methods to support type inquiry through isa, cast, and dyn_cast.
76 static bool classof(const Value *V) {
77 static_assert(Value::ConstantDataFirstVal == 0,
78 "V->getValueID() >= Value::ConstantDataFirstVal");
79 return V->getValueID() <= ConstantDataLastVal;
80 }
81};
82
83//===----------------------------------------------------------------------===//
84/// This is the shared class of boolean and integer constants. This class
85/// represents both boolean and integral constants.
86/// Class for constant integers.
87class ConstantInt final : public ConstantData {
88 friend class Constant;
89 friend class ConstantVector;
90
91 APInt Val;
92
93 ConstantInt(Type *Ty, const APInt &V);
94
95 void destroyConstantImpl();
96
97 /// Return a ConstantInt with the specified value and an implied Type. The
98 /// type is the vector type whose integer element type corresponds to the bit
99 /// width of the value.
100 static ConstantInt *get(LLVMContext &Context, ElementCount EC,
101 const APInt &V);
102
103public:
104 ConstantInt(const ConstantInt &) = delete;
105
106 LLVM_ABI static ConstantInt *getTrue(LLVMContext &Context);
107 LLVM_ABI static ConstantInt *getFalse(LLVMContext &Context);
108 LLVM_ABI static ConstantInt *getBool(LLVMContext &Context, bool V);
109 LLVM_ABI static Constant *getTrue(Type *Ty);
110 LLVM_ABI static Constant *getFalse(Type *Ty);
111 LLVM_ABI static Constant *getBool(Type *Ty, bool V);
112
113 /// If Ty is a vector type, return a Constant with a splat of the given
114 /// value. Otherwise return a ConstantInt for the given value.
115 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
116 LLVM_ABI static Constant *get(Type *Ty, uint64_t V, bool IsSigned = false,
117 bool ImplicitTrunc = false);
118
119 /// Return a ConstantInt with the specified integer value for the specified
120 /// type. If the type is wider than 64 bits, the value will be zero-extended
121 /// to fit the type, unless IsSigned is true, in which case the value will
122 /// be interpreted as a 64-bit signed integer and sign-extended to fit
123 /// the type.
124 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
125 LLVM_ABI static ConstantInt *get(IntegerType *Ty, uint64_t V,
126 bool IsSigned = false,
127 bool ImplicitTrunc = false);
128
129 /// Return a ConstantInt with the specified value for the specified type. The
130 /// value V will be canonicalized to an unsigned APInt. Accessing it with
131 /// either getSExtValue() or getZExtValue() will yield a correctly sized and
132 /// signed value for the type Ty.
133 /// Get a ConstantInt for a specific signed value.
134 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
135 static ConstantInt *getSigned(IntegerType *Ty, int64_t V,
136 bool ImplicitTrunc = false) {
137 return get(Ty, V, /*IsSigned=*/true, ImplicitTrunc);
138 }
139 static Constant *getSigned(Type *Ty, int64_t V, bool ImplicitTrunc = false) {
140 return get(Ty, V, /*IsSigned=*/true, ImplicitTrunc);
141 }
142
143 /// Return a ConstantInt with the specified value and an implied Type. The
144 /// type is the integer type that corresponds to the bit width of the value.
145 LLVM_ABI static ConstantInt *get(LLVMContext &Context, const APInt &V);
146
147 /// Return a ConstantInt constructed from the string strStart with the given
148 /// radix.
150 uint8_t Radix);
151
152 /// If Ty is a vector type, return a Constant with a splat of the given
153 /// value. Otherwise return a ConstantInt for the given value.
154 LLVM_ABI static Constant *get(Type *Ty, const APInt &V);
155
156 /// Return the constant as an APInt value reference. This allows clients to
157 /// obtain a full-precision copy of the value.
158 /// Return the constant's value.
159 inline const APInt &getValue() const { return Val; }
160
161 /// getBitWidth - Return the scalar bitwidth of this constant.
162 unsigned getBitWidth() const { return Val.getBitWidth(); }
163
164 /// Return the constant as a 64-bit unsigned integer value after it
165 /// has been zero extended as appropriate for the type of this constant. Note
166 /// that this method can assert if the value does not fit in 64 bits.
167 /// Return the zero extended value.
168 inline uint64_t getZExtValue() const { return Val.getZExtValue(); }
169
170 /// Return the constant as a 64-bit integer value after it has been sign
171 /// extended as appropriate for the type of this constant. Note that
172 /// this method can assert if the value does not fit in 64 bits.
173 /// Return the sign extended value.
174 inline int64_t getSExtValue() const { return Val.getSExtValue(); }
175
176 /// Return the constant as an llvm::MaybeAlign.
177 /// Note that this method can assert if the value does not fit in 64 bits or
178 /// is not a power of two.
180 return MaybeAlign(getZExtValue());
181 }
182
183 /// Return the constant as an llvm::Align, interpreting `0` as `Align(1)`.
184 /// Note that this method can assert if the value does not fit in 64 bits or
185 /// is not a power of two.
186 inline Align getAlignValue() const {
188 }
189
190 /// A helper method that can be used to determine if the constant contained
191 /// within is equal to a constant. This only works for very small values,
192 /// because this is all that can be represented with all types.
193 /// Determine if this constant's value is same as an unsigned char.
194 bool equalsInt(uint64_t V) const { return Val == V; }
195
196 /// Variant of the getType() method to always return an IntegerType, which
197 /// reduces the amount of casting needed in parts of the compiler.
198 inline IntegerType *getIntegerType() const {
200 }
201
202 /// This static method returns true if the type Ty is big enough to
203 /// represent the value V. This can be used to avoid having the get method
204 /// assert when V is larger than Ty can represent. Note that there are two
205 /// versions of this method, one for unsigned and one for signed integers.
206 /// Although ConstantInt canonicalizes everything to an unsigned integer,
207 /// the signed version avoids callers having to convert a signed quantity
208 /// to the appropriate unsigned type before calling the method.
209 /// @returns true if V is a valid value for type Ty
210 /// Determine if the value is in range for the given type.
211 LLVM_ABI static bool isValueValidForType(Type *Ty, uint64_t V);
212 LLVM_ABI static bool isValueValidForType(Type *Ty, int64_t V);
213
214 bool isNegative() const { return Val.isNegative(); }
215
216 /// This is just a convenience method to make client code smaller for a
217 /// common code. It also correctly performs the comparison without the
218 /// potential for an assertion from getZExtValue().
219 bool isZero() const { return Val.isZero(); }
220
221 /// This is just a convenience method to make client code smaller for a
222 /// common case. It also correctly performs the comparison without the
223 /// potential for an assertion from getZExtValue().
224 /// Determine if the value is one.
225 bool isOne() const { return Val.isOne(); }
226
227 /// This function will return true iff every bit in this constant is set
228 /// to true.
229 /// @returns true iff this constant's bits are all set to true.
230 /// Determine if the value is all ones.
231 bool isMinusOne() const { return Val.isAllOnes(); }
232
233 /// This function will return true iff this constant represents the largest
234 /// value that may be represented by the constant's type.
235 /// @returns true iff this is the largest value that may be represented
236 /// by this type.
237 /// Determine if the value is maximal.
238 bool isMaxValue(bool IsSigned) const {
239 if (IsSigned)
240 return Val.isMaxSignedValue();
241 else
242 return Val.isMaxValue();
243 }
244
245 /// This function will return true iff this constant represents the smallest
246 /// value that may be represented by this constant's type.
247 /// @returns true if this is the smallest value that may be represented by
248 /// this type.
249 /// Determine if the value is minimal.
250 bool isMinValue(bool IsSigned) const {
251 if (IsSigned)
252 return Val.isMinSignedValue();
253 else
254 return Val.isMinValue();
255 }
256
257 /// This function will return true iff this constant represents a value with
258 /// active bits bigger than 64 bits or a value greater than the given uint64_t
259 /// value.
260 /// @returns true iff this constant is greater or equal to the given number.
261 /// Determine if the value is greater or equal to the given number.
262 bool uge(uint64_t Num) const { return Val.uge(Num); }
263
264 /// getLimitedValue - If the value is smaller than the specified limit,
265 /// return it, otherwise return the limit value. This causes the value
266 /// to saturate to the limit.
267 /// @returns the min of the value of the constant and the specified value
268 /// Get the constant's value with a saturation limit
269 uint64_t getLimitedValue(uint64_t Limit = ~0ULL) const {
270 return Val.getLimitedValue(Limit);
271 }
272
273 /// Methods to support type inquiry through isa, cast, and dyn_cast.
274 static bool classof(const Value *V) {
275 return V->getValueID() == ConstantIntVal;
276 }
277};
278
279//===----------------------------------------------------------------------===//
280/// Class for constant bytes.
281class ConstantByte final : public ConstantData {
282 friend class Constant;
283 friend class ConstantVector;
284
285 APInt Val;
286
287 ConstantByte(Type *Ty, const APInt &V);
288
289 void destroyConstantImpl();
290
291 /// Return a ConstantByte with the specified value and an implied Type. The
292 /// type is the vector type whose byte element type corresponds to the bit
293 /// width of the value.
294 static ConstantByte *get(LLVMContext &Context, ElementCount EC,
295 const APInt &V);
296
297public:
298 ConstantByte(const ConstantByte &) = delete;
299
300 /// If Ty is a vector type, return a Constant with a splat of the given
301 /// value. Otherwise return a ConstantByte for the given value.
302 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
303 LLVM_ABI static Constant *get(Type *Ty, uint64_t V, bool isSigned = false,
304 bool ImplicitTrunc = false);
305
306 /// Return a ConstantByte with the specified byte value for the specified
307 /// type. If the type is wider than 64 bits, the value will be zero-extended
308 /// to fit the type, unless IsSigned is true, in which case the value will
309 /// be interpreted as a 64-bit signed byte and sign-extended to fit
310 /// the type.
311 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
312 LLVM_ABI static ConstantByte *get(ByteType *Ty, uint64_t V,
313 bool isSigned = false,
314 bool ImplicitTrunc = false);
315
316 /// Return a ConstantByte with the specified value for the specified type. The
317 /// value V will be canonicalized to an unsigned APInt. Accessing it with
318 /// either getSExtValue() or getZExtValue() will yield a correctly sized and
319 /// signed value for the type Ty.
320 /// Get a ConstantByte for a specific signed value.
321 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
322 static ConstantByte *getSigned(ByteType *Ty, int64_t V,
323 bool ImplicitTrunc = false) {
324 return get(Ty, V, /*IsSigned=*/true, ImplicitTrunc);
325 }
326 static Constant *getSigned(Type *Ty, int64_t V, bool ImplicitTrunc = false) {
327 return get(Ty, V, /*IsSigned=*/true, ImplicitTrunc);
328 }
329
330 /// Return a ConstantByte with the specified value and an implied Type. The
331 /// type is the byte type that corresponds to the bit width of the value.
332 LLVM_ABI static ConstantByte *get(LLVMContext &Context, const APInt &V);
333
334 /// Return a ConstantByte constructed from the string strStart with the given
335 /// radix.
336 LLVM_ABI static ConstantByte *get(ByteType *Ty, StringRef Str, uint8_t Radix);
337
338 /// If Ty is a vector type, return a Constant with a splat of the given
339 /// value. Otherwise return a ConstantByte for the given value.
340 LLVM_ABI static Constant *get(Type *Ty, const APInt &V);
341
342 /// Return the constant as an APInt value reference. This allows clients to
343 /// obtain a full-precision copy of the value.
344 /// Return the constant's value.
345 inline const APInt &getValue() const { return Val; }
346
347 /// getBitWidth - Return the scalar bitwidth of this constant.
348 unsigned getBitWidth() const { return Val.getBitWidth(); }
349
350 /// Return the constant as a 64-bit byte value after it
351 /// has been zero extended as appropriate for the type of this constant. Note
352 /// that this method can assert if the value does not fit in 64 bits.
353 /// Return the zero extended value.
354 inline uint64_t getZExtValue() const { return Val.getZExtValue(); }
355
356 /// Return the constant as a 64-bit byte value after it has been sign
357 /// extended as appropriate for the type of this constant. Note that
358 /// this method can assert if the value does not fit in 64 bits.
359 /// Return the sign extended value.
360 inline int64_t getSExtValue() const { return Val.getSExtValue(); }
361
362 /// Variant of the getType() method to always return a ByteType, which
363 /// reduces the amount of casting needed in parts of the compiler.
364 inline ByteType *getByteType() const {
366 }
367
368 bool isNegative() const { return Val.isNegative(); }
369
370 /// This is just a convenience method to make client code smaller for a
371 /// common code. It also correctly performs the comparison without the
372 /// potential for an assertion from getZExtValue().
373 bool isZero() const { return Val.isZero(); }
374
375 /// This is just a convenience method to make client code smaller for a
376 /// common case. It also correctly performs the comparison without the
377 /// potential for an assertion from getZExtValue().
378 /// Determine if the value is one.
379 bool isOne() const { return Val.isOne(); }
380
381 /// This function will return true iff every bit in this constant is set
382 /// to true.
383 /// @returns true iff this constant's bits are all set to true.
384 /// Determine if the value is all ones.
385 bool isMinusOne() const { return Val.isAllOnes(); }
386
387 /// This function will return true iff this constant represents the largest
388 /// value that may be represented by the constant's type.
389 /// @returns true iff this is the largest value that may be represented
390 /// by this type.
391 /// Determine if the value is maximal.
392 bool isMaxValue(bool IsSigned) const {
393 if (IsSigned)
394 return Val.isMaxSignedValue();
395 else
396 return Val.isMaxValue();
397 }
398
399 /// This function will return true iff this constant represents the smallest
400 /// value that may be represented by this constant's type.
401 /// @returns true if this is the smallest value that may be represented by
402 /// this type.
403 /// Determine if the value is minimal.
404 bool isMinValue(bool IsSigned) const {
405 if (IsSigned)
406 return Val.isMinSignedValue();
407 else
408 return Val.isMinValue();
409 }
410
411 /// Methods to support type inquiry through isa, cast, and dyn_cast.
412 static bool classof(const Value *V) {
413 return V->getValueID() == ConstantByteVal;
414 }
415};
416
417//===----------------------------------------------------------------------===//
418/// ConstantFP - Floating Point Values [float, double]
419///
420class ConstantFP final : public ConstantData {
421 friend class Constant;
422 friend class ConstantVector;
423
424 APFloat Val;
425
426 ConstantFP(Type *Ty, const APFloat &V);
427
428 void destroyConstantImpl();
429
430 /// Return a ConstantFP with the specified value and an implied Type. The
431 /// type is the vector type whose element type has the same floating point
432 /// semantics as the value.
433 static ConstantFP *get(LLVMContext &Context, ElementCount EC,
434 const APFloat &V);
435
436public:
437 ConstantFP(const ConstantFP &) = delete;
438
439 /// This returns a ConstantFP, or a vector containing a splat of a ConstantFP,
440 /// for the specified value in the specified type. This should only be used
441 /// for simple constant values like 2.0/1.0 etc, that are known-valid both as
442 /// host double and as the target format.
443 LLVM_ABI static Constant *get(Type *Ty, double V);
444
445 /// If Ty is a vector type, return a Constant with a splat of the given
446 /// value. Otherwise return a ConstantFP for the given value.
447 LLVM_ABI static Constant *get(Type *Ty, const APFloat &V);
448
449 LLVM_ABI static Constant *get(Type *Ty, StringRef Str);
450 LLVM_ABI static ConstantFP *get(LLVMContext &Context, const APFloat &V);
451 LLVM_ABI static Constant *getNaN(Type *Ty, bool Negative = false,
452 uint64_t Payload = 0);
453 LLVM_ABI static Constant *getQNaN(Type *Ty, bool Negative = false,
454 APInt *Payload = nullptr);
455 LLVM_ABI static Constant *getSNaN(Type *Ty, bool Negative = false,
456 APInt *Payload = nullptr);
457 LLVM_ABI static Constant *getZero(Type *Ty, bool Negative = false);
458 static Constant *getNegativeZero(Type *Ty) { return getZero(Ty, true); }
459 LLVM_ABI static Constant *getInfinity(Type *Ty, bool Negative = false);
460
461 /// Return true if Ty is big enough to represent V.
462 LLVM_ABI static bool isValueValidForType(Type *Ty, const APFloat &V);
463 inline const APFloat &getValueAPF() const { return Val; }
464 inline const APFloat &getValue() const { return Val; }
465
466 /// Return true if the value is positive or negative zero.
467 bool isZero() const { return Val.isZero(); }
468
469 /// Return true if the value is positive zero.
470 bool isPosZero() const { return Val.isPosZero(); }
471
472 /// Return true if the sign bit is set.
473 bool isNegative() const { return Val.isNegative(); }
474
475 /// Return true if the value is infinity
476 bool isInfinity() const { return Val.isInfinity(); }
477
478 /// Return true if the value is a NaN.
479 bool isNaN() const { return Val.isNaN(); }
480
481 /// We don't rely on operator== working on double values, as it returns true
482 /// for things that are clearly not equal, like -0.0 and 0.0.
483 /// As such, this method can be used to do an exact bit-for-bit comparison of
484 /// two floating point values. The version with a double operand is retained
485 /// because it's so convenient to write isExactlyValue(2.0), but please use
486 /// it only for simple constants.
487 LLVM_ABI bool isExactlyValue(const APFloat &V) const;
488
489 bool isExactlyValue(double V) const {
490 bool ignored;
491 APFloat FV(V);
492 FV.convert(Val.getSemantics(), APFloat::rmNearestTiesToEven, &ignored);
493 return isExactlyValue(FV);
494 }
495
496 /// Methods for support type inquiry through isa, cast, and dyn_cast:
497 static bool classof(const Value *V) {
498 return V->getValueID() == ConstantFPVal;
499 }
500};
501
502//===----------------------------------------------------------------------===//
503/// All zero aggregate value
504///
505class ConstantAggregateZero final : public ConstantData {
506 friend class Constant;
507
508 explicit ConstantAggregateZero(Type *Ty)
509 : ConstantData(Ty, ConstantAggregateZeroVal) {}
510
511 void destroyConstantImpl();
512
513public:
514 ConstantAggregateZero(const ConstantAggregateZero &) = delete;
515
516 LLVM_ABI static ConstantAggregateZero *get(Type *Ty);
517
518 /// If this CAZ has array or vector type, return a zero with the right element
519 /// type.
521
522 /// If this CAZ has struct type, return a zero with the right element type for
523 /// the specified element.
524 LLVM_ABI Constant *getStructElement(unsigned Elt) const;
525
526 /// Return a zero of the right value for the specified GEP index if we can,
527 /// otherwise return null (e.g. if C is a ConstantExpr).
529
530 /// Return a zero of the right value for the specified GEP index.
531 LLVM_ABI Constant *getElementValue(unsigned Idx) const;
532
533 /// Return the number of elements in the array, vector, or struct.
535
536 /// Methods for support type inquiry through isa, cast, and dyn_cast:
537 ///
538 static bool classof(const Value *V) {
539 return V->getValueID() == ConstantAggregateZeroVal;
540 }
541};
542
543/// Base class for aggregate constants (with operands).
544///
545/// These constants are aggregates of other constants, which are stored as
546/// operands.
547///
548/// Subclasses are \a ConstantStruct, \a ConstantArray, and \a
549/// ConstantVector.
550///
551/// \note Some subclasses of \a ConstantData are semantically aggregates --
552/// such as \a ConstantDataArray -- but are not subclasses of this because they
553/// use operands.
555protected:
558
559public:
560 /// Transparently provide more efficient getOperand methods.
562
563 /// Methods for support type inquiry through isa, cast, and dyn_cast:
564 static bool classof(const Value *V) {
565 return V->getValueID() >= ConstantAggregateFirstVal &&
566 V->getValueID() <= ConstantAggregateLastVal;
567 }
568};
569
570template <>
572 : public VariadicOperandTraits<ConstantAggregate> {};
573
575
576//===----------------------------------------------------------------------===//
577/// ConstantArray - Constant Array Declarations
578///
579class ConstantArray final : public ConstantAggregate {
580 friend struct ConstantAggrKeyType<ConstantArray>;
581 friend class Constant;
582
583 ConstantArray(ArrayType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
584
585 void destroyConstantImpl();
586 Value *handleOperandChangeImpl(Value *From, Value *To);
587
588public:
589 // ConstantArray accessors
591
592private:
593 static Constant *getImpl(ArrayType *T, ArrayRef<Constant *> V);
594
595public:
596 /// Specialize the getType() method to always return an ArrayType,
597 /// which reduces the amount of casting needed in parts of the compiler.
598 inline ArrayType *getType() const {
600 }
601
602 /// Methods for support type inquiry through isa, cast, and dyn_cast:
603 static bool classof(const Value *V) {
604 return V->getValueID() == ConstantArrayVal;
605 }
606};
607
608//===----------------------------------------------------------------------===//
609// Constant Struct Declarations
610//
611class ConstantStruct final : public ConstantAggregate {
612 friend struct ConstantAggrKeyType<ConstantStruct>;
613 friend class Constant;
614
615 ConstantStruct(StructType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
616
617 void destroyConstantImpl();
618 Value *handleOperandChangeImpl(Value *From, Value *To);
619
620public:
621 // ConstantStruct accessors
623
624 template <typename... Csts>
625 static std::enable_if_t<are_base_of<Constant, Csts...>::value, Constant *>
626 get(StructType *T, Csts *...Vs) {
627 return get(T, ArrayRef<Constant *>({Vs...}));
628 }
629
630 /// Return an anonymous struct that has the specified elements.
631 /// If the struct is possibly empty, then you must specify a context.
632 static Constant *getAnon(ArrayRef<Constant *> V, bool Packed = false) {
633 return get(getTypeForElements(V, Packed), V);
634 }
636 bool Packed = false) {
637 return get(getTypeForElements(Ctx, V, Packed), V);
638 }
639
640 /// Return an anonymous struct type to use for a constant with the specified
641 /// set of elements. The list must not be empty.
643 bool Packed = false);
644 /// This version of the method allows an empty list.
647 bool Packed = false);
648
649 /// Specialization - reduce amount of casting.
650 inline StructType *getType() const {
652 }
653
654 /// Methods for support type inquiry through isa, cast, and dyn_cast:
655 static bool classof(const Value *V) {
656 return V->getValueID() == ConstantStructVal;
657 }
658};
659
660//===----------------------------------------------------------------------===//
661/// Constant Vector Declarations
662///
663class ConstantVector final : public ConstantAggregate {
664 friend struct ConstantAggrKeyType<ConstantVector>;
665 friend class Constant;
666
667 ConstantVector(VectorType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
668
669 void destroyConstantImpl();
670 Value *handleOperandChangeImpl(Value *From, Value *To);
671
672public:
673 // ConstantVector accessors
675
676private:
677 static Constant *getImpl(ArrayRef<Constant *> V);
678
679public:
680 /// Return a ConstantVector with the specified constant in each element.
681 /// Note that this might not return an instance of ConstantVector
683
684 /// Specialize the getType() method to always return a FixedVectorType,
685 /// which reduces the amount of casting needed in parts of the compiler.
686 inline FixedVectorType *getType() const {
688 }
689
690 /// If all elements of the vector constant have the same value, return that
691 /// value. Otherwise, return nullptr. Ignore poison elements by setting
692 /// AllowPoison to true.
693 LLVM_ABI Constant *getSplatValue(bool AllowPoison = false) const;
694
695 /// Methods for support type inquiry through isa, cast, and dyn_cast:
696 static bool classof(const Value *V) {
697 return V->getValueID() == ConstantVectorVal;
698 }
699};
700
701//===----------------------------------------------------------------------===//
702/// A constant pointer value that points to null. This represents both scalar
703/// pointer nulls and vector splats of pointer nulls.
704///
705class ConstantPointerNull final : public ConstantData {
706 friend class Constant;
707
708 explicit ConstantPointerNull(Type *T)
709 : ConstantData(T, Value::ConstantPointerNullVal) {}
710
711 void destroyConstantImpl();
712
713public:
714 ConstantPointerNull(const ConstantPointerNull &) = delete;
715
716 /// Static factory methods - Return objects of the specified value. If Ty is a
717 /// vector type, return a ConstantPointerNull with a splat of null pointer
718 /// values. Otherwise return a ConstantPointerNull for the given pointer type.
719 LLVM_ABI static ConstantPointerNull *get(PointerType *T);
720 LLVM_ABI static ConstantPointerNull *get(Type *T);
721
722 /// Return the scalar pointer type for this null value.
724 return cast<PointerType>(Value::getType()->getScalarType());
725 }
726
727 /// Methods for support type inquiry through isa, cast, and dyn_cast:
728 static bool classof(const Value *V) {
729 return V->getValueID() == ConstantPointerNullVal;
730 }
731};
732
733//===----------------------------------------------------------------------===//
734/// ConstantDataSequential - A vector or array constant whose element type is a
735/// simple 1/2/4/8-byte integer/byte or half/bfloat/float/double, and whose
736/// elements are just simple data values (i.e. ConstantInt/ConstantByte/
737/// ConstantFP). This Constant node has no operands because it stores all of
738/// the elements of the constant as densely packed data, instead of as Value*'s.
739///
740/// This is the common base class of ConstantDataArray and ConstantDataVector.
741///
743 friend class LLVMContextImpl;
744 friend class Constant;
745
746 /// A pointer to the bytes underlying this constant (which is owned by the
747 /// uniquing StringMap).
748 const char *DataElements;
749
750 /// This forms a link list of ConstantDataSequential nodes that have
751 /// the same value but different type. For example, 0,0,0,1 could be a 4
752 /// element array of i8, or a 1-element array of i32. They'll both end up in
753 /// the same StringMap bucket, linked up.
754 std::unique_ptr<ConstantDataSequential> Next;
755
756 void destroyConstantImpl();
757
758protected:
759 explicit ConstantDataSequential(Type *ty, ValueTy VT, const char *Data)
760 : ConstantData(ty, VT), DataElements(Data) {}
761
762 LLVM_ABI static Constant *getImpl(StringRef Bytes, Type *Ty);
763
764public:
766
767 /// Return true if a ConstantDataSequential can be formed with a vector or
768 /// array of the specified element type.
769 /// ConstantDataArray only works with normal float and int types that are
770 /// stored densely in memory, not with things like i42 or x86_f80.
771 LLVM_ABI static bool isElementTypeCompatible(Type *Ty);
772
773 /// If this is a sequential container of integers (of any size), return the
774 /// specified element in the low bits of a uint64_t.
776
777 /// If this is a sequential container of integers (of any size), return the
778 /// specified element as an APInt.
780
781 /// If this is a sequential container of floating point type, return the
782 /// specified element as an APFloat.
784
785 /// If this is an sequential container of floats, return the specified element
786 /// as a float.
787 LLVM_ABI float getElementAsFloat(uint64_t i) const;
788
789 /// If this is an sequential container of doubles, return the specified
790 /// element as a double.
791 LLVM_ABI double getElementAsDouble(uint64_t i) const;
792
793 /// Return a Constant for a specified index's element.
794 /// Note that this has to compute a new constant to return, so it isn't as
795 /// efficient as getElementAsInteger/Float/Double.
797
798 /// Return the element type of the array/vector.
800
801 /// Return the number of elements in the array or vector.
803
804 /// Return the size (in bytes) of each element in the array/vector.
805 /// The size of the elements is known to be a multiple of one byte.
807
808 /// This method returns true if this is an array of \p CharSize integers or
809 /// bytes.
810 LLVM_ABI bool isString(unsigned CharSize = 8) const;
811
812 /// This method returns true if the array "isString", ends with a null byte,
813 /// and does not contains any other null bytes.
814 LLVM_ABI bool isCString() const;
815
816 /// If this array is isString(), then this method returns the array as a
817 /// StringRef. Otherwise, it asserts out.
819 assert(isString() && "Not a string");
820 return getRawDataValues();
821 }
822
823 /// If this array is isCString(), then this method returns the array (without
824 /// the trailing null byte) as a StringRef. Otherwise, it asserts out.
826 assert(isCString() && "Isn't a C string");
827 StringRef Str = getAsString();
828 return Str.drop_back();
829 }
830
831 /// Return the raw, underlying, bytes of this data. Note that this is an
832 /// extremely tricky thing to work with, as it exposes the host endianness of
833 /// the data elements.
835
836 /// Methods for support type inquiry through isa, cast, and dyn_cast:
837 static bool classof(const Value *V) {
838 return V->getValueID() == ConstantDataArrayVal ||
839 V->getValueID() == ConstantDataVectorVal;
840 }
841
842private:
843 const char *getElementPointer(uint64_t Elt) const;
844};
845
846//===----------------------------------------------------------------------===//
847/// An array constant whose element type is a simple 1/2/4/8-byte integer, bytes
848/// or float/double, and whose elements are just simple data values
849/// (i.e. ConstantInt/ConstantFP). This Constant node has no operands because it
850/// stores all of the elements of the constant as densely packed data, instead
851/// of as Value*'s.
852class ConstantDataArray final : public ConstantDataSequential {
854
855 explicit ConstantDataArray(Type *ty, const char *Data)
856 : ConstantDataSequential(ty, ConstantDataArrayVal, Data) {}
857
858public:
859 ConstantDataArray(const ConstantDataArray &) = delete;
860
861 /// get() constructor - Return a constant with array type with an element
862 /// count and element type matching the ArrayRef passed in. Note that this
863 /// can return a ConstantAggregateZero object.
864 template <typename ElementTy>
865 static Constant *get(LLVMContext &Context, ArrayRef<ElementTy> Elts) {
866 const char *Data = reinterpret_cast<const char *>(Elts.data());
867 return getRaw(StringRef(Data, Elts.size() * sizeof(ElementTy)), Elts.size(),
869 }
870
871 /// get() constructor - ArrayTy needs to be compatible with
872 /// ArrayRef<ElementTy>. Calls get(LLVMContext, ArrayRef<ElementTy>).
873 template <typename ArrayTy>
874 static Constant *get(LLVMContext &Context, ArrayTy &Elts) {
875 return ConstantDataArray::get(Context, ArrayRef(Elts));
876 }
877
878 /// getRaw() constructor - Return a constant with array type with an element
879 /// count and element type matching the NumElements and ElementTy parameters
880 /// passed in. Note that this can return a ConstantAggregateZero object.
881 /// ElementTy must be one of i8/i16/i32/i64/b8/b16/b32/b64/half/bfloat/float/
882 /// double. Data is the buffer containing the elements. Be careful to make
883 /// sure Data uses the right endianness, the buffer will be used as-is.
884 static Constant *getRaw(StringRef Data, uint64_t NumElements,
885 Type *ElementTy) {
886 Type *Ty = ArrayType::get(ElementTy, NumElements);
887 return getImpl(Data, Ty);
888 }
889
890 /// getFP() constructors - Return a constant of array type with a float
891 /// element type taken from argument `ElementType', and count taken from
892 /// argument `Elts'. The amount of bits of the contained type must match the
893 /// number of bits of the type contained in the passed in ArrayRef.
894 /// (i.e. half or bfloat for 16bits, float for 32bits, double for 64bits) Note
895 /// that this can return a ConstantAggregateZero object.
896 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint16_t> Elts);
897 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint32_t> Elts);
898 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint64_t> Elts);
899
900 /// getByte() constructors - Return a constant of array type with a byte
901 /// element type taken from argument `ElementType', and count taken from
902 /// argument `Elts'. The amount of bits of the contained type must match the
903 /// number of bits of the type contained in the passed in ArrayRef.
904 /// Note that this can return a ConstantAggregateZero object.
905 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint8_t> Elts);
906 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint16_t> Elts);
907 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint32_t> Elts);
908 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint64_t> Elts);
909
910 /// This method constructs a CDS and initializes it with a text string.
911 /// The default behavior (AddNull==true) causes a null terminator to
912 /// be placed at the end of the array (increasing the length of the string by
913 /// one more than the StringRef would normally indicate. Pass AddNull=false
914 /// to disable this behavior.
915 LLVM_ABI static Constant *getString(LLVMContext &Context,
916 StringRef Initializer,
917 bool AddNull = true,
918 bool ByteString = false);
919
920 /// Specialize the getType() method to always return an ArrayType,
921 /// which reduces the amount of casting needed in parts of the compiler.
922 inline ArrayType *getType() const {
924 }
925
926 /// Methods for support type inquiry through isa, cast, and dyn_cast:
927 static bool classof(const Value *V) {
928 return V->getValueID() == ConstantDataArrayVal;
929 }
930};
931
932//===----------------------------------------------------------------------===//
933/// A vector constant whose element type is a simple 1/2/4/8-byte integer or
934/// float/double, and whose elements are just simple data values
935/// (i.e. ConstantInt/ConstantFP). This Constant node has no operands because it
936/// stores all of the elements of the constant as densely packed data, instead
937/// of as Value*'s.
938class ConstantDataVector final : public ConstantDataSequential {
940
941 explicit ConstantDataVector(Type *ty, const char *Data)
942 : ConstantDataSequential(ty, ConstantDataVectorVal, Data),
943 IsSplatSet(false) {}
944 // Cache whether or not the constant is a splat.
945 mutable bool IsSplatSet : 1;
946 mutable bool IsSplat : 1;
947 bool isSplatData() const;
948
949public:
950 ConstantDataVector(const ConstantDataVector &) = delete;
951
952 /// get() constructors - Return a constant with vector type with an element
953 /// count and element type matching the ArrayRef passed in. Note that this
954 /// can return a ConstantAggregateZero object.
955 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint8_t> Elts);
956 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint16_t> Elts);
957 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint32_t> Elts);
958 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint64_t> Elts);
959 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<float> Elts);
960 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<double> Elts);
961
962 /// getRaw() constructor - Return a constant with vector type with an element
963 /// count and element type matching the NumElements and ElementTy parameters
964 /// passed in. Note that this can return a ConstantAggregateZero object.
965 /// ElementTy must be one of i8/i16/i32/i64/b8/b16/b32/b64/half/bfloat/float/
966 /// double. Data is the buffer containing the elements. Be careful to make
967 /// sure Data uses the right endianness, the buffer will be used as-is.
968 static Constant *getRaw(StringRef Data, uint64_t NumElements,
969 Type *ElementTy) {
970 Type *Ty = VectorType::get(ElementTy, ElementCount::getFixed(NumElements));
971 return getImpl(Data, Ty);
972 }
973
974 /// getByte() constructors - Return a constant of vector type with a byte
975 /// element type taken from argument `ElementType', and count taken from
976 /// argument `Elts'. The amount of bits of the contained type must match the
977 /// number of bits of the type contained in the passed in ArrayRef.
978 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint8_t> Elts);
979 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint16_t> Elts);
980 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint32_t> Elts);
981 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint64_t> Elts);
982
983 /// getFP() constructors - Return a constant of vector type with a float
984 /// element type taken from argument `ElementType', and count taken from
985 /// argument `Elts'. The amount of bits of the contained type must match the
986 /// number of bits of the type contained in the passed in ArrayRef.
987 /// (i.e. half or bfloat for 16bits, float for 32bits, double for 64bits) Note
988 /// that this can return a ConstantAggregateZero object.
989 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint16_t> Elts);
990 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint32_t> Elts);
991 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint64_t> Elts);
992
993 /// Return a ConstantVector with the specified constant in each element.
994 /// The specified constant has to be a of a compatible type (i8/i16/
995 /// i32/i64/b8/b16/b32/b64/half/bfloat/float/double) and must be a ConstantFP,
996 /// ConstantByte or ConstantInt.
997 LLVM_ABI static Constant *getSplat(unsigned NumElts, Constant *Elt);
998
999 /// Returns true if this is a splat constant, meaning that all elements have
1000 /// the same value.
1001 LLVM_ABI bool isSplat() const;
1002
1003 /// If this is a splat constant, meaning that all of the elements have the
1004 /// same value, return that value. Otherwise return NULL.
1006
1007 /// Specialize the getType() method to always return a FixedVectorType,
1008 /// which reduces the amount of casting needed in parts of the compiler.
1009 inline FixedVectorType *getType() const {
1011 }
1012
1013 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1014 static bool classof(const Value *V) {
1015 return V->getValueID() == ConstantDataVectorVal;
1016 }
1017};
1018
1019//===----------------------------------------------------------------------===//
1020/// A constant token which is empty
1021///
1022class ConstantTokenNone final : public ConstantData {
1023 friend class Constant;
1024
1025 explicit ConstantTokenNone(LLVMContext &Context)
1026 : ConstantData(Type::getTokenTy(Context), ConstantTokenNoneVal) {}
1027
1028 void destroyConstantImpl();
1029
1030public:
1031 ConstantTokenNone(const ConstantTokenNone &) = delete;
1032
1033 /// Return the ConstantTokenNone.
1034 LLVM_ABI static ConstantTokenNone *get(LLVMContext &Context);
1035
1036 /// Methods to support type inquiry through isa, cast, and dyn_cast.
1037 static bool classof(const Value *V) {
1038 return V->getValueID() == ConstantTokenNoneVal;
1039 }
1040};
1041
1042/// A constant target extension type default initializer
1043class ConstantTargetNone final : public ConstantData {
1044 friend class Constant;
1045
1046 explicit ConstantTargetNone(TargetExtType *T)
1047 : ConstantData(T, Value::ConstantTargetNoneVal) {}
1048
1049 void destroyConstantImpl();
1050
1051public:
1052 ConstantTargetNone(const ConstantTargetNone &) = delete;
1053
1054 /// Static factory methods - Return objects of the specified value.
1055 LLVM_ABI static ConstantTargetNone *get(TargetExtType *T);
1056
1057 /// Specialize the getType() method to always return an TargetExtType,
1058 /// which reduces the amount of casting needed in parts of the compiler.
1059 inline TargetExtType *getType() const {
1061 }
1062
1063 /// Methods for support type inquiry through isa, cast, and dyn_cast.
1064 static bool classof(const Value *V) {
1065 return V->getValueID() == ConstantTargetNoneVal;
1066 }
1067};
1068
1069/// The address of a basic block.
1070///
1071class BlockAddress final : public Constant {
1072 friend class Constant;
1073
1074 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
1075
1076 BlockAddress(Type *Ty, BasicBlock *BB);
1077
1078 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1079
1080 void destroyConstantImpl();
1081 Value *handleOperandChangeImpl(Value *From, Value *To);
1082
1083public:
1084 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
1085
1086 /// Return a BlockAddress for the specified function and basic block.
1088
1089 /// Return a BlockAddress for the specified basic block. The basic
1090 /// block must be embedded into a function.
1091 LLVM_ABI static BlockAddress *get(BasicBlock *BB);
1092
1093 /// Return a BlockAddress for the specified basic block, which may not be
1094 /// part of a function. The specified type must match the type of the function
1095 /// the block will be inserted into.
1096 LLVM_ABI static BlockAddress *get(Type *Ty, BasicBlock *BB);
1097
1098 /// Lookup an existing \c BlockAddress constant for the given BasicBlock.
1099 ///
1100 /// \returns 0 if \c !BB->hasAddressTaken(), otherwise the \c BlockAddress.
1101 LLVM_ABI static BlockAddress *lookup(const BasicBlock *BB);
1102
1103 /// Transparently provide more efficient getOperand methods.
1105
1108
1109 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1110 static bool classof(const Value *V) {
1111 return V->getValueID() == BlockAddressVal;
1112 }
1113};
1114
1115template <>
1117 : public FixedNumOperandTraits<BlockAddress, 1> {};
1118
1120
1121/// Wrapper for a function that represents a value that
1122/// functionally represents the original function. This can be a function,
1123/// global alias to a function, or an ifunc.
1124class DSOLocalEquivalent final : public Constant {
1125 friend class Constant;
1126
1127 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
1128
1130
1131 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1132
1133 void destroyConstantImpl();
1134 Value *handleOperandChangeImpl(Value *From, Value *To);
1135
1136public:
1137 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
1138
1139 /// Return a DSOLocalEquivalent for the specified global value.
1141
1142 /// Transparently provide more efficient getOperand methods.
1144
1146 return cast<GlobalValue>(Op<0>().get());
1147 }
1148
1149 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1150 static bool classof(const Value *V) {
1151 return V->getValueID() == DSOLocalEquivalentVal;
1152 }
1153};
1154
1155template <>
1157 : public FixedNumOperandTraits<DSOLocalEquivalent, 1> {};
1158
1160
1161/// Wrapper for a value that won't be replaced with a CFI jump table
1162/// pointer in LowerTypeTestsModule.
1163class NoCFIValue final : public Constant {
1164 friend class Constant;
1165
1166 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
1167
1169
1170 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1171
1172 void destroyConstantImpl();
1173 Value *handleOperandChangeImpl(Value *From, Value *To);
1174
1175public:
1176 /// Return a NoCFIValue for the specified function.
1177 LLVM_ABI static NoCFIValue *get(GlobalValue *GV);
1178
1179 /// Transparently provide more efficient getOperand methods.
1181
1183 return cast<GlobalValue>(Op<0>().get());
1184 }
1185
1186 /// NoCFIValue is always a pointer.
1189 }
1190
1191 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1192 static bool classof(const Value *V) {
1193 return V->getValueID() == NoCFIValueVal;
1194 }
1195};
1196
1197template <>
1198struct OperandTraits<NoCFIValue> : public FixedNumOperandTraits<NoCFIValue, 1> {
1199};
1200
1202
1203/// A signed pointer, in the ptrauth sense.
1204class ConstantPtrAuth final : public Constant {
1206 friend class Constant;
1207
1208 constexpr static IntrusiveOperandsAllocMarker AllocMarker{5};
1209
1211 Constant *AddrDisc, Constant *DeactivationSymbol);
1212
1213 void *operator new(size_t s) { return User::operator new(s, AllocMarker); }
1214
1215 void destroyConstantImpl();
1216 Value *handleOperandChangeImpl(Value *From, Value *To);
1217
1218public:
1219 /// Return a pointer signed with the specified parameters.
1220 LLVM_ABI static ConstantPtrAuth *get(Constant *Ptr, ConstantInt *Key,
1221 ConstantInt *Disc, Constant *AddrDisc,
1222 Constant *DeactivationSymbol);
1223
1224 /// Produce a new ptrauth expression signing the given value using
1225 /// the same schema as is stored in one.
1226 LLVM_ABI ConstantPtrAuth *getWithSameSchema(Constant *Pointer) const;
1227
1228 /// Transparently provide more efficient getOperand methods.
1230
1231 /// The pointer that is signed in this ptrauth signed pointer.
1232 Constant *getPointer() const { return cast<Constant>(Op<0>().get()); }
1233
1234 /// The Key ID, an i32 constant.
1236
1237 /// The integer discriminator, an i64 constant, or 0.
1239 return cast<ConstantInt>(Op<2>().get());
1240 }
1241
1242 /// The address discriminator if any, or the null constant.
1243 /// If present, this must be a value equivalent to the storage location of
1244 /// the only global-initializer user of the ptrauth signed pointer.
1246 return cast<Constant>(Op<3>().get());
1247 }
1248
1249 /// Whether there is any non-null address discriminator.
1253
1255 return cast<Constant>(Op<4>().get());
1256 }
1257
1258 /// A constant value for the address discriminator which has special
1259 /// significance to ctors/dtors lowering. Regular address discrimination can't
1260 /// be applied for them since uses of llvm.global_{c|d}tors are disallowed
1261 /// (see Verifier::visitGlobalVariable) and we can't emit getelementptr
1262 /// expressions referencing these special arrays.
1264
1265 /// Whether the address uses a special address discriminator.
1266 /// These discriminators can't be used in real pointer-auth values; they
1267 /// can only be used in "prototype" values that indicate how some real
1268 /// schema is supposed to be produced.
1269 LLVM_ABI bool hasSpecialAddressDiscriminator(uint64_t Value) const;
1270
1271 /// Check whether an authentication operation with key \p Key and (possibly
1272 /// blended) discriminator \p Discriminator is known to be compatible with
1273 /// this ptrauth signed pointer.
1274 LLVM_ABI bool isKnownCompatibleWith(const Value *Key,
1275 const Value *Discriminator,
1276 const DataLayout &DL) const;
1277
1278 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1279 static bool classof(const Value *V) {
1280 return V->getValueID() == ConstantPtrAuthVal;
1281 }
1282};
1283
1284template <>
1286 : public FixedNumOperandTraits<ConstantPtrAuth, 5> {};
1287
1289
1290//===----------------------------------------------------------------------===//
1291/// A constant value that is initialized with an expression using
1292/// other constant values.
1293///
1294/// This class uses the standard Instruction opcodes to define the various
1295/// constant expressions. The Opcode field for the ConstantExpr class is
1296/// maintained in the Value::SubclassData field.
1297class ConstantExpr : public Constant {
1298 friend struct ConstantExprKeyType;
1299 friend class Constant;
1300
1301 void destroyConstantImpl();
1302 Value *handleOperandChangeImpl(Value *From, Value *To);
1303
1304protected:
1305 ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
1306 : Constant(ty, ConstantExprVal, AllocInfo) {
1307 // Operation type (an Instruction opcode) is stored as the SubclassData.
1308 setValueSubclassData(Opcode);
1309 }
1310
1311 ~ConstantExpr() = default;
1312
1313public:
1314 // Static methods to construct a ConstantExpr of different kinds. Note that
1315 // these methods may return a object that is not an instance of the
1316 // ConstantExpr class, because they will attempt to fold the constant
1317 // expression into something simpler if possible.
1318
1319 /// getAlignOf constant expr - computes the alignment of a type in a target
1320 /// independent way (Note: the return type is an i64).
1321 LLVM_ABI static Constant *getAlignOf(Type *Ty);
1322
1323 /// getSizeOf constant expr - computes the (alloc) size of a type (in
1324 /// address-units, not bits) in a target independent way (Note: the return
1325 /// type is an i64).
1326 ///
1327 LLVM_ABI static Constant *getSizeOf(Type *Ty);
1328
1329 LLVM_ABI static Constant *getNeg(Constant *C, bool HasNSW = false);
1330 LLVM_ABI static Constant *getNot(Constant *C);
1331 LLVM_ABI static Constant *getAdd(Constant *C1, Constant *C2,
1332 bool HasNUW = false, bool HasNSW = false);
1333 LLVM_ABI static Constant *getSub(Constant *C1, Constant *C2,
1334 bool HasNUW = false, bool HasNSW = false);
1335 LLVM_ABI static Constant *getXor(Constant *C1, Constant *C2);
1336 LLVM_ABI static Constant *getTrunc(Constant *C, Type *Ty,
1337 bool OnlyIfReduced = false);
1339 bool OnlyIfReduced = false);
1341 bool OnlyIfReduced = false);
1343 bool OnlyIfReduced = false);
1344 LLVM_ABI static Constant *getBitCast(Constant *C, Type *Ty,
1345 bool OnlyIfReduced = false);
1347 bool OnlyIfReduced = false);
1348
1349 static Constant *getNSWNeg(Constant *C) { return getNeg(C, /*HasNSW=*/true); }
1350
1352 return getAdd(C1, C2, false, true);
1353 }
1354
1356 return getAdd(C1, C2, true, false);
1357 }
1358
1360 return getSub(C1, C2, false, true);
1361 }
1362
1364 return getSub(C1, C2, true, false);
1365 }
1366
1367 /// If C is a scalar/fixed width vector of known powers of 2, then this
1368 /// function returns a new scalar/fixed width vector obtained from logBase2
1369 /// of C. Undef vector elements are set to zero.
1370 /// Return a null pointer otherwise.
1371 LLVM_ABI static Constant *getExactLogBase2(Constant *C);
1372
1373 /// Return the identity constant for a binary opcode.
1374 /// If the binop is not commutative, callers can acquire the operand 1
1375 /// identity constant by setting AllowRHSConstant to true. For example, any
1376 /// shift has a zero identity constant for operand 1: X shift 0 = X. If this
1377 /// is a fadd/fsub operation and we don't care about signed zeros, then
1378 /// setting NSZ to true returns the identity +0.0 instead of -0.0. Return
1379 /// nullptr if the operator does not have an identity constant.
1380 LLVM_ABI static Constant *getBinOpIdentity(unsigned Opcode, Type *Ty,
1381 bool AllowRHSConstant = false,
1382 bool NSZ = false);
1383
1384 LLVM_ABI static Constant *getIntrinsicIdentity(Intrinsic::ID, Type *Ty);
1385
1386 /// Return the identity constant for a binary or intrinsic Instruction.
1387 /// The identity constant C is defined as X op C = X and C op X = X where C
1388 /// and X are the first two operands, and the operation is commutative.
1389 LLVM_ABI static Constant *getIdentity(Instruction *I, Type *Ty,
1390 bool AllowRHSConstant = false,
1391 bool NSZ = false);
1392
1393 /// Return the absorbing element for the given binary
1394 /// operation, i.e. a constant C such that X op C = C and C op X = C for
1395 /// every X. For example, this returns zero for integer multiplication.
1396 /// If AllowLHSConstant is true, the LHS operand is a constant C that must be
1397 /// defined as C op X = C. It returns null if the operator doesn't have
1398 /// an absorbing element.
1399 LLVM_ABI static Constant *getBinOpAbsorber(unsigned Opcode, Type *Ty,
1400 bool AllowLHSConstant = false);
1401
1402 /// Transparently provide more efficient getOperand methods.
1404
1405 /// Convenience function for getting a Cast operation.
1406 ///
1407 /// \param ops The opcode for the conversion
1408 /// \param C The constant to be converted
1409 /// \param Ty The type to which the constant is converted
1410 /// \param OnlyIfReduced see \a getWithOperands() docs.
1411 LLVM_ABI static Constant *getCast(unsigned ops, Constant *C, Type *Ty,
1412 bool OnlyIfReduced = false);
1413
1414 // Create a Trunc or BitCast cast constant expression
1415 LLVM_ABI static Constant *
1416 getTruncOrBitCast(Constant *C, ///< The constant to trunc or bitcast
1417 Type *Ty ///< The type to trunc or bitcast C to
1418 );
1419
1420 /// Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant
1421 /// expression.
1422 LLVM_ABI static Constant *
1423 getPointerCast(Constant *C, ///< The pointer value to be casted (operand 0)
1424 Type *Ty ///< The type to which cast should be made
1425 );
1426
1427 /// Create a BitCast or AddrSpaceCast for a pointer type depending on
1428 /// the address space.
1430 Constant *C, ///< The constant to addrspacecast or bitcast
1431 Type *Ty ///< The type to bitcast or addrspacecast C to
1432 );
1433
1434 /// Return true if this is a convert constant expression
1435 LLVM_ABI bool isCast() const;
1436
1437 /// get - Return a binary or shift operator constant expression,
1438 /// folding if possible.
1439 ///
1440 /// \param OnlyIfReducedTy see \a getWithOperands() docs.
1441 LLVM_ABI static Constant *get(unsigned Opcode, Constant *C1, Constant *C2,
1442 unsigned Flags = 0,
1443 Type *OnlyIfReducedTy = nullptr);
1444
1445 /// Getelementptr form. Value* is only accepted for convenience;
1446 /// all elements must be Constants.
1447 ///
1448 /// \param InRange the inrange range if present or std::nullopt.
1449 /// \param OnlyIfReducedTy see \a getWithOperands() docs.
1450 static Constant *
1453 std::optional<ConstantRange> InRange = std::nullopt,
1454 Type *OnlyIfReducedTy = nullptr) {
1455 return getGetElementPtr(
1456 Ty, C, ArrayRef((Value *const *)IdxList.data(), IdxList.size()), NW,
1457 InRange, OnlyIfReducedTy);
1458 }
1459 static Constant *
1462 std::optional<ConstantRange> InRange = std::nullopt,
1463 Type *OnlyIfReducedTy = nullptr) {
1464 // This form of the function only exists to avoid ambiguous overload
1465 // warnings about whether to convert Idx to ArrayRef<Constant *> or
1466 // ArrayRef<Value *>.
1467 return getGetElementPtr(Ty, C, cast<Value>(Idx), NW, InRange,
1468 OnlyIfReducedTy);
1469 }
1470 LLVM_ABI static Constant *
1471 getGetElementPtr(Type *Ty, Constant *C, ArrayRef<Value *> IdxList,
1473 std::optional<ConstantRange> InRange = std::nullopt,
1474 Type *OnlyIfReducedTy = nullptr);
1475
1476 /// Create a getelementptr i8, ptr, offset constant expression.
1477 static Constant *
1480 std::optional<ConstantRange> InRange = std::nullopt,
1481 Type *OnlyIfReduced = nullptr) {
1482 return getGetElementPtr(Type::getInt8Ty(Ptr->getContext()), Ptr, Offset, NW,
1483 InRange, OnlyIfReduced);
1484 }
1485
1486 /// Create an "inbounds" getelementptr. See the documentation for the
1487 /// "inbounds" flag in LangRef.html for details.
1489 ArrayRef<Constant *> IdxList) {
1490 return getGetElementPtr(Ty, C, IdxList, GEPNoWrapFlags::inBounds());
1491 }
1493 Constant *Idx) {
1494 // This form of the function only exists to avoid ambiguous overload
1495 // warnings about whether to convert Idx to ArrayRef<Constant *> or
1496 // ArrayRef<Value *>.
1497 return getGetElementPtr(Ty, C, Idx, GEPNoWrapFlags::inBounds());
1498 }
1500 ArrayRef<Value *> IdxList) {
1501 return getGetElementPtr(Ty, C, IdxList, GEPNoWrapFlags::inBounds());
1502 }
1503
1504 /// Create a getelementptr inbounds i8, ptr, offset constant expression.
1508
1509 LLVM_ABI static Constant *getExtractElement(Constant *Vec, Constant *Idx,
1510 Type *OnlyIfReducedTy = nullptr);
1511 LLVM_ABI static Constant *getInsertElement(Constant *Vec, Constant *Elt,
1512 Constant *Idx,
1513 Type *OnlyIfReducedTy = nullptr);
1514 LLVM_ABI static Constant *getShuffleVector(Constant *V1, Constant *V2,
1515 ArrayRef<int> Mask,
1516 Type *OnlyIfReducedTy = nullptr);
1517
1518 /// Return the opcode at the root of this constant expression
1519 unsigned getOpcode() const { return getSubclassDataFromValue(); }
1520
1521 /// Assert that this is a shufflevector and return the mask. See class
1522 /// ShuffleVectorInst for a description of the mask representation.
1523 LLVM_ABI ArrayRef<int> getShuffleMask() const;
1524
1525 /// Assert that this is a shufflevector and return the mask.
1526 ///
1527 /// TODO: This is a temporary hack until we update the bitcode format for
1528 /// shufflevector.
1529 LLVM_ABI Constant *getShuffleMaskForBitcode() const;
1530
1531 /// Return a string representation for an opcode.
1532 LLVM_ABI const char *getOpcodeName() const;
1533
1534 /// This returns the current constant expression with the operands replaced
1535 /// with the specified values. The specified array must have the same number
1536 /// of operands as our current one.
1540
1541 /// Get the current expression with the operands replaced.
1542 ///
1543 /// Return the current constant expression with the operands replaced with \c
1544 /// Ops and the type with \c Ty. The new operands must have the same number
1545 /// as the current ones.
1546 ///
1547 /// If \c OnlyIfReduced is \c true, nullptr will be returned unless something
1548 /// gets constant-folded, the type changes, or the expression is otherwise
1549 /// canonicalized. This parameter should almost always be \c false.
1550 LLVM_ABI Constant *getWithOperands(ArrayRef<Constant *> Ops, Type *Ty,
1551 bool OnlyIfReduced = false,
1552 Type *SrcTy = nullptr) const;
1553
1554 /// Returns an Instruction which implements the same operation as this
1555 /// ConstantExpr. It is not inserted into any basic block.
1556 ///
1557 /// A better approach to this could be to have a constructor for Instruction
1558 /// which would take a ConstantExpr parameter, but that would have spread
1559 /// implementation details of ConstantExpr outside of Constants.cpp, which
1560 /// would make it harder to remove ConstantExprs altogether.
1561 LLVM_ABI Instruction *getAsInstruction() const;
1562
1563 /// Whether creating a constant expression for this binary operator is
1564 /// desirable.
1565 LLVM_ABI static bool isDesirableBinOp(unsigned Opcode);
1566
1567 /// Whether creating a constant expression for this binary operator is
1568 /// supported.
1569 LLVM_ABI static bool isSupportedBinOp(unsigned Opcode);
1570
1571 /// Whether creating a constant expression for this cast is desirable.
1572 LLVM_ABI static bool isDesirableCastOp(unsigned Opcode);
1573
1574 /// Whether creating a constant expression for this cast is supported.
1575 LLVM_ABI static bool isSupportedCastOp(unsigned Opcode);
1576
1577 /// Whether creating a constant expression for this getelementptr type is
1578 /// supported.
1579 static bool isSupportedGetElementPtr(const Type *SrcElemTy) {
1580 return !SrcElemTy->isScalableTy();
1581 }
1582
1583 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1584 static bool classof(const Value *V) {
1585 return V->getValueID() == ConstantExprVal;
1586 }
1587
1588private:
1589 // Shadow Value::setValueSubclassData with a private forwarding method so that
1590 // subclasses cannot accidentally use it.
1591 void setValueSubclassData(unsigned short D) {
1593 }
1594};
1595
1596template <>
1598 : public VariadicOperandTraits<ConstantExpr> {};
1599
1601
1602//===----------------------------------------------------------------------===//
1603/// 'undef' values are things that do not have specified contents.
1604/// These are used for a variety of purposes, including global variable
1605/// initializers and operands to instructions. 'undef' values can occur with
1606/// any first-class type.
1607///
1608/// Undef values aren't exactly constants; if they have multiple uses, they
1609/// can appear to have different bit patterns at each use. See
1610/// LangRef.html#undefvalues for details.
1611///
1612class UndefValue : public ConstantData {
1613 friend class Constant;
1614
1615 explicit UndefValue(Type *T) : ConstantData(T, UndefValueVal) {}
1616
1617 void destroyConstantImpl();
1618
1619protected:
1620 explicit UndefValue(Type *T, ValueTy vty) : ConstantData(T, vty) {}
1621
1622public:
1623 UndefValue(const UndefValue &) = delete;
1624
1625 /// Static factory methods - Return an 'undef' object of the specified type.
1626 LLVM_ABI static UndefValue *get(Type *T);
1627
1628 /// If this Undef has array or vector type, return a undef with the right
1629 /// element type.
1630 LLVM_ABI UndefValue *getSequentialElement() const;
1631
1632 /// If this undef has struct type, return a undef with the right element type
1633 /// for the specified element.
1634 LLVM_ABI UndefValue *getStructElement(unsigned Elt) const;
1635
1636 /// Return an undef of the right value for the specified GEP index if we can,
1637 /// otherwise return null (e.g. if C is a ConstantExpr).
1638 LLVM_ABI UndefValue *getElementValue(Constant *C) const;
1639
1640 /// Return an undef of the right value for the specified GEP index.
1641 LLVM_ABI UndefValue *getElementValue(unsigned Idx) const;
1642
1643 /// Return the number of elements in the array, vector, or struct.
1644 LLVM_ABI unsigned getNumElements() const;
1645
1646 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1647 static bool classof(const Value *V) {
1648 return V->getValueID() == UndefValueVal ||
1649 V->getValueID() == PoisonValueVal;
1650 }
1651};
1652
1653//===----------------------------------------------------------------------===//
1654/// In order to facilitate speculative execution, many instructions do not
1655/// invoke immediate undefined behavior when provided with illegal operands,
1656/// and return a poison value instead.
1657///
1658/// see LangRef.html#poisonvalues for details.
1659///
1660class PoisonValue final : public UndefValue {
1661 friend class Constant;
1662
1663 explicit PoisonValue(Type *T) : UndefValue(T, PoisonValueVal) {}
1664
1665 void destroyConstantImpl();
1666
1667public:
1668 PoisonValue(const PoisonValue &) = delete;
1669
1670 /// Static factory methods - Return an 'poison' object of the specified type.
1671 LLVM_ABI static PoisonValue *get(Type *T);
1672
1673 /// If this poison has array or vector type, return a poison with the right
1674 /// element type.
1675 LLVM_ABI PoisonValue *getSequentialElement() const;
1676
1677 /// If this poison has struct type, return a poison with the right element
1678 /// type for the specified element.
1679 LLVM_ABI PoisonValue *getStructElement(unsigned Elt) const;
1680
1681 /// Return an poison of the right value for the specified GEP index if we can,
1682 /// otherwise return null (e.g. if C is a ConstantExpr).
1683 LLVM_ABI PoisonValue *getElementValue(Constant *C) const;
1684
1685 /// Return an poison of the right value for the specified GEP index.
1686 LLVM_ABI PoisonValue *getElementValue(unsigned Idx) const;
1687
1688 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1689 static bool classof(const Value *V) {
1690 return V->getValueID() == PoisonValueVal;
1691 }
1692};
1693
1694} // end namespace llvm
1695
1696#endif // LLVM_IR_CONSTANTS_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_ABI
Definition Compiler.h:213
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
static bool isSigned(unsigned Opcode)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
#define T
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS)
Macro for generating out-of-class operand accessor definitions.
static unsigned getNumElements(Type *Ty)
This file contains some templates that are useful if you are working with the STL at all.
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
xray Insert XRay ops
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5899
Class for arbitrary precision integers.
Definition APInt.h:78
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
const T * data() const
Definition ArrayRef.h:138
Class to represent array types.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
The address of a basic block.
Definition Constants.h:1071
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
friend class Constant
Definition Constants.h:1072
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1110
Function * getFunction() const
Definition Constants.h:1107
BasicBlock * getBasicBlock() const
Definition Constants.h:1106
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Class to represent byte types.
LLVM_ABI ElementCount getElementCount() const
Return the number of elements in the array, vector, or struct.
ConstantAggregateZero(const ConstantAggregateZero &)=delete
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:538
LLVM_ABI Constant * getSequentialElement() const
If this CAZ has array or vector type, return a zero with the right element type.
LLVM_ABI Constant * getElementValue(Constant *C) const
Return a zero of the right value for the specified GEP index if we can, otherwise return null (e....
LLVM_ABI Constant * getStructElement(unsigned Elt) const
If this CAZ has struct type, return a zero with the right element type for the specified element.
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
Base class for aggregate constants (with operands).
Definition Constants.h:554
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant)
Transparently provide more efficient getOperand methods.
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:564
LLVM_ABI ConstantAggregate(Type *T, ValueTy VT, ArrayRef< Constant * > V, AllocInfo AllocInfo)
friend class Constant
Definition Constants.h:581
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:603
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition Constants.h:598
Class for constant bytes.
Definition Constants.h:281
static bool classof(const Value *V)
Methods to support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:412
bool isNegative() const
Definition Constants.h:368
friend class ConstantVector
Definition Constants.h:283
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:385
int64_t getSExtValue() const
Return the constant as a 64-bit byte value after it has been sign extended as appropriate for the typ...
Definition Constants.h:360
ConstantByte(const ConstantByte &)=delete
friend class Constant
Definition Constants.h:282
uint64_t getZExtValue() const
Return the constant as a 64-bit byte value after it has been zero extended as appropriate for the typ...
Definition Constants.h:354
ByteType * getByteType() const
Variant of the getType() method to always return a ByteType, which reduces the amount of casting need...
Definition Constants.h:364
static ConstantByte * getSigned(ByteType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantByte with the specified value for the specified type.
Definition Constants.h:322
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:373
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition Constants.h:379
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:345
static Constant * getSigned(Type *Ty, int64_t V, bool ImplicitTrunc=false)
Definition Constants.h:326
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:348
bool isMinValue(bool IsSigned) const
This function will return true iff this constant represents the smallest value that may be represente...
Definition Constants.h:404
bool isMaxValue(bool IsSigned) const
This function will return true iff this constant represents the largest value that may be represented...
Definition Constants.h:392
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:927
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
Definition Constants.h:865
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of array type with a float element type taken from argument ...
friend class ConstantDataSequential
Definition Constants.h:853
static Constant * get(LLVMContext &Context, ArrayTy &Elts)
get() constructor - ArrayTy needs to be compatible with ArrayRef<ElementTy>.
Definition Constants.h:874
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
ConstantDataArray(const ConstantDataArray &)=delete
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with array type with an element count and element type match...
Definition Constants.h:884
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition Constants.h:922
static LLVM_ABI Constant * getByte(Type *ElementType, ArrayRef< uint8_t > Elts)
getByte() constructors - Return a constant of array type with a byte element type taken from argument...
LLVM_ABI APFloat getElementAsAPFloat(uint64_t i) const
If this is a sequential container of floating point type, return the specified element as an APFloat.
LLVM_ABI uint64_t getElementAsInteger(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
Definition Constants.h:818
LLVM_ABI Constant * getElementAsConstant(uint64_t i) const
Return a Constant for a specified index's element.
LLVM_ABI uint64_t getElementByteSize() const
Return the size (in bytes) of each element in the array/vector.
ConstantDataSequential(const ConstantDataSequential &)=delete
LLVM_ABI float getElementAsFloat(uint64_t i) const
If this is an sequential container of floats, return the specified element as a float.
LLVM_ABI bool isString(unsigned CharSize=8) const
This method returns true if this is an array of CharSize integers or bytes.
LLVM_ABI uint64_t getNumElements() const
Return the number of elements in the array or vector.
StringRef getAsCString() const
If this array is isCString(), then this method returns the array (without the trailing null byte) as ...
Definition Constants.h:825
LLVM_ABI APInt getElementAsAPInt(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element as an APInt...
static LLVM_ABI Constant * getImpl(StringRef Bytes, Type *Ty)
This is the underlying implementation of all of the ConstantDataSequential::get methods.
LLVM_ABI double getElementAsDouble(uint64_t i) const
If this is an sequential container of doubles, return the specified element as a double.
LLVM_ABI Type * getElementType() const
Return the element type of the array/vector.
LLVM_ABI bool isCString() const
This method returns true if the array "isString", ends with a null byte, and does not contains any ot...
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:837
LLVM_ABI StringRef getRawDataValues() const
Return the raw, underlying, bytes of this data.
static LLVM_ABI bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
ConstantDataSequential(Type *ty, ValueTy VT, const char *Data)
Definition Constants.h:759
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with vector type with an element count and element type matc...
Definition Constants.h:968
LLVM_ABI Constant * getSplatValue() const
If this is a splat constant, meaning that all of the elements have the same value,...
static LLVM_ABI Constant * getSplat(unsigned NumElts, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1014
LLVM_ABI bool isSplat() const
Returns true if this is a splat constant, meaning that all elements have the same value.
friend class ConstantDataSequential
Definition Constants.h:939
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
Definition Constants.h:1009
ConstantDataVector(const ConstantDataVector &)=delete
static LLVM_ABI Constant * get(LLVMContext &Context, ArrayRef< uint8_t > Elts)
get() constructors - Return a constant with vector type with an element count and element type matchi...
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of vector type with a float element type taken from argument...
static LLVM_ABI Constant * getByte(Type *ElementType, ArrayRef< uint8_t > Elts)
getByte() constructors - Return a constant of vector type with a byte element type taken from argumen...
static bool classof(const Value *V)
Methods to support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:76
friend class Constant
Definition Constants.h:59
ConstantData(const ConstantData &)=delete
ConstantData(Type *Ty, ValueTy VT)
Definition Constants.h:66
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1297
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
Definition Constants.h:1305
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1584
static LLVM_ABI Constant * getAlignOf(Type *Ty)
getAlignOf constant expr - computes the alignment of a type in a target independent way (Note: the re...
static Constant * getNUWSub(Constant *C1, Constant *C2)
Definition Constants.h:1363
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList)
Create an "inbounds" getelementptr.
Definition Constants.h:1488
friend struct ConstantExprKeyType
Definition Constants.h:1298
static LLVM_ABI Constant * getPointerCast(Constant *C, Type *Ty)
Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant expression.
static LLVM_ABI Constant * getTruncOrBitCast(Constant *C, Type *Ty)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
LLVM_ABI bool isCast() const
Return true if this is a convert constant expression.
static Constant * getNSWAdd(Constant *C1, Constant *C2)
Definition Constants.h:1351
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant)
Transparently provide more efficient getOperand methods.
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
friend class Constant
Definition Constants.h:1299
static Constant * getPtrAdd(Constant *Ptr, Constant *Offset, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReduced=nullptr)
Create a getelementptr i8, ptr, offset constant expression.
Definition Constants.h:1478
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getInBoundsPtrAdd(Constant *Ptr, Constant *Offset)
Create a getelementptr inbounds i8, ptr, offset constant expression.
Definition Constants.h:1505
static LLVM_ABI Constant * getPtrToAddr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getSizeOf(Type *Ty)
getSizeOf constant expr - computes the (alloc) size of a type (in address-units, not bits) in a targe...
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
Definition Constants.h:1579
static Constant * getGetElementPtr(Type *Ty, Constant *C, Constant *Idx, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Definition Constants.h:1460
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Value * > IdxList)
Definition Constants.h:1499
static Constant * getNSWNeg(Constant *C)
Definition Constants.h:1349
static Constant * getNSWSub(Constant *C1, Constant *C2)
Definition Constants.h:1359
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, Constant *Idx)
Definition Constants.h:1492
static Constant * getNUWAdd(Constant *C1, Constant *C2)
Definition Constants.h:1355
static LLVM_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
~ConstantExpr()=default
unsigned getOpcode() const
Return the opcode at the root of this constant expression.
Definition Constants.h:1519
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
Definition Constants.h:1451
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Constant * getWithOperands(ArrayRef< Constant * > Ops) const
This returns the current constant expression with the operands replaced with the specified values.
Definition Constants.h:1537
ConstantFP(const ConstantFP &)=delete
const APFloat & getValue() const
Definition Constants.h:464
friend class ConstantVector
Definition Constants.h:422
static LLVM_ABI Constant * getSNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
const APFloat & getValueAPF() const
Definition Constants.h:463
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:497
bool isInfinity() const
Return true if the value is infinity.
Definition Constants.h:476
friend class Constant
Definition Constants.h:421
bool isNegative() const
Return true if the sign bit is set.
Definition Constants.h:473
bool isExactlyValue(double V) const
Definition Constants.h:489
static LLVM_ABI Constant * getInfinity(Type *Ty, bool Negative=false)
static LLVM_ABI Constant * getZero(Type *Ty, bool Negative=false)
static Constant * getNegativeZero(Type *Ty)
Definition Constants.h:458
static LLVM_ABI Constant * getNaN(Type *Ty, bool Negative=false, uint64_t Payload=0)
bool isNaN() const
Return true if the value is a NaN.
Definition Constants.h:479
LLVM_ABI bool isExactlyValue(const APFloat &V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
bool isPosZero() const
Return true if the value is positive zero.
Definition Constants.h:470
static LLVM_ABI bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
static LLVM_ABI Constant * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
bool isZero() const
Return true if the value is positive or negative zero.
Definition Constants.h:467
This is the shared class of boolean and integer constants.
Definition Constants.h:87
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:231
friend class ConstantVector
Definition Constants.h:89
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition Constants.h:225
bool isNegative() const
Definition Constants.h:214
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition Constants.h:269
IntegerType * getIntegerType() const
Variant of the getType() method to always return an IntegerType, which reduces the amount of casting ...
Definition Constants.h:198
static LLVM_ABI bool isValueValidForType(Type *Ty, uint64_t V)
This static method returns true if the type Ty is big enough to represent the value V.
friend class Constant
Definition Constants.h:88
static bool classof(const Value *V)
Methods to support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:274
static Constant * getSigned(Type *Ty, int64_t V, bool ImplicitTrunc=false)
Definition Constants.h:139
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
ConstantInt(const ConstantInt &)=delete
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:135
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
MaybeAlign getMaybeAlignValue() const
Return the constant as an llvm::MaybeAlign.
Definition Constants.h:179
bool isMinValue(bool IsSigned) const
This function will return true iff this constant represents the smallest value that may be represente...
Definition Constants.h:250
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
int64_t getSExtValue() const
Return the constant as a 64-bit integer value after it has been sign extended as appropriate for the ...
Definition Constants.h:174
bool isMaxValue(bool IsSigned) const
This function will return true iff this constant represents the largest value that may be represented...
Definition Constants.h:238
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
Align getAlignValue() const
Return the constant as an llvm::Align, interpreting 0 as Align(1).
Definition Constants.h:186
bool equalsInt(uint64_t V) const
A helper method that can be used to determine if the constant contained within is equal to a constant...
Definition Constants.h:194
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
bool uge(uint64_t Num) const
This function will return true iff this constant represents a value with active bits bigger than 64 b...
Definition Constants.h:262
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:728
PointerType * getPointerType() const
Return the scalar pointer type for this null value.
Definition Constants.h:723
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
ConstantPointerNull(const ConstantPointerNull &)=delete
A signed pointer, in the ptrauth sense.
Definition Constants.h:1204
Constant * getAddrDiscriminator() const
The address discriminator if any, or the null constant.
Definition Constants.h:1245
friend struct ConstantPtrAuthKeyType
Definition Constants.h:1205
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant)
Transparently provide more efficient getOperand methods.
Constant * getPointer() const
The pointer that is signed in this ptrauth signed pointer.
Definition Constants.h:1232
friend class Constant
Definition Constants.h:1206
ConstantInt * getKey() const
The Key ID, an i32 constant.
Definition Constants.h:1235
Constant * getDeactivationSymbol() const
Definition Constants.h:1254
bool hasAddressDiscriminator() const
Whether there is any non-null address discriminator.
Definition Constants.h:1250
ConstantInt * getDiscriminator() const
The integer discriminator, an i64 constant, or 0.
Definition Constants.h:1238
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1279
static Constant * getAnon(LLVMContext &Ctx, ArrayRef< Constant * > V, bool Packed=false)
Definition Constants.h:635
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:655
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
friend class Constant
Definition Constants.h:613
static LLVM_ABI StructType * getTypeForElements(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct type to use for a constant with the specified set of elements.
static std::enable_if_t< are_base_of< Constant, Csts... >::value, Constant * > get(StructType *T, Csts *...Vs)
Definition Constants.h:626
StructType * getType() const
Specialization - reduce amount of casting.
Definition Constants.h:650
static Constant * getAnon(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct that has the specified elements.
Definition Constants.h:632
static LLVM_ABI ConstantTargetNone * get(TargetExtType *T)
Static factory methods - Return objects of the specified value.
TargetExtType * getType() const
Specialize the getType() method to always return an TargetExtType, which reduces the amount of castin...
Definition Constants.h:1059
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:1064
ConstantTargetNone(const ConstantTargetNone &)=delete
ConstantTokenNone(const ConstantTokenNone &)=delete
static LLVM_ABI ConstantTokenNone * get(LLVMContext &Context)
Return the ConstantTokenNone.
static bool classof(const Value *V)
Methods to support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:1037
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:696
friend class Constant
Definition Constants.h:665
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
Definition Constants.h:686
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:43
Constant(Type *ty, ValueTy vty, AllocInfo AllocInfo)
Definition Constant.h:45
Wrapper for a function that represents a value that functionally represents the original function.
Definition Constants.h:1124
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1150
GlobalValue * getGlobalValue() const
Definition Constants.h:1145
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
Class to represent fixed width SIMD vectors.
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags none()
Class to represent integer types.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Wrapper for a value that won't be replaced with a CFI jump table pointer in LowerTypeTestsModule.
Definition Constants.h:1163
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1192
friend class Constant
Definition Constants.h:1164
PointerType * getType() const
NoCFIValue is always a pointer.
Definition Constants.h:1187
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
GlobalValue * getGlobalValue() const
Definition Constants.h:1182
Class to represent pointers.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
PoisonValue(const PoisonValue &)=delete
friend class Constant
Definition Constants.h:1661
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1689
LLVM_ABI PoisonValue * getStructElement(unsigned Elt) const
If this poison has struct type, return a poison with the right element type for the specified element...
LLVM_ABI PoisonValue * getSequentialElement() const
If this poison has array or vector type, return a poison with the right element type.
LLVM_ABI PoisonValue * getElementValue(Constant *C) const
Return an poison of the right value for the specified GEP index if we can, otherwise return null (e....
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Class to represent struct types.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
Definition Type.cpp:65
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:311
static Type * getScalarTy(LLVMContext &C)
Definition Type.h:491
LLVM_ABI UndefValue * getElementValue(Constant *C) const
Return an undef of the right value for the specified GEP index if we can, otherwise return null (e....
LLVM_ABI UndefValue * getStructElement(unsigned Elt) const
If this undef has struct type, return a undef with the right element type for the specified element.
UndefValue(const UndefValue &)=delete
friend class Constant
Definition Constants.h:1613
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1647
UndefValue(Type *T, ValueTy vty)
Definition Constants.h:1620
LLVM_ABI UndefValue * getSequentialElement() const
If this Undef has array or vector type, return a undef with the right element type.
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
unsigned short getSubclassDataFromValue() const
Definition Value.h:867
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
void setValueSubclassData(unsigned short D)
Definition Value.h:868
ValueTy
Concrete subclass of this.
Definition Value.h:524
Base class of all SIMD vector types.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:557
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:221
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
std::conjunction< std::is_base_of< T, Ts >... > are_base_of
traits class for checking whether type T is a base class for all the given types in the variadic list...
Definition STLExtras.h:114
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
FixedNumOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
Compile-time customization of User operands.
Definition User.h:42
Information about how a User object was allocated, to be passed into the User constructor.
Definition User.h:79
Indicates this User has operands co-allocated.
Definition User.h:60
VariadicOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...