diff --git a/src/cgutils.cpp b/src/cgutils.cpp index 0af7327e48ee3..fcb4befbe23fa 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -357,34 +357,29 @@ extern "C" { } #endif -static void jl_gen_llvm_gv_array(llvm::Module *mod, SmallVector &globalvars) +static void jl_gen_llvm_gv_array(llvm::Module *mod) { - // emit the variable table into the code image. used just before dumping bitcode. - // afterwards, call eraseFromParent on everything in globalvars to reset code generator. ArrayType *atype = ArrayType::get(T_psize,jl_sysimg_gvars.size()); - globalvars.push_back(addComdat(new GlobalVariable( - *mod, - atype, - true, - GlobalVariable::ExternalLinkage, - ConstantArray::get(atype, ArrayRef(jl_sysimg_gvars)), - "jl_sysimg_gvars"))); - globalvars.push_back(addComdat(new GlobalVariable( - *mod, - T_size, - true, - GlobalVariable::ExternalLinkage, - ConstantInt::get(T_size,globalUnique+1), - "jl_globalUnique"))); + addComdat(new GlobalVariable(*mod, + atype, + true, + GlobalVariable::ExternalLinkage, + ConstantArray::get(atype, ArrayRef(jl_sysimg_gvars)), + "jl_sysimg_gvars")); + addComdat(new GlobalVariable(*mod, + T_size, + true, + GlobalVariable::ExternalLinkage, + ConstantInt::get(T_size,globalUnique+1), + "jl_globalUnique")); Constant *feature_string = ConstantDataArray::getString(jl_LLVMContext, jl_options.cpu_target); - globalvars.push_back(addComdat(new GlobalVariable( - *mod, - feature_string->getType(), - true, - GlobalVariable::ExternalLinkage, - feature_string, - "jl_sysimg_cpu_target"))); + addComdat(new GlobalVariable(*mod, + feature_string->getType(), + true, + GlobalVariable::ExternalLinkage, + feature_string, + "jl_sysimg_cpu_target")); #ifdef HAVE_CPUID // For native also store the cpuid @@ -392,28 +387,26 @@ static void jl_gen_llvm_gv_array(llvm::Module *mod, SmallVector &globalvars, - const char *sysimg_data, size_t sysimg_len) +static void jl_sysimg_to_llvm(llvm::Module *mod, const char *sysimg_data, size_t sysimg_len) { Constant *data = ConstantDataArray::get(jl_LLVMContext, ArrayRef((const unsigned char*)sysimg_data, sysimg_len)); - globalvars.push_back(addComdat(new GlobalVariable(*mod, data->getType(), true, - GlobalVariable::ExternalLinkage, - data, "jl_system_image_data"))); + addComdat(new GlobalVariable(*mod, data->getType(), true, + GlobalVariable::ExternalLinkage, + data, "jl_system_image_data")); Constant *len = ConstantInt::get(T_size, sysimg_len); - globalvars.push_back(addComdat(new GlobalVariable(*mod, len->getType(), true, - GlobalVariable::ExternalLinkage, - len, "jl_system_image_size"))); + addComdat(new GlobalVariable(*mod, len->getType(), true, + GlobalVariable::ExternalLinkage, + len, "jl_system_image_size")); } static int32_t jl_assign_functionID(Function *functionObject) diff --git a/src/codegen.cpp b/src/codegen.cpp index 2d56639299255..5605542e9fcd3 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -396,9 +396,8 @@ struct jl_varinfo_t { }; // --- helpers for reloading IR image -static void jl_gen_llvm_gv_array(llvm::Module *mod, SmallVector &globalvars); -static void jl_sysimg_to_llvm(llvm::Module *mod, SmallVector &globalvars, - const char *sysimg_data, size_t sysimg_len); +static void jl_gen_llvm_gv_array(llvm::Module *mod); +static void jl_sysimg_to_llvm(llvm::Module *mod, const char *sysimg_data, size_t sysimg_len); extern "C" void jl_dump_bitcode(char *fname) @@ -414,17 +413,15 @@ void jl_dump_bitcode(char *fname) std::string err; raw_fd_ostream OS(fname, err); #endif - SmallVector globalvars; #ifdef USE_MCJIT - jl_gen_llvm_gv_array(shadow_module, globalvars); - WriteBitcodeToFile(shadow_module, OS); + Module *bitcode = CloneModule(shadow_module); + jl_gen_llvm_gv_array(bitcode); + WriteBitcodeToFile(bitcode, OS); #else - jl_gen_llvm_gv_array(jl_Module, globalvars); - WriteBitcodeToFile(jl_Module, OS); + Module *bitcode = CloneModule(jl_Module); + jl_gen_llvm_gv_array(bitcode, globalvars); + WriteBitcodeToFile(bitcode, OS); #endif - for (SmallVectorImpl::iterator *I = globalvars.begin(), *E = globalvars.end(); I != E; ++I) { - (*I)->eraseFromParent(); - } } extern "C" @@ -505,26 +502,24 @@ void jl_dump_objfile(char *fname, int jit_model, const char *sysimg_data, size_t jl_error("Could not generate obj file for this target"); } - SmallVector globalvars; #ifdef USE_MCJIT + Module *objfile = CloneModule(shadow_module); if (sysimg_data) - jl_sysimg_to_llvm(shadow_module, globalvars, sysimg_data, sysimg_len); - jl_gen_llvm_gv_array(shadow_module, globalvars); + jl_sysimg_to_llvm(objfile, sysimg_data, sysimg_len); + jl_gen_llvm_gv_array(objfile); // Reset the target triple to make sure it matches the new target machine #ifdef LLVM37 - shadow_module->setTargetTriple(TM->getTargetTriple().str()); - shadow_module->setDataLayout(TM->getDataLayout()->getStringRepresentation()); + objfile->setTargetTriple(TM->getTargetTriple().str()); + objfile->setDataLayout(TM->getDataLayout()->getStringRepresentation()); #endif - PM.run(*shadow_module); + PM.run(*objfile); #else + Module *objfile = CloneModule(jl_Module); if (sysimg_data) - jl_sysimg_to_llvm(jl_Module, globalvars, sysimg_data, sysimg_len); - jl_gen_llvm_gv_array(jl_Module, globalvars); - PM.run(*jl_Module); + jl_sysimg_to_llvm(objfile, sysimg_data, sysimg_len); + jl_gen_llvm_gv_array(objfile); + PM.run(*objfile); #endif - for (SmallVectorImpl::iterator *I = globalvars.begin(), *E = globalvars.end(); I != E; ++I) { - (*I)->eraseFromParent(); - } } // aggregate of array metadata