- GlobalVariable(const Type *Ty, bool isConstant, bool isInternal,
- ConstPoolVal *Initializer = 0, const string &Name = "");
- ~GlobalVariable() {}
-
- // Specialize setName to handle symbol table majik...
- virtual void setName(const string &name, SymbolTable *ST = 0);
-
- // The initializer for the global variable/constant is held by Operands[0] if
- // an initializer is specified.
- //
- inline bool hasInitializer() const { return !Operands.empty(); }
- inline ConstPoolVal *getInitializer() const {
- assert(hasInitializer() && "GV doesn't have initializer!");
- return (ConstPoolVal*)Operands[0].get();
+ // allocate space for exactly one operand
+ void *operator new(size_t s) {
+ return User::operator new(s, 1);
+ }
+ /// 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,
+ Constant *Initializer = 0, const Twine &Name = "",
+ bool ThreadLocal = false, unsigned AddressSpace = 0);
+ /// GlobalVariable ctor - This creates a global and inserts it before the
+ /// specified other global.
+ GlobalVariable(Module &M, const Type *Ty, bool isConstant,
+ LinkageTypes Linkage, Constant *Initializer,
+ const Twine &Name,
+ GlobalVariable *InsertBefore = 0, bool ThreadLocal = false,
+ unsigned AddressSpace = 0);
+
+ ~GlobalVariable() {
+ NumOperands = 1; // FIXME: needed by operator delete
+ }
+
+ /// Provide fast operand accessors
+ DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
+
+ /// isDeclaration - Is this global variable lacking an initializer? If so,
+ /// the global variable is defined in some other translation unit, and is thus
+ /// only a declaration here.
+ virtual bool isDeclaration() const { return getNumOperands() == 0; }
+
+ /// hasInitializer - Unless a global variable isExternal(), it has an
+ /// initializer. The initializer for the global variable/constant is held by
+ /// Initializer if an initializer is specified.
+ ///
+ 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();