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 d42195d7e9..24ff706711 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. 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 99761b146d..0311f458b0 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 2c49bd9f49..f170eec367 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(), } }