Commit e048e78886

Jacob Young <jacobly0@users.noreply.github.com>
2024-09-09 09:27:52
Dwarf: implement and test multi array list
1 parent e046977
lib/std/hash_map.zig
@@ -1767,7 +1767,7 @@ pub fn HashMapUnmanaged(
         }
 
         comptime {
-            if (!builtin.strip_debug_info) {
+            if (builtin.zig_backend == .stage2_llvm and !builtin.strip_debug_info) {
                 _ = &dbHelper;
             }
         }
lib/std/multi_array_list.zig
@@ -573,7 +573,7 @@ pub fn MultiArrayList(comptime T: type) type {
         }
 
         comptime {
-            if (!builtin.strip_debug_info) {
+            if (builtin.zig_backend == .stage2_llvm and !builtin.strip_debug_info) {
                 _ = &dbHelper;
                 _ = &Slice.dbHelper;
             }
src/link/Dwarf.zig
@@ -1762,7 +1762,7 @@ pub const WipNav = struct {
     fn blockValue(wip_nav: *WipNav, src_loc: Zcu.LazySrcLoc, val: Value) UpdateError!void {
         const ty = val.typeOf(wip_nav.pt.zcu);
         const diw = wip_nav.debug_info.writer(wip_nav.dwarf.gpa);
-        const bytes = ty.abiSize(wip_nav.pt.zcu);
+        const bytes = if (ty.hasRuntimeBits(wip_nav.pt.zcu)) ty.abiSize(wip_nav.pt.zcu) else 0;
         try uleb128(diw, bytes);
         if (bytes == 0) return;
         var dim = wip_nav.debug_info.toManaged(wip_nav.dwarf.gpa);
src/InternPool.zig
@@ -4723,7 +4723,7 @@ pub const Index = enum(u32) {
     }
 
     comptime {
-        if (!builtin.strip_debug_info) {
+        if (builtin.zig_backend == .stage2_llvm and !builtin.strip_debug_info) {
             _ = &dbHelper;
         }
     }
test/src/Debugger.zig
@@ -1325,6 +1325,149 @@ pub fn addTestsForTarget(db: *Debugger, target: Target) void {
             \\1 breakpoints deleted; 0 breakpoint locations disabled.
         },
     );
+    db.addLldbTest(
+        "multi_array_list",
+        target,
+        &.{
+            .{
+                .path = "main.zig",
+                .source =
+                \\const std = @import("std");
+                \\fn testMultiArrayList() void {}
+                \\pub fn main() !void {
+                \\    const Elem0 = struct { u32, u8, u16 };
+                \\    var list0: std.MultiArrayList(Elem0) = .{};
+                \\    defer list0.deinit(std.heap.page_allocator);
+                \\    try list0.setCapacity(std.heap.page_allocator, 8);
+                \\    list0.appendAssumeCapacity(.{ 1, 2, 3 });
+                \\    list0.appendAssumeCapacity(.{ 4, 5, 6 });
+                \\    list0.appendAssumeCapacity(.{ 7, 8, 9 });
+                \\
+                \\    const Elem1 = struct { a: u32, b: u8, c: u16 };
+                \\    var list1: std.MultiArrayList(Elem1) = .{};
+                \\    defer list1.deinit(std.heap.page_allocator);
+                \\    try list1.setCapacity(std.heap.page_allocator, 12);
+                \\    list1.appendAssumeCapacity(.{ .a = 1, .b = 2, .c = 3 });
+                \\    list1.appendAssumeCapacity(.{ .a = 4, .b = 5, .c = 6 });
+                \\    list1.appendAssumeCapacity(.{ .a = 7, .b = 8, .c = 9 });
+                \\
+                \\    testMultiArrayList();
+                \\}
+                \\
+                ,
+            },
+        },
+        \\breakpoint set --file main.zig --source-pattern-regexp 'testMultiArrayList\(\);'
+        \\process launch
+        \\frame variable --show-types -- list0 list0.len list0.capacity list0[0] list0[1] list0[2] list0.0 list0.1 list0.2
+        \\frame variable --show-types -- list1 list1.len list1.capacity list1[0] list1[1] list1[2] list1.a list1.b list1.c
+        \\breakpoint delete --force 1
+    ,
+        &.{
+            \\(lldb) frame variable --show-types -- list0 list0.len list0.capacity list0[0] list0[1] list0[2] list0.0 list0.1 list0.2
+            \\(std.multi_array_list.MultiArrayList(main.main.Elem0)) list0 = len=3 capacity=8 {
+            \\  (root.main.main.Elem0) [0] = {
+            \\    (u32) 0 = 1
+            \\    (u8) 1 = 2
+            \\    (u16) 2 = 3
+            \\  }
+            \\  (root.main.main.Elem0) [1] = {
+            \\    (u32) 0 = 4
+            \\    (u8) 1 = 5
+            \\    (u16) 2 = 6
+            \\  }
+            \\  (root.main.main.Elem0) [2] = {
+            \\    (u32) 0 = 7
+            \\    (u8) 1 = 8
+            \\    (u16) 2 = 9
+            \\  }
+            \\}
+            \\(usize) list0.len = 3
+            \\(usize) list0.capacity = 8
+            \\(root.main.main.Elem0) list0[0] = {
+            \\  (u32) 0 = 1
+            \\  (u8) 1 = 2
+            \\  (u16) 2 = 3
+            \\}
+            \\(root.main.main.Elem0) list0[1] = {
+            \\  (u32) 0 = 4
+            \\  (u8) 1 = 5
+            \\  (u16) 2 = 6
+            \\}
+            \\(root.main.main.Elem0) list0[2] = {
+            \\  (u32) 0 = 7
+            \\  (u8) 1 = 8
+            \\  (u16) 2 = 9
+            \\}
+            \\([3]u32) list0.0 = {
+            \\  (u32) [0] = 1
+            \\  (u32) [1] = 4
+            \\  (u32) [2] = 7
+            \\}
+            \\([3]u8) list0.1 = {
+            \\  (u8) [0] = 2
+            \\  (u8) [1] = 5
+            \\  (u8) [2] = 8
+            \\}
+            \\([3]u16) list0.2 = {
+            \\  (u16) [0] = 3
+            \\  (u16) [1] = 6
+            \\  (u16) [2] = 9
+            \\}
+            \\(lldb) frame variable --show-types -- list1 list1.len list1.capacity list1[0] list1[1] list1[2] list1.a list1.b list1.c
+            \\(std.multi_array_list.MultiArrayList(main.main.Elem1)) list1 = len=3 capacity=12 {
+            \\  (root.main.main.Elem1) [0] = {
+            \\    (u32) a = 1
+            \\    (u8) b = 2
+            \\    (u16) c = 3
+            \\  }
+            \\  (root.main.main.Elem1) [1] = {
+            \\    (u32) a = 4
+            \\    (u8) b = 5
+            \\    (u16) c = 6
+            \\  }
+            \\  (root.main.main.Elem1) [2] = {
+            \\    (u32) a = 7
+            \\    (u8) b = 8
+            \\    (u16) c = 9
+            \\  }
+            \\}
+            \\(usize) list1.len = 3
+            \\(usize) list1.capacity = 12
+            \\(root.main.main.Elem1) list1[0] = {
+            \\  (u32) a = 1
+            \\  (u8) b = 2
+            \\  (u16) c = 3
+            \\}
+            \\(root.main.main.Elem1) list1[1] = {
+            \\  (u32) a = 4
+            \\  (u8) b = 5
+            \\  (u16) c = 6
+            \\}
+            \\(root.main.main.Elem1) list1[2] = {
+            \\  (u32) a = 7
+            \\  (u8) b = 8
+            \\  (u16) c = 9
+            \\}
+            \\([3]u32) list1.a = {
+            \\  (u32) [0] = 1
+            \\  (u32) [1] = 4
+            \\  (u32) [2] = 7
+            \\}
+            \\([3]u8) list1.b = {
+            \\  (u8) [0] = 2
+            \\  (u8) [1] = 5
+            \\  (u8) [2] = 8
+            \\}
+            \\([3]u16) list1.c = {
+            \\  (u16) [0] = 3
+            \\  (u16) [1] = 6
+            \\  (u16) [2] = 9
+            \\}
+            \\(lldb) breakpoint delete --force 1
+            \\1 breakpoints deleted; 0 breakpoint locations disabled.
+        },
+    );
     db.addLldbTest(
         "segmented_list",
         target,