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; }
static void InitExternalData(NativeModulePtr natMod, llvm::Module *M) { for (auto dr : natMod->getExtDataRefs()) { auto dsize = dr->getDataSize(); auto symname = dr->getSymbolName(); auto extType = llvm::ArrayType::get(llvm::Type::getInt8Ty(M->getContext()), dsize); auto gv = llvm::dyn_cast<llvm::GlobalValue>( M->getOrInsertGlobal(symname, extType)); TASSERT(gv != nullptr, "Could not make global value!"); if (dr->isWeak()) { gv->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); } else { gv->setLinkage(llvm::GlobalValue::ExternalLinkage); } llvm::Triple triple(M->getTargetTriple()); if (llvm::Triple::Win32 == triple.getOS()) { gv->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); } } }