class Constant : public User {
protected:
- inline Constant(const Type *Ty, ValueTy vty = Value::SimpleConstantVal,
- const std::string& Name = "")
- : User(Ty, vty, Name) {}
- ~Constant() {}
+ Constant(const Type *Ty, ValueTy vty, Use *Ops, unsigned NumOps,
+ const std::string& Name = "")
+ : User(Ty, vty, Ops, NumOps, Name) {}
void destroyConstantImpl();
public:
- // setName - Specialize setName to handle symbol table majik...
- virtual void setName(const std::string &name, SymbolTable *ST = 0);
-
/// Static constructor to get a '0' constant of arbitrary type...
///
static Constant *getNullValue(const Type *Ty);
virtual void print(std::ostream &O) const;
+ // 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
/// constant. Any constants on our Use list must also be destroy'd. The
V->getValueType() == Value::ConstantExprVal ||
V->getValueType() == Value::ConstantAggregateZeroVal ||
V->getValueType() == Value::FunctionVal ||
- V->getValueType() == Value::GlobalVariableVal;
+ V->getValueType() == Value::GlobalVariableVal ||
+ V->getValueType() == Value::UndefValueVal;
}
/// replaceUsesOfWithOnConstant - This method is a special form of
"implemented for all constants that have operands!");
assert(0 && "Constants that do not have operands cannot be using 'From'!");
}
+
+ /// 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