2003-09-30 18:37:50 +00:00
|
|
|
//===-- llvm/Value.h - Definition of the Value class ------------*- C++ -*-===//
|
2003-10-20 20:19:47 +00:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file was developed by the LLVM research group and is distributed under
|
|
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2001-06-06 20:29:01 +00:00
|
|
|
//
|
|
|
|
// This file defines the very important Value class. This is subclassed by a
|
2002-04-28 04:46:29 +00:00
|
|
|
// bunch of other important classes, like Instruction, Function, Type, etc...
|
2001-06-06 20:29:01 +00:00
|
|
|
//
|
2001-10-01 13:58:13 +00:00
|
|
|
// This file also defines the Use<> template for users of value.
|
|
|
|
//
|
2001-06-06 20:29:01 +00:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_VALUE_H
|
|
|
|
#define LLVM_VALUE_H
|
|
|
|
|
2001-09-07 16:25:23 +00:00
|
|
|
#include "llvm/AbstractTypeUser.h"
|
2003-10-16 16:53:04 +00:00
|
|
|
#include "llvm/Use.h"
|
2004-09-01 22:55:40 +00:00
|
|
|
#include "llvm/Support/Casting.h"
|
2004-07-12 20:25:33 +00:00
|
|
|
#include <string>
|
2001-06-06 20:29:01 +00:00
|
|
|
|
2003-11-11 22:41:34 +00:00
|
|
|
namespace llvm {
|
|
|
|
|
2001-12-03 22:26:30 +00:00
|
|
|
class Constant;
|
2002-04-09 19:59:31 +00:00
|
|
|
class Argument;
|
2001-06-27 23:27:42 +00:00
|
|
|
class Instruction;
|
2004-06-08 17:44:21 +00:00
|
|
|
struct BasicBlock;
|
2001-10-03 14:53:21 +00:00
|
|
|
class GlobalValue;
|
2002-03-23 22:51:58 +00:00
|
|
|
class Function;
|
2001-09-10 07:58:01 +00:00
|
|
|
class GlobalVariable;
|
2001-09-07 16:25:23 +00:00
|
|
|
class SymbolTable;
|
2001-06-06 20:29:01 +00:00
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Value Class
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2002-08-25 22:54:55 +00:00
|
|
|
/// Value - The base class of all values computed by a program that may be used
|
|
|
|
/// as operands to other values.
|
|
|
|
///
|
2004-09-23 14:49:45 +00:00
|
|
|
class Value {
|
2001-06-06 20:29:01 +00:00
|
|
|
private:
|
2004-06-26 20:33:27 +00:00
|
|
|
unsigned SubclassID; // Subclass identifier (for isa/dyn_cast)
|
|
|
|
PATypeHolder Ty;
|
2003-10-16 16:53:04 +00:00
|
|
|
iplist<Use> Uses;
|
2002-01-20 22:54:45 +00:00
|
|
|
std::string Name;
|
2001-06-06 20:29:01 +00:00
|
|
|
|
2002-07-24 20:01:57 +00:00
|
|
|
void operator=(const Value &); // Do not implement
|
2001-06-06 20:29:01 +00:00
|
|
|
Value(const Value &); // Do not implement
|
2004-06-26 20:33:27 +00:00
|
|
|
|
2001-06-06 20:29:01 +00:00
|
|
|
public:
|
2004-06-26 20:33:27 +00:00
|
|
|
Value(const Type *Ty, unsigned scid, const std::string &name = "");
|
2001-06-06 20:29:01 +00:00
|
|
|
virtual ~Value();
|
2001-09-18 12:23:40 +00:00
|
|
|
|
2002-08-25 22:54:55 +00:00
|
|
|
/// dump - Support for debugging, callable in GDB: V->dump()
|
|
|
|
//
|
2003-10-02 19:44:23 +00:00
|
|
|
virtual void dump() const;
|
2002-04-08 21:51:32 +00:00
|
|
|
|
2002-08-25 22:54:55 +00:00
|
|
|
/// print - Implement operator<< on Value...
|
|
|
|
///
|
2002-04-08 21:51:32 +00:00
|
|
|
virtual void print(std::ostream &O) const = 0;
|
2001-09-18 12:23:40 +00:00
|
|
|
|
2002-08-25 22:54:55 +00:00
|
|
|
/// All values are typed, get the type of this value.
|
|
|
|
///
|
2001-09-18 17:03:04 +00:00
|
|
|
inline const Type *getType() const { return Ty; }
|
2001-09-18 12:23:40 +00:00
|
|
|
|
2001-06-27 23:27:42 +00:00
|
|
|
// All values can potentially be named...
|
2004-01-10 21:40:29 +00:00
|
|
|
inline bool hasName() const { return !Name.empty(); }
|
2002-01-20 22:54:45 +00:00
|
|
|
inline const std::string &getName() const { return Name; }
|
2001-09-18 17:03:04 +00:00
|
|
|
|
2002-01-20 22:54:45 +00:00
|
|
|
virtual void setName(const std::string &name, SymbolTable * = 0) {
|
2001-09-18 17:03:04 +00:00
|
|
|
Name = name;
|
|
|
|
}
|
2001-09-18 12:23:40 +00:00
|
|
|
|
2002-08-25 22:54:55 +00:00
|
|
|
/// replaceAllUsesWith - Go through the uses list for this definition and make
|
|
|
|
/// each use point to "V" instead of "this". After this completes, 'this's
|
|
|
|
/// use list is guaranteed to be empty.
|
|
|
|
///
|
|
|
|
void replaceAllUsesWith(Value *V);
|
2001-06-06 20:29:01 +00:00
|
|
|
|
2003-08-29 05:08:31 +00:00
|
|
|
// uncheckedReplaceAllUsesWith - Just like replaceAllUsesWith but dangerous.
|
|
|
|
// Only use when in type resolution situations!
|
|
|
|
void uncheckedReplaceAllUsesWith(Value *V);
|
|
|
|
|
2001-06-06 20:29:01 +00:00
|
|
|
//----------------------------------------------------------------------
|
2001-09-14 16:56:32 +00:00
|
|
|
// Methods for handling the vector of uses of this Value.
|
2001-06-06 20:29:01 +00:00
|
|
|
//
|
2003-10-16 16:53:04 +00:00
|
|
|
typedef UseListIteratorWrapper use_iterator;
|
|
|
|
typedef UseListConstIteratorWrapper use_const_iterator;
|
2001-06-06 20:29:01 +00:00
|
|
|
|
2003-10-15 16:39:04 +00:00
|
|
|
unsigned use_size() const { return Uses.size(); }
|
|
|
|
bool use_empty() const { return Uses.empty(); }
|
|
|
|
use_iterator use_begin() { return Uses.begin(); }
|
|
|
|
use_const_iterator use_begin() const { return Uses.begin(); }
|
|
|
|
use_iterator use_end() { return Uses.end(); }
|
|
|
|
use_const_iterator use_end() const { return Uses.end(); }
|
2003-10-16 16:53:04 +00:00
|
|
|
User *use_back() { return Uses.back().getUser(); }
|
|
|
|
const User *use_back() const { return Uses.back().getUser(); }
|
2003-10-15 16:39:04 +00:00
|
|
|
|
2003-10-16 16:53:04 +00:00
|
|
|
/// hasOneUse - Return true if there is exactly one user of this value. This
|
|
|
|
/// is specialized because it is a common request and does not require
|
|
|
|
/// traversing the whole use list.
|
2003-10-15 16:39:04 +00:00
|
|
|
///
|
2003-10-16 16:53:04 +00:00
|
|
|
bool hasOneUse() const {
|
|
|
|
iplist<Use>::const_iterator I = Uses.begin(), E = Uses.end();
|
|
|
|
if (I == E) return false;
|
|
|
|
return ++I == E;
|
|
|
|
}
|
2001-06-06 20:29:01 +00:00
|
|
|
|
2003-10-16 16:53:04 +00:00
|
|
|
/// addUse/killUse - These two methods should only be used by the Use class.
|
|
|
|
///
|
|
|
|
void addUse(Use &U) { Uses.push_back(&U); }
|
|
|
|
void killUse(Use &U) { Uses.remove(&U); }
|
2004-06-26 20:33:27 +00:00
|
|
|
|
|
|
|
/// getValueType - Return an ID for the concrete type of this object. This is
|
|
|
|
/// used to implement the classof checks. This should not be used for any
|
|
|
|
/// other purpose, as the values may change as LLVM evolves. Also, note that
|
|
|
|
/// starting with the InstructionVal value, the value stored is actually the
|
|
|
|
/// Instruction opcode, so there are more than just these values possible here
|
|
|
|
/// (and Instruction must be last).
|
|
|
|
///
|
|
|
|
enum ValueTy {
|
2004-07-19 00:57:40 +00:00
|
|
|
ArgumentVal, // This is an instance of Argument
|
|
|
|
BasicBlockVal, // This is an instance of BasicBlock
|
|
|
|
FunctionVal, // This is an instance of Function
|
|
|
|
GlobalVariableVal, // This is an instance of GlobalVariable
|
2004-10-16 18:06:07 +00:00
|
|
|
UndefValueVal, // This is an instance of UndefValue
|
2004-07-19 00:57:40 +00:00
|
|
|
ConstantExprVal, // This is an instance of ConstantExpr
|
|
|
|
ConstantAggregateZeroVal, // This is an instance of ConstantAggregateNull
|
|
|
|
SimpleConstantVal, // This is some other type of Constant
|
|
|
|
InstructionVal, // This is an instance of Instruction
|
|
|
|
ValueListVal // This is for bcreader, a special ValTy
|
2004-06-26 20:33:27 +00:00
|
|
|
};
|
|
|
|
unsigned getValueType() const {
|
|
|
|
return SubclassID;
|
|
|
|
}
|
2004-06-27 18:38:24 +00:00
|
|
|
|
2004-07-30 06:59:15 +00:00
|
|
|
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
|
|
static inline bool classof(const Value *V) {
|
|
|
|
return true; // Values are always values.
|
|
|
|
}
|
|
|
|
|
2004-08-04 04:45:42 +00:00
|
|
|
/// getRawType - This should only be used to implement the vmcore library.
|
|
|
|
///
|
|
|
|
const Type *getRawType() const { return Ty.getRawType(); }
|
|
|
|
|
2004-06-27 18:38:24 +00:00
|
|
|
private:
|
|
|
|
/// FIXME: this is a gross hack, needed by another gross hack. Eliminate!
|
|
|
|
void setValueType(unsigned VT) { SubclassID = VT; }
|
|
|
|
friend class Instruction;
|
2001-06-06 20:29:01 +00:00
|
|
|
};
|
|
|
|
|
2002-06-25 16:12:52 +00:00
|
|
|
inline std::ostream &operator<<(std::ostream &OS, const Value &V) {
|
|
|
|
V.print(OS);
|
|
|
|
return OS;
|
|
|
|
}
|
|
|
|
|
2001-10-01 13:58:13 +00:00
|
|
|
|
2003-10-16 16:53:04 +00:00
|
|
|
inline User *UseListIteratorWrapper::operator*() const {
|
|
|
|
return Super::operator*().getUser();
|
|
|
|
}
|
2001-10-01 13:58:13 +00:00
|
|
|
|
2003-10-16 16:53:04 +00:00
|
|
|
inline const User *UseListConstIteratorWrapper::operator*() const {
|
|
|
|
return Super::operator*().getUser();
|
|
|
|
}
|
2001-06-06 20:29:01 +00:00
|
|
|
|
|
|
|
|
2003-10-16 16:53:04 +00:00
|
|
|
Use::Use(Value *v, User *user) : Val(v), U(user) {
|
|
|
|
if (Val) Val->addUse(*this);
|
|
|
|
}
|
|
|
|
|
|
|
|
Use::Use(const Use &u) : Val(u.Val), U(u.U) {
|
|
|
|
if (Val) Val->addUse(*this);
|
|
|
|
}
|
2001-06-06 20:29:01 +00:00
|
|
|
|
2003-10-16 16:53:04 +00:00
|
|
|
Use::~Use() {
|
|
|
|
if (Val) Val->killUse(*this);
|
|
|
|
}
|
2001-10-01 16:18:37 +00:00
|
|
|
|
2003-10-16 16:53:04 +00:00
|
|
|
void Use::set(Value *V) {
|
|
|
|
if (Val) Val->killUse(*this);
|
|
|
|
Val = V;
|
|
|
|
if (V) V->addUse(*this);
|
|
|
|
}
|
2001-06-06 20:29:01 +00:00
|
|
|
|
2001-10-01 18:26:53 +00:00
|
|
|
|
2002-04-08 21:51:32 +00:00
|
|
|
// isa - Provide some specializations of isa so that we don't have to include
|
|
|
|
// the subtype header files to test to see if the value is a subclass...
|
2001-10-01 18:26:53 +00:00
|
|
|
//
|
2002-06-25 16:12:52 +00:00
|
|
|
template <> inline bool isa_impl<Constant, Value>(const Value &Val) {
|
2004-10-16 18:06:07 +00:00
|
|
|
return Val.getValueType() == Value::SimpleConstantVal ||
|
2004-07-17 23:34:47 +00:00
|
|
|
Val.getValueType() == Value::FunctionVal ||
|
2004-10-16 18:06:07 +00:00
|
|
|
Val.getValueType() == Value::GlobalVariableVal ||
|
|
|
|
Val.getValueType() == Value::ConstantExprVal ||
|
|
|
|
Val.getValueType() == Value::ConstantAggregateZeroVal ||
|
|
|
|
Val.getValueType() == Value::UndefValueVal;
|
2001-10-01 18:26:53 +00:00
|
|
|
}
|
2002-06-25 16:12:52 +00:00
|
|
|
template <> inline bool isa_impl<Argument, Value>(const Value &Val) {
|
|
|
|
return Val.getValueType() == Value::ArgumentVal;
|
2001-10-01 20:11:19 +00:00
|
|
|
}
|
2002-06-25 16:12:52 +00:00
|
|
|
template <> inline bool isa_impl<Instruction, Value>(const Value &Val) {
|
2004-06-27 18:38:24 +00:00
|
|
|
return Val.getValueType() >= Value::InstructionVal;
|
2001-10-01 18:26:53 +00:00
|
|
|
}
|
2002-06-25 16:12:52 +00:00
|
|
|
template <> inline bool isa_impl<BasicBlock, Value>(const Value &Val) {
|
|
|
|
return Val.getValueType() == Value::BasicBlockVal;
|
2001-10-01 20:11:19 +00:00
|
|
|
}
|
2002-06-25 16:12:52 +00:00
|
|
|
template <> inline bool isa_impl<Function, Value>(const Value &Val) {
|
|
|
|
return Val.getValueType() == Value::FunctionVal;
|
2001-10-01 18:26:53 +00:00
|
|
|
}
|
2002-06-25 16:12:52 +00:00
|
|
|
template <> inline bool isa_impl<GlobalVariable, Value>(const Value &Val) {
|
|
|
|
return Val.getValueType() == Value::GlobalVariableVal;
|
2001-10-03 14:53:21 +00:00
|
|
|
}
|
2002-06-25 16:12:52 +00:00
|
|
|
template <> inline bool isa_impl<GlobalValue, Value>(const Value &Val) {
|
2002-03-23 22:51:58 +00:00
|
|
|
return isa<GlobalVariable>(Val) || isa<Function>(Val);
|
2001-10-01 20:11:19 +00:00
|
|
|
}
|
2001-10-01 18:26:53 +00:00
|
|
|
|
2003-11-11 22:41:34 +00:00
|
|
|
} // End llvm namespace
|
|
|
|
|
2001-06-06 20:29:01 +00:00
|
|
|
#endif
|