From 5dd3d17c201f83b853fa1f1bf5e459fb1582c3cf Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sat, 6 Aug 2022 18:22:30 +0200 Subject: amdgpu: add amdhsa/amdpal ctype abi sizes --- src/type.zig | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src/type.zig') diff --git a/src/type.zig b/src/type.zig index ea2b6c30c2..5ac9726727 100644 --- a/src/type.zig +++ b/src/type.zig @@ -6728,6 +6728,13 @@ pub const CType = enum { }, }, + .amdhsa, .amdpal => switch (self) { + .short, .ushort => return 16, + .int, .uint => return 32, + .long, .ulong, .longlong, .ulonglong => return 64, + .longdouble => return 128, + }, + .cloudabi, .kfreebsd, .lv2, @@ -6737,13 +6744,11 @@ pub const CType = enum { .aix, .cuda, .nvcl, - .amdhsa, .ps4, .ps5, .elfiamcu, .mesa3d, .contiki, - .amdpal, .hermit, .hurd, .opencl, -- cgit v1.2.3 From ad747739594805546e0d52d112dfd4a75978c8c7 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sat, 24 Sep 2022 16:16:52 +0200 Subject: make addrSpaceCast work with optionals; forbid ptrCast'ing address spaces --- src/Sema.zig | 24 +++++++++++------------- src/type.zig | 6 ++++++ 2 files changed, 17 insertions(+), 13 deletions(-) (limited to 'src/type.zig') diff --git a/src/Sema.zig b/src/Sema.zig index d597075df2..c81d267bcd 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -18181,11 +18181,10 @@ fn zirAddrSpaceCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst const ptr = try sema.resolveInst(extra.rhs); const ptr_ty = sema.typeOf(ptr); - // TODO in addition to pointers, this instruction is supposed to work for - // pointer-like optionals and slices. try sema.checkPtrOperand(block, ptr_src, ptr_ty); - const src_addrspace = ptr_ty.ptrAddressSpace(); + var ptr_info = ptr_ty.ptrInfo().data; + const src_addrspace = ptr_info.@"addrspace"; if (!target_util.addrSpaceCastIsValid(sema.mod.getTarget(), src_addrspace, dest_addrspace)) { const msg = msg: { const msg = try sema.errMsg(block, src, "invalid address space cast", .{}); @@ -18196,16 +18195,12 @@ fn zirAddrSpaceCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst return sema.failWithOwnedErrorMsg(msg); } - const ptr_info = ptr_ty.ptrInfo().data; - const dest_ty = try Type.ptr(sema.arena, sema.mod, .{ - .pointee_type = ptr_info.pointee_type, - .@"align" = ptr_info.@"align", - .@"addrspace" = dest_addrspace, - .mutable = ptr_info.mutable, - .@"allowzero" = ptr_info.@"allowzero", - .@"volatile" = ptr_info.@"volatile", - .size = ptr_info.size, - }); + ptr_info.@"addrspace" = dest_addrspace; + const dest_ptr_ty = try Type.ptr(sema.arena, sema.mod, ptr_info); + const dest_ty = if (ptr_ty.zigTypeTag() == .Optional) + try Type.optional(sema.arena, dest_ptr_ty) + else + dest_ptr_ty; if (try sema.resolveMaybeUndefVal(block, ptr_src, ptr)) |val| { // Pointer value should compatible with both address spaces. @@ -18472,6 +18467,9 @@ fn zirPtrCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air if (operand_info.@"volatile" and !dest_info.@"volatile") { return sema.fail(block, src, "cast discards volatile qualifier", .{}); } + if (operand_info.@"addrspace" != dest_info.@"addrspace") { + return sema.fail(block, src, "cast changes pointer address space", .{}); + } const dest_is_slice = dest_ty.isSlice(); const operand_is_slice = operand_ty.isSlice(); diff --git a/src/type.zig b/src/type.zig index 5ac9726727..c1c8054e26 100644 --- a/src/type.zig +++ b/src/type.zig @@ -2786,6 +2786,12 @@ pub const Type = extern union { .pointer => self.castTag(.pointer).?.data.@"addrspace", + .optional => { + var buf: Payload.ElemType = undefined; + const child_type = self.optionalChild(&buf); + return child_type.ptrAddressSpace(); + }, + else => unreachable, }; } -- cgit v1.2.3