#include "llvm/GlobalValue.h"
#include "llvm/OperandTraits.h"
+#include "llvm/ADT/ilist_node.h"
namespace llvm {
class Module;
class Constant;
-class PointerType;
+class LLVMContext;
template<typename ValueSubClass, typename ItemParentClass>
class SymbolTableListTraits;
-class GlobalVariable : public GlobalValue {
+class GlobalVariable : public GlobalValue, public ilist_node<GlobalVariable> {
friend class SymbolTableListTraits<GlobalVariable, Module>;
void *operator new(size_t, unsigned); // Do not implement
void operator=(const GlobalVariable &); // Do not implement
void setParent(Module *parent);
- GlobalVariable *Prev, *Next;
- void setNext(GlobalVariable *N) { Next = N; }
- void setPrev(GlobalVariable *N) { Prev = N; }
-
bool isConstantGlobal : 1; // Is this a global constant?
bool isThreadLocalSymbol : 1; // Is this symbol "Thread Local"?
}
/// GlobalVariable ctor - If a parent module is specified, the global is
/// automatically inserted into the end of the specified modules global list.
- GlobalVariable(const Type *Ty, bool isConstant, LinkageTypes Linkage,
+ GlobalVariable(LLVMContext &Context, const Type *Ty, bool isConstant,
+ LinkageTypes Linkage,
Constant *Initializer = 0, const std::string &Name = "",
- Module *Parent = 0, bool ThreadLocal = false,
- unsigned AddressSpace = 0);
+ bool ThreadLocal = false, unsigned AddressSpace = 0);
/// GlobalVariable ctor - This creates a global and inserts it before the
/// specified other global.
- GlobalVariable(const Type *Ty, bool isConstant, LinkageTypes Linkage,
- Constant *Initializer, const std::string &Name,
- GlobalVariable *InsertBefore, bool ThreadLocal = false,
+ GlobalVariable(Module &M, const Type *Ty, bool isConstant,
+ LinkageTypes Linkage, Constant *Initializer,
+ const std::string &Name,
+ GlobalVariable *InsertBefore = 0, bool ThreadLocal = false,
unsigned AddressSpace = 0);
~GlobalVariable() {
///
inline bool hasInitializer() const { return !isDeclaration(); }
+ /// hasDefinitiveInitializer - Whether the global variable has an initializer,
+ /// and this is the initializer that will be used in the final executable.
+ inline bool hasDefinitiveInitializer() const {
+ return hasInitializer() &&
+ // The initializer of a global variable with weak linkage may change at
+ // link time.
+ !mayBeOverridden();
+ }
+
/// getInitializer - Return the initializer for this global variable. It is
/// illegal to call this method if the global is external, because we cannot
/// tell what the value is initialized to!
/// removeFromParent - This method unlinks 'this' from the containing module,
/// but does not delete it.
///
- void removeFromParent();
+ virtual void removeFromParent();
/// eraseFromParent - This method unlinks 'this' from the containing module
/// and deletes it.
///
- void eraseFromParent();
+ virtual void eraseFromParent();
/// Override Constant's implementation of this method so we can
/// replace constant initializers.
virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U);
- virtual void print(std::ostream &OS) const;
- void print(std::ostream *OS) const { if (OS) print(*OS); }
-
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const GlobalVariable *) { return true; }
static inline bool classof(const Value *V) {
return V->getValueID() == Value::GlobalVariableVal;
}
-private:
- // getNext/Prev - Return the next or previous global variable in the list.
- GlobalVariable *getNext() { return Next; }
- const GlobalVariable *getNext() const { return Next; }
- GlobalVariable *getPrev() { return Prev; }
- const GlobalVariable *getPrev() const { return Prev; }
};
template <>