| ... | ... | @@ -974,7 +974,7 @@ pub const Object = struct { |
| 974 | 974 | const bland_ptr_ty = Type.initPayload(&payload.base); |
| 975 | 975 | const ptr_di_ty = try o.lowerDebugType(bland_ptr_ty, resolve); |
| 976 | 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 | 978 | return ptr_di_ty; |
| 979 | 979 | } |
| 980 | 980 | |
| ... | ... | @@ -1560,25 +1560,26 @@ pub const Object = struct { |
| 1560 | 1560 | }, |
| 1561 | 1561 | .Fn => { |
| 1562 | 1562 | const fn_info = ty.fnInfo(); |
| 1563 | | const sret = firstParamSRet(fn_info, target); |
| 1564 | 1563 | |
| 1565 | 1564 | var param_di_types = std.ArrayList(*llvm.DIType).init(gpa); |
| 1566 | 1565 | defer param_di_types.deinit(); |
| 1567 | 1566 | |
| 1568 | 1567 | // 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)); |
| 1574 | 1572 | |
| 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)); |
| 1582 | 1583 | } |
| 1583 | 1584 | |
| 1584 | 1585 | for (fn_info.param_types) |param_ty| { |
| ... | ... | @@ -7343,6 +7344,12 @@ const AnnotatedDITypePtr = enum(usize) { |
| 7343 | 7344 | return @intToEnum(AnnotatedDITypePtr, addr); |
| 7344 | 7345 | } |
| 7345 | 7346 | |
| 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 | 7353 | fn toDIType(self: AnnotatedDITypePtr) *llvm.DIType { |
| 7347 | 7354 | const fixed_addr = @enumToInt(self) & ~@as(usize, 1); |
| 7348 | 7355 | return @intToPtr(*llvm.DIType, fixed_addr); |