Skip to content

Commit e38c366

Browse files
committed
emit metadata tables before the actual sysimage
1 parent 9144dbc commit e38c366

File tree

3 files changed

+27
-9
lines changed

3 files changed

+27
-9
lines changed

src/aotcompile.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,29 @@ void jl_dump_native_impl(void *native_code,
515515
DumpOutput{asm_Archive, asm_fname ? "text.s" : ""},
516516
true, threads);
517517

518+
if (imaging_mode) {
519+
bool has_veccall = false;
520+
if (auto md = dataM->getModuleFlag("julia.mv.veccall")) {
521+
has_veccall = cast<ConstantInt>(cast<ConstantAsMetadata>(md)->getValue())->isOneValue();
522+
}
523+
orc::ThreadSafeModule metadata(std::make_unique<Module>("metadata", Context), TSCtx);
524+
auto metadataM = metadata.getModuleUnlocked();
525+
metadataM->setTargetTriple(dataM->getTargetTriple());
526+
metadataM->setDataLayout(dataM->getDataLayout());
527+
#if JL_LLVM_VERSION >= 130000
528+
metadataM->setStackProtectorGuard(dataM->getStackProtectorGuard());
529+
metadataM->setOverrideStackAlignment(dataM->getOverrideStackAlignment());
530+
#endif
531+
metadataM->addModuleFlag(Module::ModFlagBehavior::Error, "julia.mv.disable", 1);
532+
add_sysimage_targets(*metadataM, has_veccall, threads, data->jl_sysimg_fvars.size(), data->jl_sysimg_gvars.size(), T_pgcstack_getter->getPointerTo());
533+
add_output(*TM, *metadataM, outputs,
534+
DumpOutput{unopt_bc_Archive, "metadata.bc"},
535+
DumpOutput{bc_Archive, "metadata.bc"},
536+
DumpOutput{obj_Archive, "metadata.o"},
537+
DumpOutput{asm_Archive, "metadata.s"},
538+
false, 1);
539+
}
540+
518541
orc::ThreadSafeModule sysimage(std::make_unique<Module>("sysimage", Context), TSCtx);
519542
auto sysimageM = sysimage.getModuleUnlocked();
520543
sysimageM->setTargetTriple(dataM->getTargetTriple());
@@ -523,13 +546,7 @@ void jl_dump_native_impl(void *native_code,
523546
sysimageM->setStackProtectorGuard(dataM->getStackProtectorGuard());
524547
sysimageM->setOverrideStackAlignment(dataM->getOverrideStackAlignment());
525548
#endif
526-
if (imaging_mode) {
527-
bool has_veccall = false;
528-
if (auto md = dataM->getModuleFlag("julia.mv.veccall")) {
529-
has_veccall = cast<ConstantInt>(cast<ConstantAsMetadata>(md)->getValue())->isOneValue();
530-
}
531-
add_sysimage_targets(*sysimageM, has_veccall, threads, data->jl_sysimg_fvars.size(), data->jl_sysimg_gvars.size(), T_pgcstack_getter->getPointerTo());
532-
}
549+
sysimageM->addModuleFlag(Module::ModFlagBehavior::Error, "julia.mv.disable", 1);
533550
data->M = orc::ThreadSafeModule(); // free memory for data->M
534551

535552
if (sysimg_data) {

src/llvm-multiversioning.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -978,7 +978,8 @@ static bool runMultiVersioning(Module &M, bool allow_bad_fvars)
978978
// * Cloned function -> Original function (add as we clone functions)
979979
// * Original function -> Base function (target specific and updated by LLVM)
980980
// * ID -> relocation slots (const).
981-
if (M.getName() == "sysimage")
981+
auto disable_mv = M.getModuleFlag("julia.mv.disable");
982+
if (disable_mv && !cast<ConstantInt>(cast<ConstantAsMetadata>(disable_mv)->getValue())->isZero())
982983
return false;
983984

984985
GlobalVariable *fvars = M.getGlobalVariable("jl_sysimg_fvars");

src/sysimg.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1091,7 +1091,7 @@ unsigned compute_image_thread_count(Module &M) {
10911091
unsigned max_threads = std::max(available / (weight * fudge), (size_t)1);
10921092
dbgs() << "Weight: " << weight << ", available: " << available << ", wanted: " << threads << ", max threads: " << max_threads << "\n";
10931093
threads = std::min(threads, max_threads);
1094-
1094+
10951095
// environment variable override
10961096
const char *env_threads = getenv("JULIA_IMAGE_THREADS");
10971097
if (env_threads) {

0 commit comments

Comments
 (0)