diff options
author | Chris Lattner <sabre@nondot.org> | 2006-09-30 21:31:26 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-09-30 21:31:26 +0000 |
commit | adc95467e41d6c46793f665168468cbf348c3638 (patch) | |
tree | 8093c9dc84df3e6f62cdfb4e24e9cf0632e07d42 | |
parent | cff1673182b239a8b8a53ac68fc48fe93161357e (diff) | |
download | llvm-adc95467e41d6c46793f665168468cbf348c3638.tar.gz llvm-adc95467e41d6c46793f665168468cbf348c3638.tar.bz2 llvm-adc95467e41d6c46793f665168468cbf348c3638.tar.xz |
Add a version of the globalvariable ctor that inserts at a specific location.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30677 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/GlobalVariable.h | 8 | ||||
-rw-r--r-- | lib/VMCore/Globals.cpp | 21 |
2 files changed, 27 insertions, 2 deletions
diff --git a/include/llvm/GlobalVariable.h b/include/llvm/GlobalVariable.h index 87df5d514f..0679e38bb3 100644 --- a/include/llvm/GlobalVariable.h +++ b/include/llvm/GlobalVariable.h @@ -49,11 +49,15 @@ class GlobalVariable : public GlobalValue { public: /// 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 std::string &Name = "", Module *Parent = 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); + /// isExternal - Is this global variable lacking an initializer? If so, the /// global variable is defined in some other translation unit, and is thus /// externally defined here. diff --git a/lib/VMCore/Globals.cpp b/lib/VMCore/Globals.cpp index 3ea8265eba..e49f47766f 100644 --- a/lib/VMCore/Globals.cpp +++ b/lib/VMCore/Globals.cpp @@ -91,6 +91,27 @@ GlobalVariable::GlobalVariable(const Type *Ty, bool constant, LinkageTypes Link, ParentModule->getGlobalList().push_back(this); } +GlobalVariable::GlobalVariable(const Type *Ty, bool constant, LinkageTypes Link, + Constant *InitVal, + const std::string &Name, GlobalVariable *Before) + : GlobalValue(PointerType::get(Ty), Value::GlobalVariableVal, + &Initializer, InitVal != 0, Link, Name), + isConstantGlobal(constant) { + if (InitVal) { + assert(InitVal->getType() == Ty && + "Initializer should be the same type as the GlobalVariable!"); + Initializer.init(InitVal, this); + } else { + Initializer.init(0, this); + } + + LeakDetector::addGarbageObject(this); + + if (Before) + Before->getParent()->getGlobalList().insert(Before, this); +} + + void GlobalVariable::setParent(Module *parent) { if (getParent()) LeakDetector::addGarbageObject(this); |