aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-03-16 17:22:16 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-03-16 17:22:16 -0700
commitd78b8c10b9b33a5b1a21e9fa981576fd408939e5 (patch)
tree528070479356f957d06b521ba5c8afdc0de3b9c4 /src/codegen/llvm.zig
parent942f8d07d152eb0420419c89b5c9a3110151b873 (diff)
downloadzig-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.zig35
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);