adding proper error handling for offload
This commit is contained in:
parent
dfef2e96fe
commit
3fdc6da2aa
3 changed files with 35 additions and 12 deletions
|
|
@ -19,7 +19,12 @@ codegen_llvm_lto_bitcode_from_rlib = failed to get bitcode from object file for
|
|||
codegen_llvm_mismatch_data_layout =
|
||||
data-layout for target `{$rustc_target}`, `{$rustc_layout}`, differs from LLVM target's `{$llvm_target}` default layout, `{$llvm_layout}`
|
||||
|
||||
codegen_llvm_offload_without_enable = using the offload feature requires -Z offload=Enable
|
||||
codegen_llvm_offload_bundleimages_failed = call to BundleImages failed, `host.out` was not created
|
||||
codegen_llvm_offload_embed_failed = call to EmbedBufferInModule failed, `host.o` was not created
|
||||
codegen_llvm_offload_no_abs_path = using the `-Z offload=Host=/absolute/path/to/host.out` flag requires an absolute path
|
||||
codegen_llvm_offload_no_host_out = using the `-Z offload=Host=/absolute/path/to/host.out` flag must point to a `host.out` file
|
||||
codegen_llvm_offload_nonexisting = the given path/file to `host.out` does not exist. Did you forget to run the device compilation first?
|
||||
codegen_llvm_offload_without_enable = using the offload feature requires -Z offload=<Device or Host=/absolute/path/to/host.out>
|
||||
codegen_llvm_offload_without_fat_lto = using the offload feature requires -C lto=fat
|
||||
|
||||
codegen_llvm_parse_bitcode = failed to parse bitcode for LTO module
|
||||
|
|
|
|||
|
|
@ -786,9 +786,8 @@ pub(crate) unsafe fn llvm_optimize(
|
|||
module.module_llvm.tm.raw(),
|
||||
device_out_c.as_ptr(),
|
||||
);
|
||||
assert!(ok, "LLVMRustBundleImages (device -> host.out) failed");
|
||||
if !device_out.exists() {
|
||||
panic!("BundleImages failed, `host.out` was not created!");
|
||||
if !ok || !device_out.exists() {
|
||||
dcx.emit_err(crate::errors::OffloadBundleImagesFailed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -806,15 +805,16 @@ pub(crate) unsafe fn llvm_optimize(
|
|||
{
|
||||
let device_pathbuf = PathBuf::from(device_path);
|
||||
if device_pathbuf.is_relative() {
|
||||
panic!("Absolute path is needed");
|
||||
dcx.emit_err(crate::errors::OffloadWithoutAbsPath);
|
||||
} else if device_pathbuf
|
||||
.file_name()
|
||||
.and_then(|n| n.to_str())
|
||||
.is_some_and(|n| n != "host.out")
|
||||
{
|
||||
panic!("Need path to the host.out file");
|
||||
dcx.emit_err(crate::errors::OffloadWrongFileName);
|
||||
} else if !device_pathbuf.exists() {
|
||||
dcx.emit_err(crate::errors::OffloadNonexistingPath);
|
||||
}
|
||||
assert!(device_pathbuf.exists());
|
||||
let host_path = cgcx.output_filenames.path(OutputType::Object);
|
||||
let host_dir = host_path.parent().unwrap();
|
||||
let out_obj = host_dir.join("host.o");
|
||||
|
|
@ -826,7 +826,9 @@ pub(crate) unsafe fn llvm_optimize(
|
|||
let llmod2 = llvm::LLVMCloneModule(module.module_llvm.llmod());
|
||||
let ok =
|
||||
unsafe { llvm::LLVMRustOffloadEmbedBufferInModule(llmod2, host_out_c.as_ptr()) };
|
||||
assert!(ok, "LLVMRustOffloadEmbedBufferInModule failed");
|
||||
if !ok {
|
||||
dcx.emit_err(crate::errors::OffloadEmbedFailed);
|
||||
}
|
||||
write_output_file(
|
||||
dcx,
|
||||
module.module_llvm.tm.raw(),
|
||||
|
|
@ -838,10 +840,6 @@ pub(crate) unsafe fn llvm_optimize(
|
|||
&cgcx.prof,
|
||||
true,
|
||||
);
|
||||
if !out_obj.exists() {
|
||||
dbg!("{:?} does not exist!", out_obj);
|
||||
panic!("FinalizeOffload failed!");
|
||||
}
|
||||
// We ignore cgcx.save_temps here and unconditionally always keep our `host.out` artifact.
|
||||
// Otherwise, recompiling the host code would fail since we deleted that device artifact
|
||||
// in the previous host compilation, which would be confusing at best.
|
||||
|
|
|
|||
|
|
@ -52,6 +52,26 @@ pub(crate) struct OffloadWithoutEnable;
|
|||
#[diag(codegen_llvm_offload_without_fat_lto)]
|
||||
pub(crate) struct OffloadWithoutFatLTO;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_offload_no_abs_path)]
|
||||
pub(crate) struct OffloadWithoutAbsPath;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_offload_no_host_out)]
|
||||
pub(crate) struct OffloadWrongFileName;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_offload_nonexisting)]
|
||||
pub(crate) struct OffloadNonexistingPath;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_offload_bundleimages_failed)]
|
||||
pub(crate) struct OffloadBundleImagesFailed;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_offload_embed_failed)]
|
||||
pub(crate) struct OffloadEmbedFailed;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(codegen_llvm_lto_bitcode_from_rlib)]
|
||||
pub(crate) struct LtoBitcodeFromRlib {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue