use ptx::TranslateError; use ptx_parser::PtxError; use std::ffi::FromBytesUntilNulError; use std::io; use std::str::Utf8Error; #[derive(Debug, thiserror::Error)] pub enum CompilerError { #[error("HIP error code: {0:?}")] HipError(u32), #[error(transparent)] Libloading(#[from] libloading::Error), #[error(transparent)] ComgrError(#[from] comgr::Error), #[error(transparent)] IoError(#[from] io::Error), #[error(transparent)] Utf8Error(#[from] Utf8Error), #[error(transparent)] FromBytesUntilNulError(#[from] FromBytesUntilNulError), #[error("{message}")] GenericError { #[source] cause: Option>, message: String, }, } impl From>> for CompilerError { fn from(causes: Vec) -> Self { let errors: Vec = causes .iter() .map(|e| { let msg = match e { PtxError::UnrecognizedStatement(value) | PtxError::UnrecognizedDirective(value) => value.to_string(), other => other.to_string(), }; format!("PtxError::{}: {}", e.as_ref(), msg) }) .collect(); let message = errors.join("\n"); CompilerError::GenericError { cause: None, message, } } } impl From for CompilerError { fn from(cause: TranslateError) -> Self { let message = format!("PTX TranslateError::{}", cause.as_ref()); let cause = Some(Box::new(cause) as Box); CompilerError::GenericError { cause, message } } }