diff --git a/ptx/lib/zluda_ptx_impl.bc b/ptx/lib/zluda_ptx_impl.bc index afc9c2c..0e9b6ef 100644 Binary files a/ptx/lib/zluda_ptx_impl.bc and b/ptx/lib/zluda_ptx_impl.bc differ diff --git a/ptx/lib/zluda_ptx_impl.cpp b/ptx/lib/zluda_ptx_impl.cpp index f247f45..16fab2e 100644 --- a/ptx/lib/zluda_ptx_impl.cpp +++ b/ptx/lib/zluda_ptx_impl.cpp @@ -842,4 +842,14 @@ typedef uint32_t ShflSyncResult __attribute__((ext_vector_type(2))); return output.u32; } + + + + int FUNC(vprintf)(const char *format __attribute__((unused)), void *vlist __attribute__((unused))) + { + // TODO: replace calls to vprintf with a raising pass to printf when we have a mechanism + // to write SSA passes + // Use https://github.com/ROCm/llvm-project/blob/99a81d16b9d811cadd420190bed16981a0a57bc6/llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp#L426 + return -1; + } } diff --git a/ptx/src/pass/llvm/emit.rs b/ptx/src/pass/llvm/emit.rs index 0a68f8b..e94059b 100644 --- a/ptx/src/pass/llvm/emit.rs +++ b/ptx/src/pass/llvm/emit.rs @@ -2853,6 +2853,7 @@ impl<'a> MethodEmitContext<'a> { fn emit_trap(&mut self) -> Result<(), TranslateError> { self.emit_intrinsic(c"llvm.trap", None, None, vec![])?; + unsafe { LLVMBuildUnreachable(self.builder) }; Ok(()) } diff --git a/ptx/src/pass/replace_known_functions.rs b/ptx/src/pass/replace_known_functions.rs index 99509fe..4443275 100644 --- a/ptx/src/pass/replace_known_functions.rs +++ b/ptx/src/pass/replace_known_functions.rs @@ -21,7 +21,7 @@ fn replace_with_ptx_impl<'input>( resolver: &mut GlobalStringIdentResolver2<'input>, fn_name: SpirvWord, ) { - let known_names = ["__assertfail"]; + let known_names = ["__assertfail", "vprintf"]; if let Some(super::IdentEntry { name: Some(name), .. }) = resolver.ident_map.get_mut(&fn_name)