| ... | @@ -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 | } |
| 980 | | 980 | |
| ... | @@ -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); | | |
| 1564 | | 1563 | |
| 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(); |
| 1567 | | 1566 | |
| 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.void | 1569 | const sret = firstParamSRet(fn_info, target); |
| 1571 | else | 1570 | 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)); | | |
| 1574 | | 1572 | |
| 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 | } |
| 1583 | | 1584 | |
| 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 | } |
| 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 | 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); |