1 //===-- llvm/Constants.h - Constant class subclass definitions --*- 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 /// @file 11 /// This file contains the declarations for the subclasses of Constant, 12 /// which represent the different flavors of constant values that live in LLVM. 13 /// Note that Constants are immutable (once created they never change) and are 14 /// fully shared by structural equivalence. This means that two structurally 15 /// equivalent constants will always have the same address. Constant's are 16 /// created on demand as needed and never deleted: thus clients don't have to 17 /// worry about the lifetime of the objects. 18 // 19 //===----------------------------------------------------------------------===// 20 21 #ifndef LLVM_CONSTANTS_H 22 #define LLVM_CONSTANTS_H 23 24 #include "llvm/Constant.h" 25 #include "llvm/OperandTraits.h" 26 #include "llvm/ADT/APInt.h" 27 #include "llvm/ADT/APFloat.h" 28 #include "llvm/ADT/ArrayRef.h" 29 30 namespace llvm { 31 32 class ArrayType; 33 class IntegerType; 34 class StructType; 35 class PointerType; 36 class VectorType; 37 38 template<class ConstantClass, class TypeClass, class ValType> 39 struct ConstantCreator; 40 template<class ConstantClass, class TypeClass> 41 struct ConvertConstantType; 42 43 //===----------------------------------------------------------------------===// 44 /// This is the shared class of boolean and integer constants. This class 45 /// represents both boolean and integral constants. 46 /// @brief Class for constant integers. 47 class ConstantInt : public Constant { 48 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 49 ConstantInt(const ConstantInt &); // DO NOT IMPLEMENT 50 ConstantInt(IntegerType *Ty, const APInt& V); 51 APInt Val; 52 protected: 53 // allocate space for exactly zero operands new(size_t s)54 void *operator new(size_t s) { 55 return User::operator new(s, 0); 56 } 57 public: 58 static ConstantInt *getTrue(LLVMContext &Context); 59 static ConstantInt *getFalse(LLVMContext &Context); 60 static Constant *getTrue(Type *Ty); 61 static Constant *getFalse(Type *Ty); 62 63 /// If Ty is a vector type, return a Constant with a splat of the given 64 /// value. Otherwise return a ConstantInt for the given value. 65 static Constant *get(Type *Ty, uint64_t V, bool isSigned = false); 66 67 /// Return a ConstantInt with the specified integer value for the specified 68 /// type. If the type is wider than 64 bits, the value will be zero-extended 69 /// to fit the type, unless isSigned is true, in which case the value will 70 /// be interpreted as a 64-bit signed integer and sign-extended to fit 71 /// the type. 72 /// @brief Get a ConstantInt for a specific value. 73 static ConstantInt *get(IntegerType *Ty, uint64_t V, 74 bool isSigned = false); 75 76 /// Return a ConstantInt with the specified value for the specified type. The 77 /// value V will be canonicalized to a an unsigned APInt. Accessing it with 78 /// either getSExtValue() or getZExtValue() will yield a correctly sized and 79 /// signed value for the type Ty. 80 /// @brief Get a ConstantInt for a specific signed value. 81 static ConstantInt *getSigned(IntegerType *Ty, int64_t V); 82 static Constant *getSigned(Type *Ty, int64_t V); 83 84 /// Return a ConstantInt with the specified value and an implied Type. The 85 /// type is the integer type that corresponds to the bit width of the value. 86 static ConstantInt *get(LLVMContext &Context, const APInt &V); 87 88 /// Return a ConstantInt constructed from the string strStart with the given 89 /// radix. 90 static ConstantInt *get(IntegerType *Ty, StringRef Str, 91 uint8_t radix); 92 93 /// If Ty is a vector type, return a Constant with a splat of the given 94 /// value. Otherwise return a ConstantInt for the given value. 95 static Constant *get(Type* Ty, const APInt& V); 96 97 /// Return the constant as an APInt value reference. This allows clients to 98 /// obtain a copy of the value, with all its precision in tact. 99 /// @brief Return the constant's value. getValue()100 inline const APInt &getValue() const { 101 return Val; 102 } 103 104 /// getBitWidth - Return the bitwidth of this constant. getBitWidth()105 unsigned getBitWidth() const { return Val.getBitWidth(); } 106 107 /// Return the constant as a 64-bit unsigned integer value after it 108 /// has been zero extended as appropriate for the type of this constant. Note 109 /// that this method can assert if the value does not fit in 64 bits. 110 /// @deprecated 111 /// @brief Return the zero extended value. getZExtValue()112 inline uint64_t getZExtValue() const { 113 return Val.getZExtValue(); 114 } 115 116 /// Return the constant as a 64-bit integer value after it has been sign 117 /// extended as appropriate for the type of this constant. Note that 118 /// this method can assert if the value does not fit in 64 bits. 119 /// @deprecated 120 /// @brief Return the sign extended value. getSExtValue()121 inline int64_t getSExtValue() const { 122 return Val.getSExtValue(); 123 } 124 125 /// A helper method that can be used to determine if the constant contained 126 /// within is equal to a constant. This only works for very small values, 127 /// because this is all that can be represented with all types. 128 /// @brief Determine if this constant's value is same as an unsigned char. equalsInt(uint64_t V)129 bool equalsInt(uint64_t V) const { 130 return Val == V; 131 } 132 133 /// getType - Specialize the getType() method to always return an IntegerType, 134 /// which reduces the amount of casting needed in parts of the compiler. 135 /// getType()136 inline IntegerType *getType() const { 137 return reinterpret_cast<IntegerType*>(Value::getType()); 138 } 139 140 /// This static method returns true if the type Ty is big enough to 141 /// represent the value V. This can be used to avoid having the get method 142 /// assert when V is larger than Ty can represent. Note that there are two 143 /// versions of this method, one for unsigned and one for signed integers. 144 /// Although ConstantInt canonicalizes everything to an unsigned integer, 145 /// the signed version avoids callers having to convert a signed quantity 146 /// to the appropriate unsigned type before calling the method. 147 /// @returns true if V is a valid value for type Ty 148 /// @brief Determine if the value is in range for the given type. 149 static bool isValueValidForType(Type *Ty, uint64_t V); 150 static bool isValueValidForType(Type *Ty, int64_t V); 151 isNegative()152 bool isNegative() const { return Val.isNegative(); } 153 154 /// This is just a convenience method to make client code smaller for a 155 /// common code. It also correctly performs the comparison without the 156 /// potential for an assertion from getZExtValue(). isZero()157 bool isZero() const { 158 return Val == 0; 159 } 160 161 /// This is just a convenience method to make client code smaller for a 162 /// common case. It also correctly performs the comparison without the 163 /// potential for an assertion from getZExtValue(). 164 /// @brief Determine if the value is one. isOne()165 bool isOne() const { 166 return Val == 1; 167 } 168 169 /// This function will return true iff every bit in this constant is set 170 /// to true. 171 /// @returns true iff this constant's bits are all set to true. 172 /// @brief Determine if the value is all ones. isMinusOne()173 bool isMinusOne() const { 174 return Val.isAllOnesValue(); 175 } 176 177 /// This function will return true iff this constant represents the largest 178 /// value that may be represented by the constant's type. 179 /// @returns true iff this is the largest value that may be represented 180 /// by this type. 181 /// @brief Determine if the value is maximal. isMaxValue(bool isSigned)182 bool isMaxValue(bool isSigned) const { 183 if (isSigned) 184 return Val.isMaxSignedValue(); 185 else 186 return Val.isMaxValue(); 187 } 188 189 /// This function will return true iff this constant represents the smallest 190 /// value that may be represented by this constant's type. 191 /// @returns true if this is the smallest value that may be represented by 192 /// this type. 193 /// @brief Determine if the value is minimal. isMinValue(bool isSigned)194 bool isMinValue(bool isSigned) const { 195 if (isSigned) 196 return Val.isMinSignedValue(); 197 else 198 return Val.isMinValue(); 199 } 200 201 /// This function will return true iff this constant represents a value with 202 /// active bits bigger than 64 bits or a value greater than the given uint64_t 203 /// value. 204 /// @returns true iff this constant is greater or equal to the given number. 205 /// @brief Determine if the value is greater or equal to the given number. uge(uint64_t Num)206 bool uge(uint64_t Num) const { 207 return Val.getActiveBits() > 64 || Val.getZExtValue() >= Num; 208 } 209 210 /// getLimitedValue - If the value is smaller than the specified limit, 211 /// return it, otherwise return the limit value. This causes the value 212 /// to saturate to the limit. 213 /// @returns the min of the value of the constant and the specified value 214 /// @brief Get the constant's value with a saturation limit 215 uint64_t getLimitedValue(uint64_t Limit = ~0ULL) const { 216 return Val.getLimitedValue(Limit); 217 } 218 219 /// @brief Methods to support type inquiry through isa, cast, and dyn_cast. classof(const ConstantInt *)220 static inline bool classof(const ConstantInt *) { return true; } classof(const Value * V)221 static bool classof(const Value *V) { 222 return V->getValueID() == ConstantIntVal; 223 } 224 }; 225 226 227 //===----------------------------------------------------------------------===// 228 /// ConstantFP - Floating Point Values [float, double] 229 /// 230 class ConstantFP : public Constant { 231 APFloat Val; 232 void *operator new(size_t, unsigned);// DO NOT IMPLEMENT 233 ConstantFP(const ConstantFP &); // DO NOT IMPLEMENT 234 friend class LLVMContextImpl; 235 protected: 236 ConstantFP(Type *Ty, const APFloat& V); 237 protected: 238 // allocate space for exactly zero operands new(size_t s)239 void *operator new(size_t s) { 240 return User::operator new(s, 0); 241 } 242 public: 243 /// Floating point negation must be implemented with f(x) = -0.0 - x. This 244 /// method returns the negative zero constant for floating point or vector 245 /// floating point types; for all other types, it returns the null value. 246 static Constant *getZeroValueForNegation(Type *Ty); 247 248 /// get() - This returns a ConstantFP, or a vector containing a splat of a 249 /// ConstantFP, for the specified value in the specified type. This should 250 /// only be used for simple constant values like 2.0/1.0 etc, that are 251 /// known-valid both as host double and as the target format. 252 static Constant *get(Type* Ty, double V); 253 static Constant *get(Type* Ty, StringRef Str); 254 static ConstantFP *get(LLVMContext &Context, const APFloat &V); 255 static ConstantFP *getNegativeZero(Type* Ty); 256 static ConstantFP *getInfinity(Type *Ty, bool Negative = false); 257 258 /// isValueValidForType - return true if Ty is big enough to represent V. 259 static bool isValueValidForType(Type *Ty, const APFloat &V); getValueAPF()260 inline const APFloat &getValueAPF() const { return Val; } 261 262 /// isZero - Return true if the value is positive or negative zero. isZero()263 bool isZero() const { return Val.isZero(); } 264 265 /// isNegative - Return true if the sign bit is set. isNegative()266 bool isNegative() const { return Val.isNegative(); } 267 268 /// isNaN - Return true if the value is a NaN. isNaN()269 bool isNaN() const { return Val.isNaN(); } 270 271 /// isExactlyValue - We don't rely on operator== working on double values, as 272 /// it returns true for things that are clearly not equal, like -0.0 and 0.0. 273 /// As such, this method can be used to do an exact bit-for-bit comparison of 274 /// two floating point values. The version with a double operand is retained 275 /// because it's so convenient to write isExactlyValue(2.0), but please use 276 /// it only for simple constants. 277 bool isExactlyValue(const APFloat &V) const; 278 isExactlyValue(double V)279 bool isExactlyValue(double V) const { 280 bool ignored; 281 // convert is not supported on this type 282 if (&Val.getSemantics() == &APFloat::PPCDoubleDouble) 283 return false; 284 APFloat FV(V); 285 FV.convert(Val.getSemantics(), APFloat::rmNearestTiesToEven, &ignored); 286 return isExactlyValue(FV); 287 } 288 /// Methods for support type inquiry through isa, cast, and dyn_cast: classof(const ConstantFP *)289 static inline bool classof(const ConstantFP *) { return true; } classof(const Value * V)290 static bool classof(const Value *V) { 291 return V->getValueID() == ConstantFPVal; 292 } 293 }; 294 295 //===----------------------------------------------------------------------===// 296 /// ConstantAggregateZero - All zero aggregate value 297 /// 298 class ConstantAggregateZero : public Constant { 299 friend struct ConstantCreator<ConstantAggregateZero, Type, char>; 300 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 301 ConstantAggregateZero(const ConstantAggregateZero &); // DO NOT IMPLEMENT 302 protected: 303 explicit ConstantAggregateZero(Type *ty) 304 : Constant(ty, ConstantAggregateZeroVal, 0, 0) {} 305 protected: 306 // allocate space for exactly zero operands 307 void *operator new(size_t s) { 308 return User::operator new(s, 0); 309 } 310 public: 311 static ConstantAggregateZero* get(Type *Ty); 312 313 virtual void destroyConstant(); 314 315 /// Methods for support type inquiry through isa, cast, and dyn_cast: 316 /// 317 static bool classof(const ConstantAggregateZero *) { return true; } 318 static bool classof(const Value *V) { 319 return V->getValueID() == ConstantAggregateZeroVal; 320 } 321 }; 322 323 324 //===----------------------------------------------------------------------===// 325 /// ConstantArray - Constant Array Declarations 326 /// 327 class ConstantArray : public Constant { 328 friend struct ConstantCreator<ConstantArray, ArrayType, 329 std::vector<Constant*> >; 330 ConstantArray(const ConstantArray &); // DO NOT IMPLEMENT 331 protected: 332 ConstantArray(ArrayType *T, ArrayRef<Constant *> Val); 333 public: 334 // ConstantArray accessors 335 static Constant *get(ArrayType *T, ArrayRef<Constant*> V); 336 337 /// This method constructs a ConstantArray and initializes it with a text 338 /// string. The default behavior (AddNull==true) causes a null terminator to 339 /// be placed at the end of the array. This effectively increases the length 340 /// of the array by one (you've been warned). However, in some situations 341 /// this is not desired so if AddNull==false then the string is copied without 342 /// null termination. 343 static Constant *get(LLVMContext &Context, StringRef Initializer, 344 bool AddNull = true); 345 346 /// Transparently provide more efficient getOperand methods. 347 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant); 348 349 /// getType - Specialize the getType() method to always return an ArrayType, 350 /// which reduces the amount of casting needed in parts of the compiler. 351 /// 352 inline ArrayType *getType() const { 353 return reinterpret_cast<ArrayType*>(Value::getType()); 354 } 355 356 /// isString - This method returns true if the array is an array of i8 and 357 /// the elements of the array are all ConstantInt's. 358 bool isString() const; 359 360 /// isCString - This method returns true if the array is a string (see 361 /// @verbatim 362 /// isString) and it ends in a null byte \0 and does not contains any other 363 /// @endverbatim 364 /// null bytes except its terminator. 365 bool isCString() const; 366 367 /// getAsString - If this array is isString(), then this method converts the 368 /// array to an std::string and returns it. Otherwise, it asserts out. 369 /// 370 std::string getAsString() const; 371 372 /// getAsCString - If this array is isCString(), then this method converts the 373 /// array (without the trailing null byte) to an std::string and returns it. 374 /// Otherwise, it asserts out. 375 /// 376 std::string getAsCString() const; 377 378 virtual void destroyConstant(); 379 virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U); 380 381 /// Methods for support type inquiry through isa, cast, and dyn_cast: 382 static inline bool classof(const ConstantArray *) { return true; } 383 static bool classof(const Value *V) { 384 return V->getValueID() == ConstantArrayVal; 385 } 386 }; 387 388 template <> 389 struct OperandTraits<ConstantArray> : 390 public VariadicOperandTraits<ConstantArray> { 391 }; 392 393 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ConstantArray, Constant) 394 395 //===----------------------------------------------------------------------===// 396 // ConstantStruct - Constant Struct Declarations 397 // 398 class ConstantStruct : public Constant { 399 friend struct ConstantCreator<ConstantStruct, StructType, 400 std::vector<Constant*> >; 401 ConstantStruct(const ConstantStruct &); // DO NOT IMPLEMENT 402 protected: 403 ConstantStruct(StructType *T, ArrayRef<Constant *> Val); 404 public: 405 // ConstantStruct accessors 406 static Constant *get(StructType *T, ArrayRef<Constant*> V); 407 static Constant *get(StructType *T, ...) END_WITH_NULL; 408 409 /// getAnon - Return an anonymous struct that has the specified 410 /// elements. If the struct is possibly empty, then you must specify a 411 /// context. 412 static Constant *getAnon(ArrayRef<Constant*> V, bool Packed = false) { 413 return get(getTypeForElements(V, Packed), V); 414 } 415 static Constant *getAnon(LLVMContext &Ctx, 416 ArrayRef<Constant*> V, bool Packed = false) { 417 return get(getTypeForElements(Ctx, V, Packed), V); 418 } 419 420 /// getTypeForElements - Return an anonymous struct type to use for a constant 421 /// with the specified set of elements. The list must not be empty. 422 static StructType *getTypeForElements(ArrayRef<Constant*> V, 423 bool Packed = false); 424 /// getTypeForElements - This version of the method allows an empty list. 425 static StructType *getTypeForElements(LLVMContext &Ctx, 426 ArrayRef<Constant*> V, 427 bool Packed = false); 428 429 /// Transparently provide more efficient getOperand methods. 430 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant); 431 432 /// getType() specialization - Reduce amount of casting... 433 /// 434 inline StructType *getType() const { 435 return reinterpret_cast<StructType*>(Value::getType()); 436 } 437 438 virtual void destroyConstant(); 439 virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U); 440 441 /// Methods for support type inquiry through isa, cast, and dyn_cast: 442 static inline bool classof(const ConstantStruct *) { return true; } 443 static bool classof(const Value *V) { 444 return V->getValueID() == ConstantStructVal; 445 } 446 }; 447 448 template <> 449 struct OperandTraits<ConstantStruct> : 450 public VariadicOperandTraits<ConstantStruct> { 451 }; 452 453 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ConstantStruct, Constant) 454 455 456 //===----------------------------------------------------------------------===// 457 /// ConstantVector - Constant Vector Declarations 458 /// 459 class ConstantVector : public Constant { 460 friend struct ConstantCreator<ConstantVector, VectorType, 461 std::vector<Constant*> >; 462 ConstantVector(const ConstantVector &); // DO NOT IMPLEMENT 463 protected: 464 ConstantVector(VectorType *T, ArrayRef<Constant *> Val); 465 public: 466 // ConstantVector accessors 467 static Constant *get(ArrayRef<Constant*> V); 468 469 /// Transparently provide more efficient getOperand methods. 470 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant); 471 472 /// getType - Specialize the getType() method to always return a VectorType, 473 /// which reduces the amount of casting needed in parts of the compiler. 474 /// 475 inline VectorType *getType() const { 476 return reinterpret_cast<VectorType*>(Value::getType()); 477 } 478 479 /// This function will return true iff every element in this vector constant 480 /// is set to all ones. 481 /// @returns true iff this constant's emements are all set to all ones. 482 /// @brief Determine if the value is all ones. 483 bool isAllOnesValue() const; 484 485 /// getSplatValue - If this is a splat constant, meaning that all of the 486 /// elements have the same value, return that value. Otherwise return NULL. 487 Constant *getSplatValue() const; 488 489 virtual void destroyConstant(); 490 virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U); 491 492 /// Methods for support type inquiry through isa, cast, and dyn_cast: 493 static inline bool classof(const ConstantVector *) { return true; } 494 static bool classof(const Value *V) { 495 return V->getValueID() == ConstantVectorVal; 496 } 497 }; 498 499 template <> 500 struct OperandTraits<ConstantVector> : 501 public VariadicOperandTraits<ConstantVector> { 502 }; 503 504 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ConstantVector, Constant) 505 506 //===----------------------------------------------------------------------===// 507 /// ConstantPointerNull - a constant pointer value that points to null 508 /// 509 class ConstantPointerNull : public Constant { 510 friend struct ConstantCreator<ConstantPointerNull, PointerType, char>; 511 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 512 ConstantPointerNull(const ConstantPointerNull &); // DO NOT IMPLEMENT 513 protected: 514 explicit ConstantPointerNull(PointerType *T) 515 : Constant(reinterpret_cast<Type*>(T), 516 Value::ConstantPointerNullVal, 0, 0) {} 517 518 protected: 519 // allocate space for exactly zero operands 520 void *operator new(size_t s) { 521 return User::operator new(s, 0); 522 } 523 public: 524 /// get() - Static factory methods - Return objects of the specified value 525 static ConstantPointerNull *get(PointerType *T); 526 527 virtual void destroyConstant(); 528 529 /// getType - Specialize the getType() method to always return an PointerType, 530 /// which reduces the amount of casting needed in parts of the compiler. 531 /// 532 inline PointerType *getType() const { 533 return reinterpret_cast<PointerType*>(Value::getType()); 534 } 535 536 /// Methods for support type inquiry through isa, cast, and dyn_cast: 537 static inline bool classof(const ConstantPointerNull *) { return true; } 538 static bool classof(const Value *V) { 539 return V->getValueID() == ConstantPointerNullVal; 540 } 541 }; 542 543 /// BlockAddress - The address of a basic block. 544 /// 545 class BlockAddress : public Constant { 546 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 547 void *operator new(size_t s) { return User::operator new(s, 2); } 548 BlockAddress(Function *F, BasicBlock *BB); 549 public: 550 /// get - Return a BlockAddress for the specified function and basic block. 551 static BlockAddress *get(Function *F, BasicBlock *BB); 552 553 /// get - Return a BlockAddress for the specified basic block. The basic 554 /// block must be embedded into a function. 555 static BlockAddress *get(BasicBlock *BB); 556 557 /// Transparently provide more efficient getOperand methods. 558 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 559 560 Function *getFunction() const { return (Function*)Op<0>().get(); } 561 BasicBlock *getBasicBlock() const { return (BasicBlock*)Op<1>().get(); } 562 563 virtual void destroyConstant(); 564 virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U); 565 566 /// Methods for support type inquiry through isa, cast, and dyn_cast: 567 static inline bool classof(const BlockAddress *) { return true; } 568 static inline bool classof(const Value *V) { 569 return V->getValueID() == BlockAddressVal; 570 } 571 }; 572 573 template <> 574 struct OperandTraits<BlockAddress> : 575 public FixedNumOperandTraits<BlockAddress, 2> { 576 }; 577 578 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(BlockAddress, Value) 579 580 581 //===----------------------------------------------------------------------===// 582 /// ConstantExpr - a constant value that is initialized with an expression using 583 /// other constant values. 584 /// 585 /// This class uses the standard Instruction opcodes to define the various 586 /// constant expressions. The Opcode field for the ConstantExpr class is 587 /// maintained in the Value::SubclassData field. 588 class ConstantExpr : public Constant { 589 friend struct ConstantCreator<ConstantExpr,Type, 590 std::pair<unsigned, std::vector<Constant*> > >; 591 friend struct ConvertConstantType<ConstantExpr, Type>; 592 593 protected: 594 ConstantExpr(Type *ty, unsigned Opcode, Use *Ops, unsigned NumOps) 595 : Constant(ty, ConstantExprVal, Ops, NumOps) { 596 // Operation type (an Instruction opcode) is stored as the SubclassData. 597 setValueSubclassData(Opcode); 598 } 599 600 public: 601 // Static methods to construct a ConstantExpr of different kinds. Note that 602 // these methods may return a object that is not an instance of the 603 // ConstantExpr class, because they will attempt to fold the constant 604 // expression into something simpler if possible. 605 606 /// getAlignOf constant expr - computes the alignment of a type in a target 607 /// independent way (Note: the return type is an i64). 608 static Constant *getAlignOf(Type *Ty); 609 610 /// getSizeOf constant expr - computes the (alloc) size of a type (in 611 /// address-units, not bits) in a target independent way (Note: the return 612 /// type is an i64). 613 /// 614 static Constant *getSizeOf(Type *Ty); 615 616 /// getOffsetOf constant expr - computes the offset of a struct field in a 617 /// target independent way (Note: the return type is an i64). 618 /// 619 static Constant *getOffsetOf(StructType *STy, unsigned FieldNo); 620 621 /// getOffsetOf constant expr - This is a generalized form of getOffsetOf, 622 /// which supports any aggregate type, and any Constant index. 623 /// 624 static Constant *getOffsetOf(Type *Ty, Constant *FieldNo); 625 626 static Constant *getNeg(Constant *C, bool HasNUW = false, bool HasNSW =false); 627 static Constant *getFNeg(Constant *C); 628 static Constant *getNot(Constant *C); 629 static Constant *getAdd(Constant *C1, Constant *C2, 630 bool HasNUW = false, bool HasNSW = false); 631 static Constant *getFAdd(Constant *C1, Constant *C2); 632 static Constant *getSub(Constant *C1, Constant *C2, 633 bool HasNUW = false, bool HasNSW = false); 634 static Constant *getFSub(Constant *C1, Constant *C2); 635 static Constant *getMul(Constant *C1, Constant *C2, 636 bool HasNUW = false, bool HasNSW = false); 637 static Constant *getFMul(Constant *C1, Constant *C2); 638 static Constant *getUDiv(Constant *C1, Constant *C2, bool isExact = false); 639 static Constant *getSDiv(Constant *C1, Constant *C2, bool isExact = false); 640 static Constant *getFDiv(Constant *C1, Constant *C2); 641 static Constant *getURem(Constant *C1, Constant *C2); 642 static Constant *getSRem(Constant *C1, Constant *C2); 643 static Constant *getFRem(Constant *C1, Constant *C2); 644 static Constant *getAnd(Constant *C1, Constant *C2); 645 static Constant *getOr(Constant *C1, Constant *C2); 646 static Constant *getXor(Constant *C1, Constant *C2); 647 static Constant *getShl(Constant *C1, Constant *C2, 648 bool HasNUW = false, bool HasNSW = false); 649 static Constant *getLShr(Constant *C1, Constant *C2, bool isExact = false); 650 static Constant *getAShr(Constant *C1, Constant *C2, bool isExact = false); 651 static Constant *getTrunc (Constant *C, Type *Ty); 652 static Constant *getSExt (Constant *C, Type *Ty); 653 static Constant *getZExt (Constant *C, Type *Ty); 654 static Constant *getFPTrunc (Constant *C, Type *Ty); 655 static Constant *getFPExtend(Constant *C, Type *Ty); 656 static Constant *getUIToFP (Constant *C, Type *Ty); 657 static Constant *getSIToFP (Constant *C, Type *Ty); 658 static Constant *getFPToUI (Constant *C, Type *Ty); 659 static Constant *getFPToSI (Constant *C, Type *Ty); 660 static Constant *getPtrToInt(Constant *C, Type *Ty); 661 static Constant *getIntToPtr(Constant *C, Type *Ty); 662 static Constant *getBitCast (Constant *C, Type *Ty); 663 664 static Constant *getNSWNeg(Constant *C) { return getNeg(C, false, true); } 665 static Constant *getNUWNeg(Constant *C) { return getNeg(C, true, false); } 666 static Constant *getNSWAdd(Constant *C1, Constant *C2) { 667 return getAdd(C1, C2, false, true); 668 } 669 static Constant *getNUWAdd(Constant *C1, Constant *C2) { 670 return getAdd(C1, C2, true, false); 671 } 672 static Constant *getNSWSub(Constant *C1, Constant *C2) { 673 return getSub(C1, C2, false, true); 674 } 675 static Constant *getNUWSub(Constant *C1, Constant *C2) { 676 return getSub(C1, C2, true, false); 677 } 678 static Constant *getNSWMul(Constant *C1, Constant *C2) { 679 return getMul(C1, C2, false, true); 680 } 681 static Constant *getNUWMul(Constant *C1, Constant *C2) { 682 return getMul(C1, C2, true, false); 683 } 684 static Constant *getNSWShl(Constant *C1, Constant *C2) { 685 return getShl(C1, C2, false, true); 686 } 687 static Constant *getNUWShl(Constant *C1, Constant *C2) { 688 return getShl(C1, C2, true, false); 689 } 690 static Constant *getExactSDiv(Constant *C1, Constant *C2) { 691 return getSDiv(C1, C2, true); 692 } 693 static Constant *getExactUDiv(Constant *C1, Constant *C2) { 694 return getUDiv(C1, C2, true); 695 } 696 static Constant *getExactAShr(Constant *C1, Constant *C2) { 697 return getAShr(C1, C2, true); 698 } 699 static Constant *getExactLShr(Constant *C1, Constant *C2) { 700 return getLShr(C1, C2, true); 701 } 702 703 /// Transparently provide more efficient getOperand methods. 704 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant); 705 706 // @brief Convenience function for getting one of the casting operations 707 // using a CastOps opcode. 708 static Constant *getCast( 709 unsigned ops, ///< The opcode for the conversion 710 Constant *C, ///< The constant to be converted 711 Type *Ty ///< The type to which the constant is converted 712 ); 713 714 // @brief Create a ZExt or BitCast cast constant expression 715 static Constant *getZExtOrBitCast( 716 Constant *C, ///< The constant to zext or bitcast 717 Type *Ty ///< The type to zext or bitcast C to 718 ); 719 720 // @brief Create a SExt or BitCast cast constant expression 721 static Constant *getSExtOrBitCast( 722 Constant *C, ///< The constant to sext or bitcast 723 Type *Ty ///< The type to sext or bitcast C to 724 ); 725 726 // @brief Create a Trunc or BitCast cast constant expression 727 static Constant *getTruncOrBitCast( 728 Constant *C, ///< The constant to trunc or bitcast 729 Type *Ty ///< The type to trunc or bitcast C to 730 ); 731 732 /// @brief Create a BitCast or a PtrToInt cast constant expression 733 static Constant *getPointerCast( 734 Constant *C, ///< The pointer value to be casted (operand 0) 735 Type *Ty ///< The type to which cast should be made 736 ); 737 738 /// @brief Create a ZExt, Bitcast or Trunc for integer -> integer casts 739 static Constant *getIntegerCast( 740 Constant *C, ///< The integer constant to be casted 741 Type *Ty, ///< The integer type to cast to 742 bool isSigned ///< Whether C should be treated as signed or not 743 ); 744 745 /// @brief Create a FPExt, Bitcast or FPTrunc for fp -> fp casts 746 static Constant *getFPCast( 747 Constant *C, ///< The integer constant to be casted 748 Type *Ty ///< The integer type to cast to 749 ); 750 751 /// @brief Return true if this is a convert constant expression 752 bool isCast() const; 753 754 /// @brief Return true if this is a compare constant expression 755 bool isCompare() const; 756 757 /// @brief Return true if this is an insertvalue or extractvalue expression, 758 /// and the getIndices() method may be used. 759 bool hasIndices() const; 760 761 /// @brief Return true if this is a getelementptr expression and all 762 /// the index operands are compile-time known integers within the 763 /// corresponding notional static array extents. Note that this is 764 /// not equivalant to, a subset of, or a superset of the "inbounds" 765 /// property. 766 bool isGEPWithNoNotionalOverIndexing() const; 767 768 /// Select constant expr 769 /// 770 static Constant *getSelect(Constant *C, Constant *V1, Constant *V2); 771 772 /// get - Return a binary or shift operator constant expression, 773 /// folding if possible. 774 /// 775 static Constant *get(unsigned Opcode, Constant *C1, Constant *C2, 776 unsigned Flags = 0); 777 778 /// @brief Return an ICmp or FCmp comparison operator constant expression. 779 static Constant *getCompare(unsigned short pred, Constant *C1, Constant *C2); 780 781 /// get* - Return some common constants without having to 782 /// specify the full Instruction::OPCODE identifier. 783 /// 784 static Constant *getICmp(unsigned short pred, Constant *LHS, Constant *RHS); 785 static Constant *getFCmp(unsigned short pred, Constant *LHS, Constant *RHS); 786 787 /// Getelementptr form. Value* is only accepted for convenience; 788 /// all elements must be Constant's. 789 /// 790 static Constant *getGetElementPtr(Constant *C, 791 ArrayRef<Constant *> IdxList, 792 bool InBounds = false) { 793 return getGetElementPtr(C, makeArrayRef((Value * const *)IdxList.data(), 794 IdxList.size()), 795 InBounds); 796 } 797 static Constant *getGetElementPtr(Constant *C, 798 Constant *Idx, 799 bool InBounds = false) { 800 // This form of the function only exists to avoid ambiguous overload 801 // warnings about whether to convert Idx to ArrayRef<Constant *> or 802 // ArrayRef<Value *>. 803 return getGetElementPtr(C, cast<Value>(Idx), InBounds); 804 } 805 static Constant *getGetElementPtr(Constant *C, 806 ArrayRef<Value *> IdxList, 807 bool InBounds = false); 808 809 /// Create an "inbounds" getelementptr. See the documentation for the 810 /// "inbounds" flag in LangRef.html for details. 811 static Constant *getInBoundsGetElementPtr(Constant *C, 812 ArrayRef<Constant *> IdxList) { 813 return getGetElementPtr(C, IdxList, true); 814 } 815 static Constant *getInBoundsGetElementPtr(Constant *C, 816 Constant *Idx) { 817 // This form of the function only exists to avoid ambiguous overload 818 // warnings about whether to convert Idx to ArrayRef<Constant *> or 819 // ArrayRef<Value *>. 820 return getGetElementPtr(C, Idx, true); 821 } 822 static Constant *getInBoundsGetElementPtr(Constant *C, 823 ArrayRef<Value *> IdxList) { 824 return getGetElementPtr(C, IdxList, true); 825 } 826 827 static Constant *getExtractElement(Constant *Vec, Constant *Idx); 828 static Constant *getInsertElement(Constant *Vec, Constant *Elt,Constant *Idx); 829 static Constant *getShuffleVector(Constant *V1, Constant *V2, Constant *Mask); 830 static Constant *getExtractValue(Constant *Agg, ArrayRef<unsigned> Idxs); 831 static Constant *getInsertValue(Constant *Agg, Constant *Val, 832 ArrayRef<unsigned> Idxs); 833 834 /// getOpcode - Return the opcode at the root of this constant expression 835 unsigned getOpcode() const { return getSubclassDataFromValue(); } 836 837 /// getPredicate - Return the ICMP or FCMP predicate value. Assert if this is 838 /// not an ICMP or FCMP constant expression. 839 unsigned getPredicate() const; 840 841 /// getIndices - Assert that this is an insertvalue or exactvalue 842 /// expression and return the list of indices. 843 ArrayRef<unsigned> getIndices() const; 844 845 /// getOpcodeName - Return a string representation for an opcode. 846 const char *getOpcodeName() const; 847 848 /// getWithOperandReplaced - Return a constant expression identical to this 849 /// one, but with the specified operand set to the specified value. 850 Constant *getWithOperandReplaced(unsigned OpNo, Constant *Op) const; 851 852 /// getWithOperands - This returns the current constant expression with the 853 /// operands replaced with the specified values. The specified array must 854 /// have the same number of operands as our current one. 855 Constant *getWithOperands(ArrayRef<Constant*> Ops) const { 856 return getWithOperands(Ops, getType()); 857 } 858 859 /// getWithOperands - This returns the current constant expression with the 860 /// operands replaced with the specified values and with the specified result 861 /// type. The specified array must have the same number of operands as our 862 /// current one. 863 Constant *getWithOperands(ArrayRef<Constant*> Ops, Type *Ty) const; 864 865 virtual void destroyConstant(); 866 virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U); 867 868 /// Methods for support type inquiry through isa, cast, and dyn_cast: 869 static inline bool classof(const ConstantExpr *) { return true; } 870 static inline bool classof(const Value *V) { 871 return V->getValueID() == ConstantExprVal; 872 } 873 874 private: 875 // Shadow Value::setValueSubclassData with a private forwarding method so that 876 // subclasses cannot accidentally use it. 877 void setValueSubclassData(unsigned short D) { 878 Value::setValueSubclassData(D); 879 } 880 }; 881 882 template <> 883 struct OperandTraits<ConstantExpr> : 884 public VariadicOperandTraits<ConstantExpr, 1> { 885 }; 886 887 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ConstantExpr, Constant) 888 889 //===----------------------------------------------------------------------===// 890 /// UndefValue - 'undef' values are things that do not have specified contents. 891 /// These are used for a variety of purposes, including global variable 892 /// initializers and operands to instructions. 'undef' values can occur with 893 /// any first-class type. 894 /// 895 /// Undef values aren't exactly constants; if they have multiple uses, they 896 /// can appear to have different bit patterns at each use. See 897 /// LangRef.html#undefvalues for details. 898 /// 899 class UndefValue : public Constant { 900 friend struct ConstantCreator<UndefValue, Type, char>; 901 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT 902 UndefValue(const UndefValue &); // DO NOT IMPLEMENT 903 protected: 904 explicit UndefValue(Type *T) : Constant(T, UndefValueVal, 0, 0) {} 905 protected: 906 // allocate space for exactly zero operands 907 void *operator new(size_t s) { 908 return User::operator new(s, 0); 909 } 910 public: 911 /// get() - Static factory methods - Return an 'undef' object of the specified 912 /// type. 913 /// 914 static UndefValue *get(Type *T); 915 916 virtual void destroyConstant(); 917 918 /// Methods for support type inquiry through isa, cast, and dyn_cast: 919 static inline bool classof(const UndefValue *) { return true; } 920 static bool classof(const Value *V) { 921 return V->getValueID() == UndefValueVal; 922 } 923 }; 924 925 } // End llvm namespace 926 927 #endif 928