1 | //===-- llvm/Constant.h - Constant class definition -------------*- C++ -*-===// |
2 | // |
3 | // The LLVM Compiler Infrastructure |
4 | // |
5 | // This file is distributed under the University of Illinois Open Source |
6 | // License. See LICENSE.TXT for details. |
7 | // |
8 | //===----------------------------------------------------------------------===// |
9 | // |
10 | // This file contains the declaration of the Constant class. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef LLVM_IR_CONSTANT_H |
15 | #define LLVM_IR_CONSTANT_H |
16 | |
17 | #include "llvm/IR/User.h" |
18 | #include "llvm/IR/Value.h" |
19 | #include "llvm/Support/Casting.h" |
20 | |
21 | namespace llvm { |
22 | |
23 | class APInt; |
24 | |
25 | /// This is an important base class in LLVM. It provides the common facilities |
26 | /// of all constant values in an LLVM program. A constant is a value that is |
27 | /// immutable at runtime. Functions are constants because their address is |
28 | /// immutable. Same with global variables. |
29 | /// |
30 | /// All constants share the capabilities provided in this class. All constants |
31 | /// can have a null value. They can have an operand list. Constants can be |
32 | /// simple (integer and floating point values), complex (arrays and structures), |
33 | /// or expression based (computations yielding a constant value composed of |
34 | /// only certain operators and other constant values). |
35 | /// |
36 | /// Note that Constants are immutable (once created they never change) |
37 | /// and are fully shared by structural equivalence. This means that two |
38 | /// structurally equivalent constants will always have the same address. |
39 | /// Constants are created on demand as needed and never deleted: thus clients |
40 | /// don't have to worry about the lifetime of the objects. |
41 | /// LLVM Constant Representation |
42 | class Constant : public User { |
43 | protected: |
44 | Constant(Type *ty, ValueTy vty, Use *Ops, unsigned NumOps) |
45 | : User(ty, vty, Ops, NumOps) {} |
46 | |
47 | public: |
48 | void operator=(const Constant &) = delete; |
49 | Constant(const Constant &) = delete; |
50 | |
51 | /// Return true if this is the value that would be returned by getNullValue. |
52 | bool isNullValue() const; |
53 | |
54 | /// Returns true if the value is one. |
55 | bool isOneValue() const; |
56 | |
57 | /// Return true if this is the value that would be returned by |
58 | /// getAllOnesValue. |
59 | bool isAllOnesValue() const; |
60 | |
61 | /// Return true if the value is what would be returned by |
62 | /// getZeroValueForNegation. |
63 | bool isNegativeZeroValue() const; |
64 | |
65 | /// Return true if the value is negative zero or null value. |
66 | bool isZeroValue() const; |
67 | |
68 | /// Return true if the value is not the smallest signed value. |
69 | bool isNotMinSignedValue() const; |
70 | |
71 | /// Return true if the value is the smallest signed value. |
72 | bool isMinSignedValue() const; |
73 | |
74 | /// Return true if this is a finite and non-zero floating-point scalar |
75 | /// constant or a vector constant with all finite and non-zero elements. |
76 | bool isFiniteNonZeroFP() const; |
77 | |
78 | /// Return true if this is a normal (as opposed to denormal) floating-point |
79 | /// scalar constant or a vector constant with all normal elements. |
80 | bool isNormalFP() const; |
81 | |
82 | /// Return true if this scalar has an exact multiplicative inverse or this |
83 | /// vector has an exact multiplicative inverse for each element in the vector. |
84 | bool hasExactInverseFP() const; |
85 | |
86 | /// Return true if this is a floating-point NaN constant or a vector |
87 | /// floating-point constant with all NaN elements. |
88 | bool isNaN() const; |
89 | |
90 | /// Return true if this is a vector constant that includes any undefined |
91 | /// elements. |
92 | bool containsUndefElement() const; |
93 | |
94 | /// Return true if evaluation of this constant could trap. This is true for |
95 | /// things like constant expressions that could divide by zero. |
96 | bool canTrap() const; |
97 | |
98 | /// Return true if the value can vary between threads. |
99 | bool isThreadDependent() const; |
100 | |
101 | /// Return true if the value is dependent on a dllimport variable. |
102 | bool isDLLImportDependent() const; |
103 | |
104 | /// Return true if the constant has users other than constant expressions and |
105 | /// other dangling things. |
106 | bool isConstantUsed() const; |
107 | |
108 | /// This method classifies the entry according to whether or not it may |
109 | /// generate a relocation entry. This must be conservative, so if it might |
110 | /// codegen to a relocatable entry, it should say so. |
111 | /// |
112 | /// FIXME: This really should not be in IR. |
113 | bool needsRelocation() const; |
114 | |
115 | /// For aggregates (struct/array/vector) return the constant that corresponds |
116 | /// to the specified element if possible, or null if not. This can return null |
117 | /// if the element index is a ConstantExpr, if 'this' is a constant expr or |
118 | /// if the constant does not fit into an uint64_t. |
119 | Constant *getAggregateElement(unsigned Elt) const; |
120 | Constant *getAggregateElement(Constant *Elt) const; |
121 | |
122 | /// If this is a splat vector constant, meaning that all of the elements have |
123 | /// the same value, return that value. Otherwise return 0. |
124 | Constant *getSplatValue() const; |
125 | |
126 | /// If C is a constant integer then return its value, otherwise C must be a |
127 | /// vector of constant integers, all equal, and the common value is returned. |
128 | const APInt &getUniqueInteger() const; |
129 | |
130 | /// Called if some element of this constant is no longer valid. |
131 | /// At this point only other constants may be on the use_list for this |
132 | /// constant. Any constants on our Use list must also be destroy'd. The |
133 | /// implementation must be sure to remove the constant from the list of |
134 | /// available cached constants. Implementations should implement |
135 | /// destroyConstantImpl to remove constants from any pools/maps they are |
136 | /// contained it. |
137 | void destroyConstant(); |
138 | |
139 | //// Methods for support type inquiry through isa, cast, and dyn_cast: |
140 | static bool classof(const Value *V) { |
141 | static_assert(ConstantFirstVal == 0, "V->getValueID() >= ConstantFirstVal always succeeds" ); |
142 | return V->getValueID() <= ConstantLastVal; |
143 | } |
144 | |
145 | /// This method is a special form of User::replaceUsesOfWith |
146 | /// (which does not work on constants) that does work |
147 | /// on constants. Basically this method goes through the trouble of building |
148 | /// a new constant that is equivalent to the current one, with all uses of |
149 | /// From replaced with uses of To. After this construction is completed, all |
150 | /// of the users of 'this' are replaced to use the new constant, and then |
151 | /// 'this' is deleted. In general, you should not call this method, instead, |
152 | /// use Value::replaceAllUsesWith, which automatically dispatches to this |
153 | /// method as needed. |
154 | /// |
155 | void handleOperandChange(Value *, Value *); |
156 | |
157 | static Constant *getNullValue(Type* Ty); |
158 | |
159 | /// @returns the value for an integer or vector of integer constant of the |
160 | /// given type that has all its bits set to true. |
161 | /// Get the all ones value |
162 | static Constant *getAllOnesValue(Type* Ty); |
163 | |
164 | /// Return the value for an integer or pointer constant, or a vector thereof, |
165 | /// with the given scalar value. |
166 | static Constant *getIntegerValue(Type *Ty, const APInt &V); |
167 | |
168 | /// If there are any dead constant users dangling off of this constant, remove |
169 | /// them. This method is useful for clients that want to check to see if a |
170 | /// global is unused, but don't want to deal with potentially dead constants |
171 | /// hanging off of the globals. |
172 | void removeDeadConstantUsers() const; |
173 | |
174 | const Constant *stripPointerCasts() const { |
175 | return cast<Constant>(Value::stripPointerCasts()); |
176 | } |
177 | |
178 | Constant *stripPointerCasts() { |
179 | return const_cast<Constant*>( |
180 | static_cast<const Constant *>(this)->stripPointerCasts()); |
181 | } |
182 | }; |
183 | |
184 | } // end namespace llvm |
185 | |
186 | #endif // LLVM_IR_CONSTANT_H |
187 | |