From 13c0624f23bbf63b31ae9b8f06aa2e32c1616e94 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sat, 1 Jul 2023 20:25:25 +0200 Subject: [PATCH 1/2] llvm: cast optional null ptr representation to generic address space The panic handler expects that this value is represented with the generic address space, so cast the global to the generic address- space before caching and returning the value. --- src/codegen/llvm.zig | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index d42195d7e9e627382cd8c8c0372f22a3ed1223b0..24ff7067111dfbb7af090a5ec923be085ca45367 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -2435,18 +2435,25 @@ pub const Object = struct { .ty = ty.toType(), .val = null_opt_usize.toValue(), }); + const llvm_wanted_addrspace = toLlvmAddressSpace(.generic, target); + const llvm_actual_addrspace = toLlvmGlobalAddressSpace(.generic, target); const global = o.llvm_module.addGlobalInAddressSpace( llvm_init.typeOf(), "", - toLlvmGlobalAddressSpace(.generic, target), + llvm_actual_addrspace, ); global.setLinkage(.Internal); global.setUnnamedAddr(.True); global.setAlignment(ty.toType().abiAlignment(mod)); global.setInitializer(llvm_init); - o.null_opt_addr = global; - return global; + const addrspace_casted_global = if (llvm_wanted_addrspace != llvm_actual_addrspace) + global.constAddrSpaceCast(o.context.pointerType(llvm_wanted_addrspace)) + else + global; + + o.null_opt_addr = addrspace_casted_global; + return addrspace_casted_global; } /// If the llvm function does not exist, create it. -- 2.54.0 From a1b583dc24cde495656b288de979714dfc15c4a2 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sat, 1 Jul 2023 21:23:45 +0200 Subject: [PATCH 2/2] std: make panic and abort for amdhsa call trap --- lib/std/builtin.zig | 2 +- lib/std/os.zig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index 99761b146ddcb02e19861c9eb8092f981d014c1c..0311f458b07feace4ab469e4234fd7abec78a079 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -806,7 +806,7 @@ pub fn default_panic(msg: []const u8, error_return_trace: ?*StackTrace, ret_addr // Didn't have boot_services, just fallback to whatever. std.os.abort(); }, - .cuda => std.os.abort(), + .cuda, .amdhsa => std.os.abort(), else => { const first_trace_addr = ret_addr orelse @returnAddress(); std.debug.panicImpl(error_return_trace, first_trace_addr, msg); diff --git a/lib/std/os.zig b/lib/std/os.zig index 2c49bd9f499f27a4410438cc2b90db947e6d4923..f170eec3671ed9441e1ba450a2cc7e0c5745041f 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -613,7 +613,7 @@ pub fn abort() noreturn { exit(127); // Pid 1 might not be signalled in some containers. } switch (builtin.os.tag) { - .uefi, .wasi, .cuda => @trap(), + .uefi, .wasi, .cuda, .amdhsa => @trap(), else => system.abort(), } } -- 2.54.0