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 {
974974 const bland_ptr_ty = Type.initPayload(&payload.base);
975975 const ptr_di_ty = try o.lowerDebugType(bland_ptr_ty, resolve);
976976 // 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));
978978 return ptr_di_ty;
979979 }
980980
......@@ -1560,25 +1560,26 @@ pub const Object = struct {
15601560 },
15611561 .Fn => {
15621562 const fn_info = ty.fnInfo();
1563 const sret = firstParamSRet(fn_info, target);
15641563
15651564 var param_di_types = std.ArrayList(*llvm.DIType).init(gpa);
15661565 defer param_di_types.deinit();
15671566
15681567 // Return type goes first.
1569 const di_ret_ty = if (sret or !fn_info.return_type.hasRuntimeBitsIgnoreComptime())
1570 Type.void
1571 else
1572 fn_info.return_type;
1573 try param_di_types.append(try o.lowerDebugType(di_ret_ty, .full));
1568 if (fn_info.return_type.hasRuntimeBitsIgnoreComptime()) {
1569 const sret = firstParamSRet(fn_info, target);
1570 const di_ret_ty = if (sret) Type.void else fn_info.return_type;
1571 try param_di_types.append(try o.lowerDebugType(di_ret_ty, .full));
15741572
1575 if (sret) {
1576 var ptr_ty_payload: Type.Payload.ElemType = .{
1577 .base = .{ .tag = .single_mut_pointer },
1578 .data = fn_info.return_type,
1579 };
1580 const ptr_ty = Type.initPayload(&ptr_ty_payload.base);
1581 try param_di_types.append(try o.lowerDebugType(ptr_ty, .full));
1573 if (sret) {
1574 var ptr_ty_payload: Type.Payload.ElemType = .{
1575 .base = .{ .tag = .single_mut_pointer },
1576 .data = fn_info.return_type,
1577 };
1578 const ptr_ty = Type.initPayload(&ptr_ty_payload.base);
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));
15821583 }
15831584
15841585 for (fn_info.param_types) |param_ty| {
......@@ -7343,6 +7344,12 @@ const AnnotatedDITypePtr = enum(usize) {
73437344 return @intToEnum(AnnotatedDITypePtr, addr);
73447345 }
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
73467353 fn toDIType(self: AnnotatedDITypePtr) *llvm.DIType {
73477354 const fixed_addr = @enumToInt(self) & ~@as(usize, 1);
73487355 return @intToPtr(*llvm.DIType, fixed_addr);