LLConstant *IRState::setGlobalVarInitializer(LLGlobalVariable *&globalVar, LLConstant *initializer) { if (initializer->getType() == globalVar->getType()->getContainedType(0)) { globalVar->setInitializer(initializer); return globalVar; } // Create the global helper variable matching the initializer type. // It inherits most properties from the existing globalVar. auto globalHelperVar = new LLGlobalVariable( module, initializer->getType(), globalVar->isConstant(), globalVar->getLinkage(), initializer, "", nullptr, globalVar->getThreadLocalMode()); globalHelperVar->setAlignment(globalVar->getAlignment()); globalHelperVar->setComdat(globalVar->getComdat()); globalHelperVar->setDLLStorageClass(globalVar->getDLLStorageClass()); globalHelperVar->setSection(globalVar->getSection()); globalHelperVar->takeName(globalVar); // Replace all existing uses of globalVar by the bitcast pointer. auto castHelperVar = DtoBitCast(globalHelperVar, globalVar->getType()); globalVar->replaceAllUsesWith(castHelperVar); // Register replacement for later occurrences of the original globalVar. globalsToReplace.emplace_back(globalVar, castHelperVar); // Reset globalVar to the helper variable. globalVar = globalHelperVar; return castHelperVar; }
VarRefNewObjectNode* VarRefNode::globalMakeNewCall(AbstractQoreNode* args) { assert(type == VT_GLOBAL); if (ref.var->hasTypeInfo()) { QoreParseTypeInfo* pti = ref.var->copyParseTypeInfo(); VarRefNewObjectNode* rv = new VarRefNewObjectNode(takeName(), ref.var, make_args(args), pti ? 0 : ref.var->getTypeInfo(), pti); deref(); return rv; } return 0; }
// for checking for new object calls AbstractQoreNode* VarRefDeclNode::makeNewCall(AbstractQoreNode* args) { VarRefNewObjectNode* rv = new VarRefNewObjectNode(loc, takeName(), typeInfo, takeParseTypeInfo(), make_args(args), type); deref(); return rv; }