diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-03-16 17:22:16 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-03-16 17:22:16 -0700 |
| commit | d78b8c10b9b33a5b1a21e9fa981576fd408939e5 (patch) | |
| tree | 528070479356f957d06b521ba5c8afdc0de3b9c4 /src/codegen/llvm.zig | |
| parent | 942f8d07d152eb0420419c89b5c9a3110151b873 (diff) | |
| download | zig-d78b8c10b9b33a5b1a21e9fa981576fd408939e5.tar.gz zig-d78b8c10b9b33a5b1a21e9fa981576fd408939e5.zip | |
LLVM: fix slice debug info and functions
with return types that have no runtime bits
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index b09f4005cd..67eac94af3 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -974,7 +974,7 @@ pub const Object = struct { const bland_ptr_ty = Type.initPayload(&payload.base); const ptr_di_ty = try o.lowerDebugType(bland_ptr_ty, resolve); // The recursive call to `lowerDebugType` means we can't use `gop` anymore. - try o.di_type_map.put(gpa, ty, AnnotatedDITypePtr.initFull(ptr_di_ty)); + try o.di_type_map.put(gpa, ty, AnnotatedDITypePtr.init(ptr_di_ty, resolve)); return ptr_di_ty; } @@ -1560,25 +1560,26 @@ pub const Object = struct { }, .Fn => { const fn_info = ty.fnInfo(); - const sret = firstParamSRet(fn_info, target); var param_di_types = std.ArrayList(*llvm.DIType).init(gpa); defer param_di_types.deinit(); // Return type goes first. - const di_ret_ty = if (sret or !fn_info.return_type.hasRuntimeBitsIgnoreComptime()) - Type.void - else - fn_info.return_type; - try param_di_types.append(try o.lowerDebugType(di_ret_ty, .full)); + if (fn_info.return_type.hasRuntimeBitsIgnoreComptime()) { + const sret = firstParamSRet(fn_info, target); + const di_ret_ty = if (sret) Type.void else fn_info.return_type; + try param_di_types.append(try o.lowerDebugType(di_ret_ty, .full)); - if (sret) { - var ptr_ty_payload: Type.Payload.ElemType = .{ - .base = .{ .tag = .single_mut_pointer }, - .data = fn_info.return_type, - }; - const ptr_ty = Type.initPayload(&ptr_ty_payload.base); - try param_di_types.append(try o.lowerDebugType(ptr_ty, .full)); + if (sret) { + var ptr_ty_payload: Type.Payload.ElemType = .{ + .base = .{ .tag = .single_mut_pointer }, + .data = fn_info.return_type, + }; + const ptr_ty = Type.initPayload(&ptr_ty_payload.base); + try param_di_types.append(try o.lowerDebugType(ptr_ty, .full)); + } + } else { + try param_di_types.append(try o.lowerDebugType(Type.void, .full)); } for (fn_info.param_types) |param_ty| { @@ -7343,6 +7344,12 @@ const AnnotatedDITypePtr = enum(usize) { return @intToEnum(AnnotatedDITypePtr, addr); } + fn init(di_type: *llvm.DIType, resolve: Object.DebugResolveStatus) AnnotatedDITypePtr { + const addr = @ptrToInt(di_type); + const bit = @boolToInt(resolve == .fwd); + return @intToEnum(AnnotatedDITypePtr, addr | bit); + } + fn toDIType(self: AnnotatedDITypePtr) *llvm.DIType { const fixed_addr = @enumToInt(self) & ~@as(usize, 1); return @intToPtr(*llvm.DIType, fixed_addr); |
