Index: llvm/lib/IR/Globals.cpp =================================================================== --- llvm/lib/IR/Globals.cpp +++ llvm/lib/IR/Globals.cpp @@ -359,6 +359,21 @@ getParent()->getGlobalList().erase(getIterator()); } +static void assertThatAllGlobalsAreIn(Constant *Value, Module *Correct) { + if(ConstantStruct *V = dyn_cast(Value)) { + int n = V->getNumOperands(); + while(n) + assertThatAllGlobalsAreIn(V->getOperand(--n), Correct); + } else if(ConstantArray *V = dyn_cast(Value)) { + int n = V->getType()->getNumElements(); + while(n) + assertThatAllGlobalsAreIn(V->getAggregateElement(--n), Correct); + } else if(GlobalValue *V = dyn_cast(Value)) { + assert((!V->getParent() || V->getParent() == Correct) && + "A Constant and its initializer cannot be in different modules"); + } +} + void GlobalVariable::setInitializer(Constant *InitVal) { if (!InitVal) { if (hasInitializer()) { @@ -377,6 +392,7 @@ if (!hasInitializer()) setGlobalVariableNumOperands(1); Op<0>().set(InitVal); + assertThatAllGlobalsAreIn(InitVal, getParent()); } }