/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/IR/Constant.h

Line | Count | Source |

1 | //===-- llvm/Constant.h - Constant class definition -------------*- C++ -*-===// | |

2 | // | |

3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |

4 | // See https://llvm.org/LICENSE.txt for license information. | |

5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |

6 | // | |

7 | //===----------------------------------------------------------------------===// | |

8 | // | |

9 | // This file contains the declaration of the Constant class. | |

10 | // | |

11 | //===----------------------------------------------------------------------===// | |

12 | ||

13 | #ifndef LLVM_IR_CONSTANT_H | |

14 | #define LLVM_IR_CONSTANT_H | |

15 | ||

16 | #include "llvm/IR/User.h" | |

17 | #include "llvm/IR/Value.h" | |

18 | #include "llvm/Support/Casting.h" | |

19 | ||

20 | namespace llvm { | |

21 | ||

22 | class APInt; | |

23 | ||

24 | /// This is an important base class in LLVM. It provides the common facilities | |

25 | /// of all constant values in an LLVM program. A constant is a value that is | |

26 | /// immutable at runtime. Functions are constants because their address is | |

27 | /// immutable. Same with global variables. | |

28 | /// | |

29 | /// All constants share the capabilities provided in this class. All constants | |

30 | /// can have a null value. They can have an operand list. Constants can be | |

31 | /// simple (integer and floating point values), complex (arrays and structures), | |

32 | /// or expression based (computations yielding a constant value composed of | |

33 | /// only certain operators and other constant values). | |

34 | /// | |

35 | /// Note that Constants are immutable (once created they never change) | |

36 | /// and are fully shared by structural equivalence. This means that two | |

37 | /// structurally equivalent constants will always have the same address. | |

38 | /// Constants are created on demand as needed and never deleted: thus clients | |

39 | /// don't have to worry about the lifetime of the objects. | |

40 | /// LLVM Constant Representation | |

41 | class Constant : public User { | |

42 | protected: | |

43 | Constant(Type *ty, ValueTy vty, Use *Ops, unsigned NumOps) | |

44 | 7.95M | : User(ty, vty, Ops, NumOps) {} |

45 | ||

46 | public: | |

47 | void operator=(const Constant &) = delete; | |

48 | Constant(const Constant &) = delete; | |

49 | ||

50 | /// Return true if this is the value that would be returned by getNullValue. | |

51 | bool isNullValue() const; | |

52 | ||

53 | /// Returns true if the value is one. | |

54 | bool isOneValue() const; | |

55 | ||

56 | /// Return true if this is the value that would be returned by | |

57 | /// getAllOnesValue. | |

58 | bool isAllOnesValue() const; | |

59 | ||

60 | /// Return true if the value is what would be returned by | |

61 | /// getZeroValueForNegation. | |

62 | bool isNegativeZeroValue() const; | |

63 | ||

64 | /// Return true if the value is negative zero or null value. | |

65 | bool isZeroValue() const; | |

66 | ||

67 | /// Return true if the value is not the smallest signed value. | |

68 | bool isNotMinSignedValue() const; | |

69 | ||

70 | /// Return true if the value is the smallest signed value. | |

71 | bool isMinSignedValue() const; | |

72 | ||

73 | /// Return true if this is a finite and non-zero floating-point scalar | |

74 | /// constant or a vector constant with all finite and non-zero elements. | |

75 | bool isFiniteNonZeroFP() const; | |

76 | ||

77 | /// Return true if this is a normal (as opposed to denormal) floating-point | |

78 | /// scalar constant or a vector constant with all normal elements. | |

79 | bool isNormalFP() const; | |

80 | ||

81 | /// Return true if this scalar has an exact multiplicative inverse or this | |

82 | /// vector has an exact multiplicative inverse for each element in the vector. | |

83 | bool hasExactInverseFP() const; | |

84 | ||

85 | /// Return true if this is a floating-point NaN constant or a vector | |

86 | /// floating-point constant with all NaN elements. | |

87 | bool isNaN() const; | |

88 | ||

89 | /// Return true if this is a vector constant that includes any undefined | |

90 | /// elements. | |

91 | bool containsUndefElement() const; | |

92 | ||

93 | /// Return true if this is a vector constant that includes any constant | |

94 | /// expressions. | |

95 | bool containsConstantExpression() const; | |

96 | ||

97 | /// Return true if evaluation of this constant could trap. This is true for | |

98 | /// things like constant expressions that could divide by zero. | |

99 | bool canTrap() const; | |

100 | ||

101 | /// Return true if the value can vary between threads. | |

102 | bool isThreadDependent() const; | |

103 | ||

104 | /// Return true if the value is dependent on a dllimport variable. | |

105 | bool isDLLImportDependent() const; | |

106 | ||

107 | /// Return true if the constant has users other than constant expressions and | |

108 | /// other dangling things. | |

109 | bool isConstantUsed() const; | |

110 | ||

111 | /// This method classifies the entry according to whether or not it may | |

112 | /// generate a relocation entry. This must be conservative, so if it might | |

113 | /// codegen to a relocatable entry, it should say so. | |

114 | /// | |

115 | /// FIXME: This really should not be in IR. | |

116 | bool needsRelocation() const; | |

117 | ||

118 | /// For aggregates (struct/array/vector) return the constant that corresponds | |

119 | /// to the specified element if possible, or null if not. This can return null | |

120 | /// if the element index is a ConstantExpr, if 'this' is a constant expr or | |

121 | /// if the constant does not fit into an uint64_t. | |

122 | Constant *getAggregateElement(unsigned Elt) const; | |

123 | Constant *getAggregateElement(Constant *Elt) const; | |

124 | ||

125 | /// If this is a splat vector constant, meaning that all of the elements have | |

126 | /// the same value, return that value. Otherwise return 0. | |

127 | Constant *getSplatValue() const; | |

128 | ||

129 | /// If C is a constant integer then return its value, otherwise C must be a | |

130 | /// vector of constant integers, all equal, and the common value is returned. | |

131 | const APInt &getUniqueInteger() const; | |

132 | ||

133 | /// Called if some element of this constant is no longer valid. | |

134 | /// At this point only other constants may be on the use_list for this | |

135 | /// constant. Any constants on our Use list must also be destroy'd. The | |

136 | /// implementation must be sure to remove the constant from the list of | |

137 | /// available cached constants. Implementations should implement | |

138 | /// destroyConstantImpl to remove constants from any pools/maps they are | |

139 | /// contained it. | |

140 | void destroyConstant(); | |

141 | ||

142 | //// Methods for support type inquiry through isa, cast, and dyn_cast: | |

143 | 41.8M | static bool classof(const Value *V) { |

144 | 41.8M | static_assert(ConstantFirstVal == 0, "V->getValueID() >= ConstantFirstVal always succeeds"); |

145 | 41.8M | return V->getValueID() <= ConstantLastVal; |

146 | 41.8M | } |

147 | ||

148 | /// This method is a special form of User::replaceUsesOfWith | |

149 | /// (which does not work on constants) that does work | |

150 | /// on constants. Basically this method goes through the trouble of building | |

151 | /// a new constant that is equivalent to the current one, with all uses of | |

152 | /// From replaced with uses of To. After this construction is completed, all | |

153 | /// of the users of 'this' are replaced to use the new constant, and then | |

154 | /// 'this' is deleted. In general, you should not call this method, instead, | |

155 | /// use Value::replaceAllUsesWith, which automatically dispatches to this | |

156 | /// method as needed. | |

157 | /// | |

158 | void handleOperandChange(Value *, Value *); | |

159 | ||

160 | static Constant *getNullValue(Type* Ty); | |

161 | ||

162 | /// @returns the value for an integer or vector of integer constant of the | |

163 | /// given type that has all its bits set to true. | |

164 | /// Get the all ones value | |

165 | static Constant *getAllOnesValue(Type* Ty); | |

166 | ||

167 | /// Return the value for an integer or pointer constant, or a vector thereof, | |

168 | /// with the given scalar value. | |

169 | static Constant *getIntegerValue(Type *Ty, const APInt &V); | |

170 | ||

171 | /// If there are any dead constant users dangling off of this constant, remove | |

172 | /// them. This method is useful for clients that want to check to see if a | |

173 | /// global is unused, but don't want to deal with potentially dead constants | |

174 | /// hanging off of the globals. | |

175 | void removeDeadConstantUsers() const; | |

176 | ||

177 | 382k | const Constant *stripPointerCasts() const { |

178 | 382k | return cast<Constant>(Value::stripPointerCasts()); |

179 | 382k | } |

180 | ||

181 | 382k | Constant *stripPointerCasts() { |

182 | 382k | return const_cast<Constant*>( |

183 | 382k | static_cast<const Constant *>(this)->stripPointerCasts()); |

184 | 382k | } |

185 | }; | |

186 | ||

187 | } // end namespace llvm | |

188 | ||

189 | #endif // LLVM_IR_CONSTANT_H |