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 sign bit is set.
470 bool isNegative() const { return Val.isNegative(); }
471
472 /// Return true if the value is infinity
473 bool isInfinity() const { return Val.isInfinity(); }
474
475 /// Return true if the value is a NaN.
476 bool isNaN() const { return Val.isNaN(); }
477
478 /// We don't rely on operator== working on double values, as it returns true
479 /// for things that are clearly not equal, like -0.0 and 0.0.
480 /// As such, this method can be used to do an exact bit-for-bit comparison of
481 /// two floating point values. The version with a double operand is retained
482 /// because it's so convenient to write isExactlyValue(2.0), but please use
483 /// it only for simple constants.
484 LLVM_ABI bool isExactlyValue(const APFloat &V) const;
485
486 bool isExactlyValue(double V) const {
487 bool ignored;
488 APFloat FV(V);
489 FV.convert(Val.getSemantics(), APFloat::rmNearestTiesToEven, &ignored);
490 return isExactlyValue(FV);
491 }
492
493 /// Methods for support type inquiry through isa, cast, and dyn_cast:
494 static bool classof(const Value *V) {
495 return V->getValueID() == ConstantFPVal;
496 }
497};
498
499//===----------------------------------------------------------------------===//
500/// All zero aggregate value
501///
502class ConstantAggregateZero final : public ConstantData {
503 friend class Constant;
504
505 explicit ConstantAggregateZero(Type *Ty)
506 : ConstantData(Ty, ConstantAggregateZeroVal) {}
507
508 void destroyConstantImpl();
509
510public:
511 ConstantAggregateZero(const ConstantAggregateZero &) = delete;
512
513 LLVM_ABI static ConstantAggregateZero *get(Type *Ty);
514
515 /// If this CAZ has array or vector type, return a zero with the right element
516 /// type.
518
519 /// If this CAZ has struct type, return a zero with the right element type for
520 /// the specified element.
521 LLVM_ABI Constant *getStructElement(unsigned Elt) const;
522
523 /// Return a zero of the right value for the specified GEP index if we can,
524 /// otherwise return null (e.g. if C is a ConstantExpr).
526
527 /// Return a zero of the right value for the specified GEP index.
528 LLVM_ABI Constant *getElementValue(unsigned Idx) const;
529
530 /// Return the number of elements in the array, vector, or struct.
532
533 /// Methods for support type inquiry through isa, cast, and dyn_cast:
534 ///
535 static bool classof(const Value *V) {
536 return V->getValueID() == ConstantAggregateZeroVal;
537 }
538};
539
540/// Base class for aggregate constants (with operands).
541///
542/// These constants are aggregates of other constants, which are stored as
543/// operands.
544///
545/// Subclasses are \a ConstantStruct, \a ConstantArray, and \a
546/// ConstantVector.
547///
548/// \note Some subclasses of \a ConstantData are semantically aggregates --
549/// such as \a ConstantDataArray -- but are not subclasses of this because they
550/// use operands.
552protected:
555
556public:
557 /// Transparently provide more efficient getOperand methods.
559
560 /// Methods for support type inquiry through isa, cast, and dyn_cast:
561 static bool classof(const Value *V) {
562 return V->getValueID() >= ConstantAggregateFirstVal &&
563 V->getValueID() <= ConstantAggregateLastVal;
564 }
565};
566
567template <>
569 : public VariadicOperandTraits<ConstantAggregate> {};
570
572
573//===----------------------------------------------------------------------===//
574/// ConstantArray - Constant Array Declarations
575///
576class ConstantArray final : public ConstantAggregate {
577 friend struct ConstantAggrKeyType<ConstantArray>;
578 friend class Constant;
579
580 ConstantArray(ArrayType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
581
582 void destroyConstantImpl();
583 Value *handleOperandChangeImpl(Value *From, Value *To);
584
585public:
586 // ConstantArray accessors
588
589private:
590 static Constant *getImpl(ArrayType *T, ArrayRef<Constant *> V);
591
592public:
593 /// Specialize the getType() method to always return an ArrayType,
594 /// which reduces the amount of casting needed in parts of the compiler.
595 inline ArrayType *getType() const {
597 }
598
599 /// Methods for support type inquiry through isa, cast, and dyn_cast:
600 static bool classof(const Value *V) {
601 return V->getValueID() == ConstantArrayVal;
602 }
603};
604
605//===----------------------------------------------------------------------===//
606// Constant Struct Declarations
607//
608class ConstantStruct final : public ConstantAggregate {
609 friend struct ConstantAggrKeyType<ConstantStruct>;
610 friend class Constant;
611
612 ConstantStruct(StructType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
613
614 void destroyConstantImpl();
615 Value *handleOperandChangeImpl(Value *From, Value *To);
616
617public:
618 // ConstantStruct accessors
620
621 template <typename... Csts>
622 static std::enable_if_t<are_base_of<Constant, Csts...>::value, Constant *>
623 get(StructType *T, Csts *...Vs) {
624 return get(T, ArrayRef<Constant *>({Vs...}));
625 }
626
627 /// Return an anonymous struct that has the specified elements.
628 /// If the struct is possibly empty, then you must specify a context.
629 static Constant *getAnon(ArrayRef<Constant *> V, bool Packed = false) {
630 return get(getTypeForElements(V, Packed), V);
631 }
633 bool Packed = false) {
634 return get(getTypeForElements(Ctx, V, Packed), V);
635 }
636
637 /// Return an anonymous struct type to use for a constant with the specified
638 /// set of elements. The list must not be empty.
640 bool Packed = false);
641 /// This version of the method allows an empty list.
644 bool Packed = false);
645
646 /// Specialization - reduce amount of casting.
647 inline StructType *getType() const {
649 }
650
651 /// Methods for support type inquiry through isa, cast, and dyn_cast:
652 static bool classof(const Value *V) {
653 return V->getValueID() == ConstantStructVal;
654 }
655};
656
657//===----------------------------------------------------------------------===//
658/// Constant Vector Declarations
659///
660class ConstantVector final : public ConstantAggregate {
661 friend struct ConstantAggrKeyType<ConstantVector>;
662 friend class Constant;
663
664 ConstantVector(VectorType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
665
666 void destroyConstantImpl();
667 Value *handleOperandChangeImpl(Value *From, Value *To);
668
669public:
670 // ConstantVector accessors
672
673private:
674 static Constant *getImpl(ArrayRef<Constant *> V);
675
676public:
677 /// Return a ConstantVector with the specified constant in each element.
678 /// Note that this might not return an instance of ConstantVector
680
681 /// Specialize the getType() method to always return a FixedVectorType,
682 /// which reduces the amount of casting needed in parts of the compiler.
683 inline FixedVectorType *getType() const {
685 }
686
687 /// If all elements of the vector constant have the same value, return that
688 /// value. Otherwise, return nullptr. Ignore poison elements by setting
689 /// AllowPoison to true.
690 LLVM_ABI Constant *getSplatValue(bool AllowPoison = false) const;
691
692 /// Methods for support type inquiry through isa, cast, and dyn_cast:
693 static bool classof(const Value *V) {
694 return V->getValueID() == ConstantVectorVal;
695 }
696};
697
698//===----------------------------------------------------------------------===//
699/// A constant pointer value that points to null
700///
701class ConstantPointerNull final : public ConstantData {
702 friend class Constant;
703
704 explicit ConstantPointerNull(PointerType *T)
705 : ConstantData(T, Value::ConstantPointerNullVal) {}
706
707 void destroyConstantImpl();
708
709public:
710 ConstantPointerNull(const ConstantPointerNull &) = delete;
711
712 /// Static factory methods - Return objects of the specified value
713 LLVM_ABI static ConstantPointerNull *get(PointerType *T);
714
715 /// Specialize the getType() method to always return an PointerType,
716 /// which reduces the amount of casting needed in parts of the compiler.
717 inline PointerType *getType() const {
719 }
720
721 /// Methods for support type inquiry through isa, cast, and dyn_cast:
722 static bool classof(const Value *V) {
723 return V->getValueID() == ConstantPointerNullVal;
724 }
725};
726
727//===----------------------------------------------------------------------===//
728/// ConstantDataSequential - A vector or array constant whose element type is a
729/// simple 1/2/4/8-byte integer/byte or half/bfloat/float/double, and whose
730/// elements are just simple data values (i.e. ConstantInt/ConstantByte/
731/// ConstantFP). This Constant node has no operands because it stores all of
732/// the elements of the constant as densely packed data, instead of as Value*'s.
733///
734/// This is the common base class of ConstantDataArray and ConstantDataVector.
735///
737 friend class LLVMContextImpl;
738 friend class Constant;
739
740 /// A pointer to the bytes underlying this constant (which is owned by the
741 /// uniquing StringMap).
742 const char *DataElements;
743
744 /// This forms a link list of ConstantDataSequential nodes that have
745 /// the same value but different type. For example, 0,0,0,1 could be a 4
746 /// element array of i8, or a 1-element array of i32. They'll both end up in
747 /// the same StringMap bucket, linked up.
748 std::unique_ptr<ConstantDataSequential> Next;
749
750 void destroyConstantImpl();
751
752protected:
753 explicit ConstantDataSequential(Type *ty, ValueTy VT, const char *Data)
754 : ConstantData(ty, VT), DataElements(Data) {}
755
756 LLVM_ABI static Constant *getImpl(StringRef Bytes, Type *Ty);
757
758public:
760
761 /// Return true if a ConstantDataSequential can be formed with a vector or
762 /// array of the specified element type.
763 /// ConstantDataArray only works with normal float and int types that are
764 /// stored densely in memory, not with things like i42 or x86_f80.
765 LLVM_ABI static bool isElementTypeCompatible(Type *Ty);
766
767 /// If this is a sequential container of integers (of any size), return the
768 /// specified element in the low bits of a uint64_t.
770
771 /// If this is a sequential container of integers (of any size), return the
772 /// specified element as an APInt.
774
775 /// If this is a sequential container of floating point type, return the
776 /// specified element as an APFloat.
778
779 /// If this is an sequential container of floats, return the specified element
780 /// as a float.
781 LLVM_ABI float getElementAsFloat(uint64_t i) const;
782
783 /// If this is an sequential container of doubles, return the specified
784 /// element as a double.
785 LLVM_ABI double getElementAsDouble(uint64_t i) const;
786
787 /// Return a Constant for a specified index's element.
788 /// Note that this has to compute a new constant to return, so it isn't as
789 /// efficient as getElementAsInteger/Float/Double.
791
792 /// Return the element type of the array/vector.
794
795 /// Return the number of elements in the array or vector.
797
798 /// Return the size (in bytes) of each element in the array/vector.
799 /// The size of the elements is known to be a multiple of one byte.
801
802 /// This method returns true if this is an array of \p CharSize integers or
803 /// bytes.
804 LLVM_ABI bool isString(unsigned CharSize = 8) const;
805
806 /// This method returns true if the array "isString", ends with a null byte,
807 /// and does not contains any other null bytes.
808 LLVM_ABI bool isCString() const;
809
810 /// If this array is isString(), then this method returns the array as a
811 /// StringRef. Otherwise, it asserts out.
813 assert(isString() && "Not a string");
814 return getRawDataValues();
815 }
816
817 /// If this array is isCString(), then this method returns the array (without
818 /// the trailing null byte) as a StringRef. Otherwise, it asserts out.
820 assert(isCString() && "Isn't a C string");
821 StringRef Str = getAsString();
822 return Str.drop_back();
823 }
824
825 /// Return the raw, underlying, bytes of this data. Note that this is an
826 /// extremely tricky thing to work with, as it exposes the host endianness of
827 /// the data elements.
829
830 /// Methods for support type inquiry through isa, cast, and dyn_cast:
831 static bool classof(const Value *V) {
832 return V->getValueID() == ConstantDataArrayVal ||
833 V->getValueID() == ConstantDataVectorVal;
834 }
835
836private:
837 const char *getElementPointer(uint64_t Elt) const;
838};
839
840//===----------------------------------------------------------------------===//
841/// An array constant whose element type is a simple 1/2/4/8-byte integer, bytes
842/// or float/double, and whose elements are just simple data values
843/// (i.e. ConstantInt/ConstantFP). This Constant node has no operands because it
844/// stores all of the elements of the constant as densely packed data, instead
845/// of as Value*'s.
846class ConstantDataArray final : public ConstantDataSequential {
848
849 explicit ConstantDataArray(Type *ty, const char *Data)
850 : ConstantDataSequential(ty, ConstantDataArrayVal, Data) {}
851
852public:
853 ConstantDataArray(const ConstantDataArray &) = delete;
854
855 /// get() constructor - Return a constant with array type with an element
856 /// count and element type matching the ArrayRef passed in. Note that this
857 /// can return a ConstantAggregateZero object.
858 template <typename ElementTy>
859 static Constant *get(LLVMContext &Context, ArrayRef<ElementTy> Elts) {
860 const char *Data = reinterpret_cast<const char *>(Elts.data());
861 return getRaw(StringRef(Data, Elts.size() * sizeof(ElementTy)), Elts.size(),
863 }
864
865 /// get() constructor - ArrayTy needs to be compatible with
866 /// ArrayRef<ElementTy>. Calls get(LLVMContext, ArrayRef<ElementTy>).
867 template <typename ArrayTy>
868 static Constant *get(LLVMContext &Context, ArrayTy &Elts) {
869 return ConstantDataArray::get(Context, ArrayRef(Elts));
870 }
871
872 /// getRaw() constructor - Return a constant with array type with an element
873 /// count and element type matching the NumElements and ElementTy parameters
874 /// passed in. Note that this can return a ConstantAggregateZero object.
875 /// ElementTy must be one of i8/i16/i32/i64/b8/b16/b32/b64/half/bfloat/float/
876 /// double. Data is the buffer containing the elements. Be careful to make
877 /// sure Data uses the right endianness, the buffer will be used as-is.
878 static Constant *getRaw(StringRef Data, uint64_t NumElements,
879 Type *ElementTy) {
880 Type *Ty = ArrayType::get(ElementTy, NumElements);
881 return getImpl(Data, Ty);
882 }
883
884 /// getFP() constructors - Return a constant of array type with a float
885 /// element type taken from argument `ElementType', and count taken from
886 /// argument `Elts'. The amount of bits of the contained type must match the
887 /// number of bits of the type contained in the passed in ArrayRef.
888 /// (i.e. half or bfloat for 16bits, float for 32bits, double for 64bits) Note
889 /// that this can return a ConstantAggregateZero object.
890 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint16_t> Elts);
891 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint32_t> Elts);
892 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint64_t> Elts);
893
894 /// getByte() constructors - Return a constant of array type with a byte
895 /// element type taken from argument `ElementType', and count taken from
896 /// argument `Elts'. The amount of bits of the contained type must match the
897 /// number of bits of the type contained in the passed in ArrayRef.
898 /// Note that this can return a ConstantAggregateZero object.
899 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint8_t> Elts);
900 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint16_t> Elts);
901 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint32_t> Elts);
902 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint64_t> Elts);
903
904 /// This method constructs a CDS and initializes it with a text string.
905 /// The default behavior (AddNull==true) causes a null terminator to
906 /// be placed at the end of the array (increasing the length of the string by
907 /// one more than the StringRef would normally indicate. Pass AddNull=false
908 /// to disable this behavior.
909 LLVM_ABI static Constant *getString(LLVMContext &Context,
910 StringRef Initializer,
911 bool AddNull = true,
912 bool ByteString = false);
913
914 /// Specialize the getType() method to always return an ArrayType,
915 /// which reduces the amount of casting needed in parts of the compiler.
916 inline ArrayType *getType() const {
918 }
919
920 /// Methods for support type inquiry through isa, cast, and dyn_cast:
921 static bool classof(const Value *V) {
922 return V->getValueID() == ConstantDataArrayVal;
923 }
924};
925
926//===----------------------------------------------------------------------===//
927/// A vector constant whose element type is a simple 1/2/4/8-byte integer or
928/// float/double, and whose elements are just simple data values
929/// (i.e. ConstantInt/ConstantFP). This Constant node has no operands because it
930/// stores all of the elements of the constant as densely packed data, instead
931/// of as Value*'s.
932class ConstantDataVector final : public ConstantDataSequential {
934
935 explicit ConstantDataVector(Type *ty, const char *Data)
936 : ConstantDataSequential(ty, ConstantDataVectorVal, Data),
937 IsSplatSet(false) {}
938 // Cache whether or not the constant is a splat.
939 mutable bool IsSplatSet : 1;
940 mutable bool IsSplat : 1;
941 bool isSplatData() const;
942
943public:
944 ConstantDataVector(const ConstantDataVector &) = delete;
945
946 /// get() constructors - Return a constant with vector type with an element
947 /// count and element type matching the ArrayRef passed in. Note that this
948 /// can return a ConstantAggregateZero object.
949 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint8_t> Elts);
950 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint16_t> Elts);
951 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint32_t> Elts);
952 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint64_t> Elts);
953 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<float> Elts);
954 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<double> Elts);
955
956 /// getRaw() constructor - Return a constant with vector type with an element
957 /// count and element type matching the NumElements and ElementTy parameters
958 /// passed in. Note that this can return a ConstantAggregateZero object.
959 /// ElementTy must be one of i8/i16/i32/i64/b8/b16/b32/b64/half/bfloat/float/
960 /// double. Data is the buffer containing the elements. Be careful to make
961 /// sure Data uses the right endianness, the buffer will be used as-is.
962 static Constant *getRaw(StringRef Data, uint64_t NumElements,
963 Type *ElementTy) {
964 Type *Ty = VectorType::get(ElementTy, ElementCount::getFixed(NumElements));
965 return getImpl(Data, Ty);
966 }
967
968 /// getByte() constructors - Return a constant of vector type with a byte
969 /// element type taken from argument `ElementType', and count taken from
970 /// argument `Elts'. The amount of bits of the contained type must match the
971 /// number of bits of the type contained in the passed in ArrayRef.
972 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint8_t> Elts);
973 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint16_t> Elts);
974 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint32_t> Elts);
975 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint64_t> Elts);
976
977 /// getFP() constructors - Return a constant of vector type with a float
978 /// element type taken from argument `ElementType', and count taken from
979 /// argument `Elts'. The amount of bits of the contained type must match the
980 /// number of bits of the type contained in the passed in ArrayRef.
981 /// (i.e. half or bfloat for 16bits, float for 32bits, double for 64bits) Note
982 /// that this can return a ConstantAggregateZero object.
983 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint16_t> Elts);
984 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint32_t> Elts);
985 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint64_t> Elts);
986
987 /// Return a ConstantVector with the specified constant in each element.
988 /// The specified constant has to be a of a compatible type (i8/i16/
989 /// i32/i64/b8/b16/b32/b64/half/bfloat/float/double) and must be a ConstantFP,
990 /// ConstantByte or ConstantInt.
991 LLVM_ABI static Constant *getSplat(unsigned NumElts, Constant *Elt);
992
993 /// Returns true if this is a splat constant, meaning that all elements have
994 /// the same value.
995 LLVM_ABI bool isSplat() const;
996
997 /// If this is a splat constant, meaning that all of the elements have the
998 /// same value, return that value. Otherwise return NULL.
1000
1001 /// Specialize the getType() method to always return a FixedVectorType,
1002 /// which reduces the amount of casting needed in parts of the compiler.
1003 inline FixedVectorType *getType() const {
1005 }
1006
1007 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1008 static bool classof(const Value *V) {
1009 return V->getValueID() == ConstantDataVectorVal;
1010 }
1011};
1012
1013//===----------------------------------------------------------------------===//
1014/// A constant token which is empty
1015///
1016class ConstantTokenNone final : public ConstantData {
1017 friend class Constant;
1018
1019 explicit ConstantTokenNone(LLVMContext &Context)
1020 : ConstantData(Type::getTokenTy(Context), ConstantTokenNoneVal) {}
1021
1022 void destroyConstantImpl();
1023
1024public:
1025 ConstantTokenNone(const ConstantTokenNone &) = delete;
1026
1027 /// Return the ConstantTokenNone.
1028 LLVM_ABI static ConstantTokenNone *get(LLVMContext &Context);
1029
1030 /// Methods to support type inquiry through isa, cast, and dyn_cast.
1031 static bool classof(const Value *V) {
1032 return V->getValueID() == ConstantTokenNoneVal;
1033 }
1034};
1035
1036/// A constant target extension type default initializer
1037class ConstantTargetNone final : public ConstantData {
1038 friend class Constant;
1039
1040 explicit ConstantTargetNone(TargetExtType *T)
1041 : ConstantData(T, Value::ConstantTargetNoneVal) {}
1042
1043 void destroyConstantImpl();
1044
1045public:
1046 ConstantTargetNone(const ConstantTargetNone &) = delete;
1047
1048 /// Static factory methods - Return objects of the specified value.
1049 LLVM_ABI static ConstantTargetNone *get(TargetExtType *T);
1050
1051 /// Specialize the getType() method to always return an TargetExtType,
1052 /// which reduces the amount of casting needed in parts of the compiler.
1053 inline TargetExtType *getType() const {
1055 }
1056
1057 /// Methods for support type inquiry through isa, cast, and dyn_cast.
1058 static bool classof(const Value *V) {
1059 return V->getValueID() == ConstantTargetNoneVal;
1060 }
1061};
1062
1063/// The address of a basic block.
1064///
1065class BlockAddress final : public Constant {
1066 friend class Constant;
1067
1068 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
1069
1070 BlockAddress(Type *Ty, BasicBlock *BB);
1071
1072 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1073
1074 void destroyConstantImpl();
1075 Value *handleOperandChangeImpl(Value *From, Value *To);
1076
1077public:
1078 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
1079
1080 /// Return a BlockAddress for the specified function and basic block.
1082
1083 /// Return a BlockAddress for the specified basic block. The basic
1084 /// block must be embedded into a function.
1085 LLVM_ABI static BlockAddress *get(BasicBlock *BB);
1086
1087 /// Return a BlockAddress for the specified basic block, which may not be
1088 /// part of a function. The specified type must match the type of the function
1089 /// the block will be inserted into.
1090 LLVM_ABI static BlockAddress *get(Type *Ty, BasicBlock *BB);
1091
1092 /// Lookup an existing \c BlockAddress constant for the given BasicBlock.
1093 ///
1094 /// \returns 0 if \c !BB->hasAddressTaken(), otherwise the \c BlockAddress.
1095 LLVM_ABI static BlockAddress *lookup(const BasicBlock *BB);
1096
1097 /// Transparently provide more efficient getOperand methods.
1099
1102
1103 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1104 static bool classof(const Value *V) {
1105 return V->getValueID() == BlockAddressVal;
1106 }
1107};
1108
1109template <>
1111 : public FixedNumOperandTraits<BlockAddress, 1> {};
1112
1114
1115/// Wrapper for a function that represents a value that
1116/// functionally represents the original function. This can be a function,
1117/// global alias to a function, or an ifunc.
1118class DSOLocalEquivalent final : public Constant {
1119 friend class Constant;
1120
1121 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
1122
1124
1125 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1126
1127 void destroyConstantImpl();
1128 Value *handleOperandChangeImpl(Value *From, Value *To);
1129
1130public:
1131 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
1132
1133 /// Return a DSOLocalEquivalent for the specified global value.
1135
1136 /// Transparently provide more efficient getOperand methods.
1138
1140 return cast<GlobalValue>(Op<0>().get());
1141 }
1142
1143 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1144 static bool classof(const Value *V) {
1145 return V->getValueID() == DSOLocalEquivalentVal;
1146 }
1147};
1148
1149template <>
1151 : public FixedNumOperandTraits<DSOLocalEquivalent, 1> {};
1152
1154
1155/// Wrapper for a value that won't be replaced with a CFI jump table
1156/// pointer in LowerTypeTestsModule.
1157class NoCFIValue final : public Constant {
1158 friend class Constant;
1159
1160 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
1161
1163
1164 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1165
1166 void destroyConstantImpl();
1167 Value *handleOperandChangeImpl(Value *From, Value *To);
1168
1169public:
1170 /// Return a NoCFIValue for the specified function.
1171 LLVM_ABI static NoCFIValue *get(GlobalValue *GV);
1172
1173 /// Transparently provide more efficient getOperand methods.
1175
1177 return cast<GlobalValue>(Op<0>().get());
1178 }
1179
1180 /// NoCFIValue is always a pointer.
1183 }
1184
1185 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1186 static bool classof(const Value *V) {
1187 return V->getValueID() == NoCFIValueVal;
1188 }
1189};
1190
1191template <>
1192struct OperandTraits<NoCFIValue> : public FixedNumOperandTraits<NoCFIValue, 1> {
1193};
1194
1196
1197/// A signed pointer, in the ptrauth sense.
1198class ConstantPtrAuth final : public Constant {
1200 friend class Constant;
1201
1202 constexpr static IntrusiveOperandsAllocMarker AllocMarker{5};
1203
1205 Constant *AddrDisc, Constant *DeactivationSymbol);
1206
1207 void *operator new(size_t s) { return User::operator new(s, AllocMarker); }
1208
1209 void destroyConstantImpl();
1210 Value *handleOperandChangeImpl(Value *From, Value *To);
1211
1212public:
1213 /// Return a pointer signed with the specified parameters.
1214 LLVM_ABI static ConstantPtrAuth *get(Constant *Ptr, ConstantInt *Key,
1215 ConstantInt *Disc, Constant *AddrDisc,
1216 Constant *DeactivationSymbol);
1217
1218 /// Produce a new ptrauth expression signing the given value using
1219 /// the same schema as is stored in one.
1220 LLVM_ABI ConstantPtrAuth *getWithSameSchema(Constant *Pointer) const;
1221
1222 /// Transparently provide more efficient getOperand methods.
1224
1225 /// The pointer that is signed in this ptrauth signed pointer.
1226 Constant *getPointer() const { return cast<Constant>(Op<0>().get()); }
1227
1228 /// The Key ID, an i32 constant.
1230
1231 /// The integer discriminator, an i64 constant, or 0.
1233 return cast<ConstantInt>(Op<2>().get());
1234 }
1235
1236 /// The address discriminator if any, or the null constant.
1237 /// If present, this must be a value equivalent to the storage location of
1238 /// the only global-initializer user of the ptrauth signed pointer.
1240 return cast<Constant>(Op<3>().get());
1241 }
1242
1243 /// Whether there is any non-null address discriminator.
1245 return !getAddrDiscriminator()->isNullValue();
1246 }
1247
1249 return cast<Constant>(Op<4>().get());
1250 }
1251
1252 /// A constant value for the address discriminator which has special
1253 /// significance to ctors/dtors lowering. Regular address discrimination can't
1254 /// be applied for them since uses of llvm.global_{c|d}tors are disallowed
1255 /// (see Verifier::visitGlobalVariable) and we can't emit getelementptr
1256 /// expressions referencing these special arrays.
1258
1259 /// Whether the address uses a special address discriminator.
1260 /// These discriminators can't be used in real pointer-auth values; they
1261 /// can only be used in "prototype" values that indicate how some real
1262 /// schema is supposed to be produced.
1263 LLVM_ABI bool hasSpecialAddressDiscriminator(uint64_t Value) const;
1264
1265 /// Check whether an authentication operation with key \p Key and (possibly
1266 /// blended) discriminator \p Discriminator is known to be compatible with
1267 /// this ptrauth signed pointer.
1268 LLVM_ABI bool isKnownCompatibleWith(const Value *Key,
1269 const Value *Discriminator,
1270 const DataLayout &DL) const;
1271
1272 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1273 static bool classof(const Value *V) {
1274 return V->getValueID() == ConstantPtrAuthVal;
1275 }
1276};
1277
1278template <>
1280 : public FixedNumOperandTraits<ConstantPtrAuth, 5> {};
1281
1283
1284//===----------------------------------------------------------------------===//
1285/// A constant value that is initialized with an expression using
1286/// other constant values.
1287///
1288/// This class uses the standard Instruction opcodes to define the various
1289/// constant expressions. The Opcode field for the ConstantExpr class is
1290/// maintained in the Value::SubclassData field.
1291class ConstantExpr : public Constant {
1292 friend struct ConstantExprKeyType;
1293 friend class Constant;
1294
1295 void destroyConstantImpl();
1296 Value *handleOperandChangeImpl(Value *From, Value *To);
1297
1298protected:
1299 ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
1300 : Constant(ty, ConstantExprVal, AllocInfo) {
1301 // Operation type (an Instruction opcode) is stored as the SubclassData.
1302 setValueSubclassData(Opcode);
1303 }
1304
1305 ~ConstantExpr() = default;
1306
1307public:
1308 // Static methods to construct a ConstantExpr of different kinds. Note that
1309 // these methods may return a object that is not an instance of the
1310 // ConstantExpr class, because they will attempt to fold the constant
1311 // expression into something simpler if possible.
1312
1313 /// getAlignOf constant expr - computes the alignment of a type in a target
1314 /// independent way (Note: the return type is an i64).
1315 LLVM_ABI static Constant *getAlignOf(Type *Ty);
1316
1317 /// getSizeOf constant expr - computes the (alloc) size of a type (in
1318 /// address-units, not bits) in a target independent way (Note: the return
1319 /// type is an i64).
1320 ///
1321 LLVM_ABI static Constant *getSizeOf(Type *Ty);
1322
1323 LLVM_ABI static Constant *getNeg(Constant *C, bool HasNSW = false);
1324 LLVM_ABI static Constant *getNot(Constant *C);
1325 LLVM_ABI static Constant *getAdd(Constant *C1, Constant *C2,
1326 bool HasNUW = false, bool HasNSW = false);
1327 LLVM_ABI static Constant *getSub(Constant *C1, Constant *C2,
1328 bool HasNUW = false, bool HasNSW = false);
1329 LLVM_ABI static Constant *getXor(Constant *C1, Constant *C2);
1330 LLVM_ABI static Constant *getTrunc(Constant *C, Type *Ty,
1331 bool OnlyIfReduced = false);
1333 bool OnlyIfReduced = false);
1335 bool OnlyIfReduced = false);
1337 bool OnlyIfReduced = false);
1338 LLVM_ABI static Constant *getBitCast(Constant *C, Type *Ty,
1339 bool OnlyIfReduced = false);
1341 bool OnlyIfReduced = false);
1342
1343 static Constant *getNSWNeg(Constant *C) { return getNeg(C, /*HasNSW=*/true); }
1344
1346 return getAdd(C1, C2, false, true);
1347 }
1348
1350 return getAdd(C1, C2, true, false);
1351 }
1352
1354 return getSub(C1, C2, false, true);
1355 }
1356
1358 return getSub(C1, C2, true, false);
1359 }
1360
1361 /// If C is a scalar/fixed width vector of known powers of 2, then this
1362 /// function returns a new scalar/fixed width vector obtained from logBase2
1363 /// of C. Undef vector elements are set to zero.
1364 /// Return a null pointer otherwise.
1365 LLVM_ABI static Constant *getExactLogBase2(Constant *C);
1366
1367 /// Return the identity constant for a binary opcode.
1368 /// If the binop is not commutative, callers can acquire the operand 1
1369 /// identity constant by setting AllowRHSConstant to true. For example, any
1370 /// shift has a zero identity constant for operand 1: X shift 0 = X. If this
1371 /// is a fadd/fsub operation and we don't care about signed zeros, then
1372 /// setting NSZ to true returns the identity +0.0 instead of -0.0. Return
1373 /// nullptr if the operator does not have an identity constant.
1374 LLVM_ABI static Constant *getBinOpIdentity(unsigned Opcode, Type *Ty,
1375 bool AllowRHSConstant = false,
1376 bool NSZ = false);
1377
1378 LLVM_ABI static Constant *getIntrinsicIdentity(Intrinsic::ID, Type *Ty);
1379
1380 /// Return the identity constant for a binary or intrinsic Instruction.
1381 /// The identity constant C is defined as X op C = X and C op X = X where C
1382 /// and X are the first two operands, and the operation is commutative.
1383 LLVM_ABI static Constant *getIdentity(Instruction *I, Type *Ty,
1384 bool AllowRHSConstant = false,
1385 bool NSZ = false);
1386
1387 /// Return the absorbing element for the given binary
1388 /// operation, i.e. a constant C such that X op C = C and C op X = C for
1389 /// every X. For example, this returns zero for integer multiplication.
1390 /// If AllowLHSConstant is true, the LHS operand is a constant C that must be
1391 /// defined as C op X = C. It returns null if the operator doesn't have
1392 /// an absorbing element.
1393 LLVM_ABI static Constant *getBinOpAbsorber(unsigned Opcode, Type *Ty,
1394 bool AllowLHSConstant = false);
1395
1396 /// Transparently provide more efficient getOperand methods.
1398
1399 /// Convenience function for getting a Cast operation.
1400 ///
1401 /// \param ops The opcode for the conversion
1402 /// \param C The constant to be converted
1403 /// \param Ty The type to which the constant is converted
1404 /// \param OnlyIfReduced see \a getWithOperands() docs.
1405 LLVM_ABI static Constant *getCast(unsigned ops, Constant *C, Type *Ty,
1406 bool OnlyIfReduced = false);
1407
1408 // Create a Trunc or BitCast cast constant expression
1409 LLVM_ABI static Constant *
1410 getTruncOrBitCast(Constant *C, ///< The constant to trunc or bitcast
1411 Type *Ty ///< The type to trunc or bitcast C to
1412 );
1413
1414 /// Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant
1415 /// expression.
1416 LLVM_ABI static Constant *
1417 getPointerCast(Constant *C, ///< The pointer value to be casted (operand 0)
1418 Type *Ty ///< The type to which cast should be made
1419 );
1420
1421 /// Create a BitCast or AddrSpaceCast for a pointer type depending on
1422 /// the address space.
1424 Constant *C, ///< The constant to addrspacecast or bitcast
1425 Type *Ty ///< The type to bitcast or addrspacecast C to
1426 );
1427
1428 /// Return true if this is a convert constant expression
1429 LLVM_ABI bool isCast() const;
1430
1431 /// get - Return a binary or shift operator constant expression,
1432 /// folding if possible.
1433 ///
1434 /// \param OnlyIfReducedTy see \a getWithOperands() docs.
1435 LLVM_ABI static Constant *get(unsigned Opcode, Constant *C1, Constant *C2,
1436 unsigned Flags = 0,
1437 Type *OnlyIfReducedTy = nullptr);
1438
1439 /// Getelementptr form. Value* is only accepted for convenience;
1440 /// all elements must be Constants.
1441 ///
1442 /// \param InRange the inrange range if present or std::nullopt.
1443 /// \param OnlyIfReducedTy see \a getWithOperands() docs.
1444 static Constant *
1447 std::optional<ConstantRange> InRange = std::nullopt,
1448 Type *OnlyIfReducedTy = nullptr) {
1449 return getGetElementPtr(
1450 Ty, C, ArrayRef((Value *const *)IdxList.data(), IdxList.size()), NW,
1451 InRange, OnlyIfReducedTy);
1452 }
1453 static Constant *
1456 std::optional<ConstantRange> InRange = std::nullopt,
1457 Type *OnlyIfReducedTy = nullptr) {
1458 // This form of the function only exists to avoid ambiguous overload
1459 // warnings about whether to convert Idx to ArrayRef<Constant *> or
1460 // ArrayRef<Value *>.
1461 return getGetElementPtr(Ty, C, cast<Value>(Idx), NW, InRange,
1462 OnlyIfReducedTy);
1463 }
1464 LLVM_ABI static Constant *
1465 getGetElementPtr(Type *Ty, Constant *C, ArrayRef<Value *> IdxList,
1467 std::optional<ConstantRange> InRange = std::nullopt,
1468 Type *OnlyIfReducedTy = nullptr);
1469
1470 /// Create a getelementptr i8, ptr, offset constant expression.
1471 static Constant *
1474 std::optional<ConstantRange> InRange = std::nullopt,
1475 Type *OnlyIfReduced = nullptr) {
1476 return getGetElementPtr(Type::getInt8Ty(Ptr->getContext()), Ptr, Offset, NW,
1477 InRange, OnlyIfReduced);
1478 }
1479
1480 /// Create an "inbounds" getelementptr. See the documentation for the
1481 /// "inbounds" flag in LangRef.html for details.
1483 ArrayRef<Constant *> IdxList) {
1484 return getGetElementPtr(Ty, C, IdxList, GEPNoWrapFlags::inBounds());
1485 }
1487 Constant *Idx) {
1488 // This form of the function only exists to avoid ambiguous overload
1489 // warnings about whether to convert Idx to ArrayRef<Constant *> or
1490 // ArrayRef<Value *>.
1491 return getGetElementPtr(Ty, C, Idx, GEPNoWrapFlags::inBounds());
1492 }
1494 ArrayRef<Value *> IdxList) {
1495 return getGetElementPtr(Ty, C, IdxList, GEPNoWrapFlags::inBounds());
1496 }
1497
1498 /// Create a getelementptr inbounds i8, ptr, offset constant expression.
1502
1503 LLVM_ABI static Constant *getExtractElement(Constant *Vec, Constant *Idx,
1504 Type *OnlyIfReducedTy = nullptr);
1505 LLVM_ABI static Constant *getInsertElement(Constant *Vec, Constant *Elt,
1506 Constant *Idx,
1507 Type *OnlyIfReducedTy = nullptr);
1508 LLVM_ABI static Constant *getShuffleVector(Constant *V1, Constant *V2,
1509 ArrayRef<int> Mask,
1510 Type *OnlyIfReducedTy = nullptr);
1511
1512 /// Return the opcode at the root of this constant expression
1513 unsigned getOpcode() const { return getSubclassDataFromValue(); }
1514
1515 /// Assert that this is a shufflevector and return the mask. See class
1516 /// ShuffleVectorInst for a description of the mask representation.
1517 LLVM_ABI ArrayRef<int> getShuffleMask() const;
1518
1519 /// Assert that this is a shufflevector and return the mask.
1520 ///
1521 /// TODO: This is a temporary hack until we update the bitcode format for
1522 /// shufflevector.
1523 LLVM_ABI Constant *getShuffleMaskForBitcode() const;
1524
1525 /// Return a string representation for an opcode.
1526 LLVM_ABI const char *getOpcodeName() const;
1527
1528 /// This returns the current constant expression with the operands replaced
1529 /// with the specified values. The specified array must have the same number
1530 /// of operands as our current one.
1534
1535 /// Get the current expression with the operands replaced.
1536 ///
1537 /// Return the current constant expression with the operands replaced with \c
1538 /// Ops and the type with \c Ty. The new operands must have the same number
1539 /// as the current ones.
1540 ///
1541 /// If \c OnlyIfReduced is \c true, nullptr will be returned unless something
1542 /// gets constant-folded, the type changes, or the expression is otherwise
1543 /// canonicalized. This parameter should almost always be \c false.
1544 LLVM_ABI Constant *getWithOperands(ArrayRef<Constant *> Ops, Type *Ty,
1545 bool OnlyIfReduced = false,
1546 Type *SrcTy = nullptr) const;
1547
1548 /// Returns an Instruction which implements the same operation as this
1549 /// ConstantExpr. It is not inserted into any basic block.
1550 ///
1551 /// A better approach to this could be to have a constructor for Instruction
1552 /// which would take a ConstantExpr parameter, but that would have spread
1553 /// implementation details of ConstantExpr outside of Constants.cpp, which
1554 /// would make it harder to remove ConstantExprs altogether.
1555 LLVM_ABI Instruction *getAsInstruction() const;
1556
1557 /// Whether creating a constant expression for this binary operator is
1558 /// desirable.
1559 LLVM_ABI static bool isDesirableBinOp(unsigned Opcode);
1560
1561 /// Whether creating a constant expression for this binary operator is
1562 /// supported.
1563 LLVM_ABI static bool isSupportedBinOp(unsigned Opcode);
1564
1565 /// Whether creating a constant expression for this cast is desirable.
1566 LLVM_ABI static bool isDesirableCastOp(unsigned Opcode);
1567
1568 /// Whether creating a constant expression for this cast is supported.
1569 LLVM_ABI static bool isSupportedCastOp(unsigned Opcode);
1570
1571 /// Whether creating a constant expression for this getelementptr type is
1572 /// supported.
1573 static bool isSupportedGetElementPtr(const Type *SrcElemTy) {
1574 return !SrcElemTy->isScalableTy();
1575 }
1576
1577 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1578 static bool classof(const Value *V) {
1579 return V->getValueID() == ConstantExprVal;
1580 }
1581
1582private:
1583 // Shadow Value::setValueSubclassData with a private forwarding method so that
1584 // subclasses cannot accidentally use it.
1585 void setValueSubclassData(unsigned short D) {
1587 }
1588};
1589
1590template <>
1592 : public VariadicOperandTraits<ConstantExpr> {};
1593
1595
1596//===----------------------------------------------------------------------===//
1597/// 'undef' values are things that do not have specified contents.
1598/// These are used for a variety of purposes, including global variable
1599/// initializers and operands to instructions. 'undef' values can occur with
1600/// any first-class type.
1601///
1602/// Undef values aren't exactly constants; if they have multiple uses, they
1603/// can appear to have different bit patterns at each use. See
1604/// LangRef.html#undefvalues for details.
1605///
1606class UndefValue : public ConstantData {
1607 friend class Constant;
1608
1609 explicit UndefValue(Type *T) : ConstantData(T, UndefValueVal) {}
1610
1611 void destroyConstantImpl();
1612
1613protected:
1614 explicit UndefValue(Type *T, ValueTy vty) : ConstantData(T, vty) {}
1615
1616public:
1617 UndefValue(const UndefValue &) = delete;
1618
1619 /// Static factory methods - Return an 'undef' object of the specified type.
1620 LLVM_ABI static UndefValue *get(Type *T);
1621
1622 /// If this Undef has array or vector type, return a undef with the right
1623 /// element type.
1624 LLVM_ABI UndefValue *getSequentialElement() const;
1625
1626 /// If this undef has struct type, return a undef with the right element type
1627 /// for the specified element.
1628 LLVM_ABI UndefValue *getStructElement(unsigned Elt) const;
1629
1630 /// Return an undef of the right value for the specified GEP index if we can,
1631 /// otherwise return null (e.g. if C is a ConstantExpr).
1632 LLVM_ABI UndefValue *getElementValue(Constant *C) const;
1633
1634 /// Return an undef of the right value for the specified GEP index.
1635 LLVM_ABI UndefValue *getElementValue(unsigned Idx) const;
1636
1637 /// Return the number of elements in the array, vector, or struct.
1638 LLVM_ABI unsigned getNumElements() const;
1639
1640 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1641 static bool classof(const Value *V) {
1642 return V->getValueID() == UndefValueVal ||
1643 V->getValueID() == PoisonValueVal;
1644 }
1645};
1646
1647//===----------------------------------------------------------------------===//
1648/// In order to facilitate speculative execution, many instructions do not
1649/// invoke immediate undefined behavior when provided with illegal operands,
1650/// and return a poison value instead.
1651///
1652/// see LangRef.html#poisonvalues for details.
1653///
1654class PoisonValue final : public UndefValue {
1655 friend class Constant;
1656
1657 explicit PoisonValue(Type *T) : UndefValue(T, PoisonValueVal) {}
1658
1659 void destroyConstantImpl();
1660
1661public:
1662 PoisonValue(const PoisonValue &) = delete;
1663
1664 /// Static factory methods - Return an 'poison' object of the specified type.
1665 LLVM_ABI static PoisonValue *get(Type *T);
1666
1667 /// If this poison has array or vector type, return a poison with the right
1668 /// element type.
1669 LLVM_ABI PoisonValue *getSequentialElement() const;
1670
1671 /// If this poison has struct type, return a poison with the right element
1672 /// type for the specified element.
1673 LLVM_ABI PoisonValue *getStructElement(unsigned Elt) const;
1674
1675 /// Return an poison of the right value for the specified GEP index if we can,
1676 /// otherwise return null (e.g. if C is a ConstantExpr).
1677 LLVM_ABI PoisonValue *getElementValue(Constant *C) const;
1678
1679 /// Return an poison of the right value for the specified GEP index.
1680 LLVM_ABI PoisonValue *getElementValue(unsigned Idx) const;
1681
1682 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1683 static bool classof(const Value *V) {
1684 return V->getValueID() == PoisonValueVal;
1685 }
1686};
1687
1688} // end namespace llvm
1689
1690#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)
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:5976
Class for arbitrary precision integers.
Definition APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
const T * data() const
Definition ArrayRef.h:139
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:1065
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:1066
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1104
Function * getFunction() const
Definition Constants.h:1101
BasicBlock * getBasicBlock() const
Definition Constants.h:1100
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:535
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:551
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:561
LLVM_ABI ConstantAggregate(Type *T, ValueTy VT, ArrayRef< Constant * > V, AllocInfo AllocInfo)
friend class Constant
Definition Constants.h:578
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:600
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition Constants.h:595
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:921
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:859
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:847
static Constant * get(LLVMContext &Context, ArrayTy &Elts)
get() constructor - ArrayTy needs to be compatible with ArrayRef<ElementTy>.
Definition Constants.h:868
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:878
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition Constants.h:916
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:812
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:819
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:831
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:753
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:962
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:1008
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:933
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
Definition Constants.h:1003
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:1291
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
Definition Constants.h:1299
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1578
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:1357
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList)
Create an "inbounds" getelementptr.
Definition Constants.h:1482
friend struct ConstantExprKeyType
Definition Constants.h:1292
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:1345
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:1293
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:1472
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:1499
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:1573
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:1454
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Value * > IdxList)
Definition Constants.h:1493
static Constant * getNSWNeg(Constant *C)
Definition Constants.h:1343
static Constant * getNSWSub(Constant *C1, Constant *C2)
Definition Constants.h:1353
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, Constant *Idx)
Definition Constants.h:1486
static Constant * getNUWAdd(Constant *C1, Constant *C2)
Definition Constants.h:1349
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:1513
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:1445
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:1531
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:494
bool isInfinity() const
Return true if the value is infinity.
Definition Constants.h:473
friend class Constant
Definition Constants.h:421
bool isNegative() const
Return true if the sign bit is set.
Definition Constants.h:470
bool isExactlyValue(double V) const
Definition Constants.h:486
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:476
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 ...
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:722
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
PointerType * getType() const
Specialize the getType() method to always return an PointerType, which reduces the amount of casting ...
Definition Constants.h:717
ConstantPointerNull(const ConstantPointerNull &)=delete
A signed pointer, in the ptrauth sense.
Definition Constants.h:1198
Constant * getAddrDiscriminator() const
The address discriminator if any, or the null constant.
Definition Constants.h:1239
friend struct ConstantPtrAuthKeyType
Definition Constants.h:1199
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:1226
friend class Constant
Definition Constants.h:1200
ConstantInt * getKey() const
The Key ID, an i32 constant.
Definition Constants.h:1229
Constant * getDeactivationSymbol() const
Definition Constants.h:1248
bool hasAddressDiscriminator() const
Whether there is any non-null address discriminator.
Definition Constants.h:1244
ConstantInt * getDiscriminator() const
The integer discriminator, an i64 constant, or 0.
Definition Constants.h:1232
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1273
static Constant * getAnon(LLVMContext &Ctx, ArrayRef< Constant * > V, bool Packed=false)
Definition Constants.h:632
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:652
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
friend class Constant
Definition Constants.h:610
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:623
StructType * getType() const
Specialization - reduce amount of casting.
Definition Constants.h:647
static Constant * getAnon(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct that has the specified elements.
Definition Constants.h:629
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:1053
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:1058
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:1031
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:693
friend class Constant
Definition Constants.h:662
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
Definition Constants.h:683
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:1118
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1144
GlobalValue * getGlobalValue() const
Definition Constants.h:1139
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:1157
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1186
friend class Constant
Definition Constants.h:1158
PointerType * getType() const
NoCFIValue is always a pointer.
Definition Constants.h:1181
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
GlobalValue * getGlobalValue() const
Definition Constants.h:1176
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:1655
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1683
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....
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
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:487
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:1607
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1641
UndefValue(Type *T, ValueTy vty)
Definition Constants.h:1614
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:256
unsigned short getSubclassDataFromValue() const
Definition Value.h:891
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:259
void setValueSubclassData(unsigned short D)
Definition Value.h:892
ValueTy
Concrete subclass of this.
Definition Value.h:525
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.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
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:115
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...