#include "llvm/User.h"
+namespace llvm {
+
class Constant : public User {
protected:
- inline Constant(const Type *Ty) : User(Ty, Value::ConstantVal) {}
+ inline Constant(const Type *Ty, ValueTy vty = Value::SimpleConstantVal,
+ const std::string& Name = "")
+ : User(Ty, vty, Name) {}
~Constant() {}
void destroyConstantImpl();
virtual void print(std::ostream &O) const;
- /// isConstantExpr - Return true if this is a ConstantExpr
- ///
- virtual bool isConstantExpr() const { return false; }
-
+ // Specialize get/setOperand for Constant's as their operands are always
+ // constants as well.
+ Constant *getOperand(unsigned i) {
+ return static_cast<Constant*>(User::getOperand(i));
+ }
+ const Constant *getOperand(unsigned i) const {
+ return static_cast<const Constant*>(User::getOperand(i));
+ }
+ void setOperand(unsigned i, Constant *C) {
+ User::setOperand(i, C);
+ }
/// destroyConstant - Called if some element of this constant is no longer
/// valid. At this point only other constants may be on the use_list for this
/// available cached constants. Implementations should call
/// destroyConstantImpl as the last thing they do, to destroy all users and
/// delete this.
- ///
- /// Note that this call is only valid on non-primitive constants: You cannot
- /// destroy an integer constant for example. This API is used to delete
- /// constants that have ConstantPointerRef's embeded in them when the module
- /// is deleted, and it is used by GlobalDCE to remove ConstantPointerRefs that
- /// are unneeded, allowing globals to be DCE'd.
- ///
virtual void destroyConstant() { assert(0 && "Not reached!"); }
-
//// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const Constant *) { return true; }
+ static inline bool classof(const GlobalValue *) { return true; }
static inline bool classof(const Value *V) {
- return V->getValueType() == Value::ConstantVal;
+ return V->getValueType() == Value::SimpleConstantVal ||
+ V->getValueType() == Value::ConstantExprVal ||
+ V->getValueType() == Value::ConstantAggregateZeroVal ||
+ V->getValueType() == Value::FunctionVal ||
+ V->getValueType() == Value::GlobalVariableVal ||
+ V->getValueType() == Value::UndefValueVal;
}
/// replaceUsesOfWithOnConstant - This method is a special form of
assert(0 && "Constants that do not have operands cannot be using 'From'!");
}
- // WARNING: Only to be used by Bytecode & Assembly Parsers! USER CODE SHOULD
- // NOT USE THIS!!
- // Returns the number of uses of OldV that were replaced.
- unsigned mutateReferences(Value* OldV, Value *NewV);
- // END WARNING!!
+ /// clearAllValueMaps - This method frees all internal memory used by the
+ /// constant subsystem, which can be used in environments where this memory
+ /// is otherwise reported as a leak.
+ static void clearAllValueMaps();
};
+} // End llvm namespace
+
#endif