authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-16 17:22:16-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-16 17:22:16-07:00
logd78b8c10b9b33a5b1a21e9fa981576fd408939e5
tree528070479356f957d06b521ba5c8afdc0de3b9c4
parent942f8d07d152eb0420419c89b5c9a3110151b873

LLVM: fix slice debug info and functions

with return types that have no runtime bits

1 files changed, 21 insertions(+), 14 deletions(-)

src/codegen/llvm.zig+21-14
...@@ -974,7 +974,7 @@ pub const Object = struct {...@@ -974,7 +974,7 @@ pub const Object = struct {
974 const bland_ptr_ty = Type.initPayload(&payload.base);974 const bland_ptr_ty = Type.initPayload(&payload.base);
975 const ptr_di_ty = try o.lowerDebugType(bland_ptr_ty, resolve);975 const ptr_di_ty = try o.lowerDebugType(bland_ptr_ty, resolve);
976 // The recursive call to `lowerDebugType` means we can't use `gop` anymore.976 // The recursive call to `lowerDebugType` means we can't use `gop` anymore.
977 try o.di_type_map.put(gpa, ty, AnnotatedDITypePtr.initFull(ptr_di_ty));977 try o.di_type_map.put(gpa, ty, AnnotatedDITypePtr.init(ptr_di_ty, resolve));
978 return ptr_di_ty;978 return ptr_di_ty;
979 }979 }
980980
...@@ -1560,25 +1560,26 @@ pub const Object = struct {...@@ -1560,25 +1560,26 @@ pub const Object = struct {
1560 },1560 },
1561 .Fn => {1561 .Fn => {
1562 const fn_info = ty.fnInfo();1562 const fn_info = ty.fnInfo();
1563 const sret = firstParamSRet(fn_info, target);
15641563
1565 var param_di_types = std.ArrayList(*llvm.DIType).init(gpa);1564 var param_di_types = std.ArrayList(*llvm.DIType).init(gpa);
1566 defer param_di_types.deinit();1565 defer param_di_types.deinit();
15671566
1568 // Return type goes first.1567 // Return type goes first.
1569 const di_ret_ty = if (sret or !fn_info.return_type.hasRuntimeBitsIgnoreComptime())1568 if (fn_info.return_type.hasRuntimeBitsIgnoreComptime()) {
1570 Type.void1569 const sret = firstParamSRet(fn_info, target);
1571 else1570 const di_ret_ty = if (sret) Type.void else fn_info.return_type;
1572 fn_info.return_type;1571 try param_di_types.append(try o.lowerDebugType(di_ret_ty, .full));
1573 try param_di_types.append(try o.lowerDebugType(di_ret_ty, .full));
15741572
1575 if (sret) {1573 if (sret) {
1576 var ptr_ty_payload: Type.Payload.ElemType = .{1574 var ptr_ty_payload: Type.Payload.ElemType = .{
1577 .base = .{ .tag = .single_mut_pointer },1575 .base = .{ .tag = .single_mut_pointer },
1578 .data = fn_info.return_type,1576 .data = fn_info.return_type,
1579 };1577 };
1580 const ptr_ty = Type.initPayload(&ptr_ty_payload.base);1578 const ptr_ty = Type.initPayload(&ptr_ty_payload.base);
1581 try param_di_types.append(try o.lowerDebugType(ptr_ty, .full));1579 try param_di_types.append(try o.lowerDebugType(ptr_ty, .full));
1580 }
1581 } else {
1582 try param_di_types.append(try o.lowerDebugType(Type.void, .full));
1582 }1583 }
15831584
1584 for (fn_info.param_types) |param_ty| {1585 for (fn_info.param_types) |param_ty| {
...@@ -7343,6 +7344,12 @@ const AnnotatedDITypePtr = enum(usize) {...@@ -7343,6 +7344,12 @@ const AnnotatedDITypePtr = enum(usize) {
7343 return @intToEnum(AnnotatedDITypePtr, addr);7344 return @intToEnum(AnnotatedDITypePtr, addr);
7344 }7345 }
73457346
7347 fn init(di_type: *llvm.DIType, resolve: Object.DebugResolveStatus) AnnotatedDITypePtr {
7348 const addr = @ptrToInt(di_type);
7349 const bit = @boolToInt(resolve == .fwd);
7350 return @intToEnum(AnnotatedDITypePtr, addr | bit);
7351 }
7352
7346 fn toDIType(self: AnnotatedDITypePtr) *llvm.DIType {7353 fn toDIType(self: AnnotatedDITypePtr) *llvm.DIType {
7347 const fixed_addr = @enumToInt(self) & ~@as(usize, 1);7354 const fixed_addr = @enumToInt(self) & ~@as(usize, 1);
7348 return @intToPtr(*llvm.DIType, fixed_addr);7355 return @intToPtr(*llvm.DIType, fixed_addr);