| 1 | #exe { |
| 2 | --name pointers |
| 3 | -Mroot=pointers.zig |
| 4 | #} |
| 5 | |
| 6 | #write pointers.zig { |
| 7 | var array: [7]u32 = .{ |
| 8 | 3010, |
| 9 | 3014, |
| 10 | 3018, |
| 11 | 3022, |
| 12 | 3026, |
| 13 | 3030, |
| 14 | 3034, |
| 15 | }; |
| 16 | const Pointers = struct { |
| 17 | single: *u32 = @ptrFromInt(0x1010), |
| 18 | single_const: *const u32 = @ptrFromInt(0x1014), |
| 19 | single_volatile: *volatile u32 = @ptrFromInt(0x1018), |
| 20 | single_const_volatile: *const volatile u32 = @ptrFromInt(0x101c), |
| 21 | single_allowzero: *allowzero u32 = @ptrFromInt(0x1020), |
| 22 | single_allowzero_const: *allowzero const u32 = @ptrFromInt(0x1024), |
| 23 | single_allowzero_volatile: *allowzero volatile u32 = @ptrFromInt(0x1028), |
| 24 | single_allowzero_const_volatile: *allowzero const volatile u32 = @ptrFromInt(0x102c), |
| 25 | |
| 26 | many: [*]u32 = @ptrFromInt(0x2010), |
| 27 | many_const: [*]const u32 = @ptrFromInt(0x2014), |
| 28 | many_volatile: [*]volatile u32 = @ptrFromInt(0x2018), |
| 29 | many_const_volatile: [*]const volatile u32 = @ptrFromInt(0x201c), |
| 30 | many_allowzero: [*]allowzero u32 = @ptrFromInt(0x2020), |
| 31 | many_allowzero_const: [*]allowzero const u32 = @ptrFromInt(0x2024), |
| 32 | many_allowzero_volatile: [*]allowzero volatile u32 = @ptrFromInt(0x2028), |
| 33 | many_allowzero_const_volatile: [*]allowzero const volatile u32 = @ptrFromInt(0x202c), |
| 34 | slice: []u32 = array[0..1], |
| 35 | slice_const: []const u32 = array[0..2], |
| 36 | slice_volatile: []volatile u32 = array[0..3], |
| 37 | slice_const_volatile: []const volatile u32 = array[0..4], |
| 38 | slice_allowzero: []allowzero u32 = array[4..4], |
| 39 | slice_allowzero_const: []allowzero const u32 = array[4..5], |
| 40 | slice_allowzero_volatile: []allowzero volatile u32 = array[4..6], |
| 41 | slice_allowzero_const_volatile: []allowzero const volatile u32 = array[4..7], |
| 42 | |
| 43 | c: [*c]u32 = @ptrFromInt(0x4010), |
| 44 | c_const: [*c]const u32 = @ptrFromInt(0x4014), |
| 45 | c_volatile: [*c]volatile u32 = @ptrFromInt(0x4018), |
| 46 | c_const_volatile: [*c]const volatile u32 = @ptrFromInt(0x401c), |
| 47 | }; |
| 48 | const Access = struct { |
| 49 | single: *u32 = &array[0], |
| 50 | many: [*]u32 = array[1..3], |
| 51 | slice: []u32 = array[3..5], |
| 52 | c: [*c]u32 = array[5..7], |
| 53 | }; |
| 54 | fn testPointers(pointers: Pointers, access: Access) void { |
| 55 | _ = pointers; |
| 56 | _ = access; |
| 57 | } |
| 58 | pub fn main() void { |
| 59 | testPointers(.{}, .{}); |
| 60 | } |
| 61 | #} |
| 62 | #update |
| 63 | #check lldb { |
| 64 | (lldb) breakpoint set --file pointers.zig --source-pattern-regexp '_ = access;' |
| 65 | Breakpoint 1: where = pointers`pointers.testPointers + #... at pointers.zig:51:1, address = 0x#... |
| 66 | (lldb) process launch |
| 67 | Process #... launched: '#.../pointers' (#...) |
| 68 | Process #... stopped |
| 69 | * thread #1, name = 'pointers', stop reason = breakpoint 1.1 |
| 70 | frame #0: pointers`pointers.testPointers(pointers=Pointers @ 0x#..., access=Access @ 0x#...) at pointers.zig:51:1 |
| 71 | (lldb) frame variable --show-all-children --show-types -- pointers access.single.* access.many[0] access.many[1] access.slice[0] access.slice[1] access.c.* access.c[0] access.c[1] |
| 72 | (root.pointers.Pointers) pointers = { |
| 73 | (*u32) .single = 0x0000000000001010 |
| 74 | (*const u32) .single_const = 0x0000000000001014 |
| 75 | (*volatile u32) .single_volatile = 0x0000000000001018 |
| 76 | (*const volatile u32) .single_const_volatile = 0x000000000000101c |
| 77 | (*allowzero u32) .single_allowzero = 0x0000000000001020 |
| 78 | (*allowzero const u32) .single_allowzero_const = 0x0000000000001024 |
| 79 | (*allowzero volatile u32) .single_allowzero_volatile = 0x0000000000001028 |
| 80 | (*allowzero const volatile u32) .single_allowzero_const_volatile = 0x000000000000102c |
| 81 | ([*]u32) .many = 0x0000000000002010 |
| 82 | ([*]const u32) .many_const = 0x0000000000002014 |
| 83 | ([*]volatile u32) .many_volatile = 0x0000000000002018 |
| 84 | ([*]const volatile u32) .many_const_volatile = 0x000000000000201c |
| 85 | ([*]allowzero u32) .many_allowzero = 0x0000000000002020 |
| 86 | ([*]allowzero const u32) .many_allowzero_const = 0x0000000000002024 |
| 87 | ([*]allowzero volatile u32) .many_allowzero_volatile = 0x0000000000002028 |
| 88 | ([*]allowzero const volatile u32) .many_allowzero_const_volatile = 0x000000000000202c |
| 89 | ([]u32) .slice = len=1 { |
| 90 | (u32) [0] = 3010 |
| 91 | } |
| 92 | ([]const u32) .slice_const = len=2 { |
| 93 | (u32) [0] = 3010 |
| 94 | (u32) [1] = 3014 |
| 95 | } |
| 96 | ([]volatile u32) .slice_volatile = len=3 { |
| 97 | (u32) [0] = 3010 |
| 98 | (u32) [1] = 3014 |
| 99 | (u32) [2] = 3018 |
| 100 | } |
| 101 | ([]const volatile u32) .slice_const_volatile = len=4 { |
| 102 | (u32) [0] = 3010 |
| 103 | (u32) [1] = 3014 |
| 104 | (u32) [2] = 3018 |
| 105 | (u32) [3] = 3022 |
| 106 | } |
| 107 | ([]allowzero u32) .slice_allowzero = len=0 {} |
| 108 | ([]allowzero const u32) .slice_allowzero_const = len=1 { |
| 109 | (u32) [0] = 3026 |
| 110 | } |
| 111 | ([]allowzero volatile u32) .slice_allowzero_volatile = len=2 { |
| 112 | (u32) [0] = 3026 |
| 113 | (u32) [1] = 3030 |
| 114 | } |
| 115 | ([]allowzero const volatile u32) .slice_allowzero_const_volatile = len=3 { |
| 116 | (u32) [0] = 3026 |
| 117 | (u32) [1] = 3030 |
| 118 | (u32) [2] = 3034 |
| 119 | } |
| 120 | ([*c]u32) .c = 0x0000000000004010 |
| 121 | ([*c]const u32) .c_const = 0x0000000000004014 |
| 122 | ([*c]volatile u32) .c_volatile = 0x0000000000004018 |
| 123 | ([*c]const volatile u32) .c_const_volatile = 0x000000000000401c |
| 124 | } |
| 125 | (u32) access.single.* = 3010 |
| 126 | (u32) access.many[0] = 3014 |
| 127 | (u32) access.many[1] = 3018 |
| 128 | (u32) access.slice[0] = 3022 |
| 129 | (u32) access.slice[1] = 3026 |
| 130 | (u32) access.c.* = 3030 |
| 131 | (u32) access.c[0] = 3030 |
| 132 | (u32) access.c[1] = 3034 |
| 133 | (lldb) breakpoint delete --force 1 |
| 134 | 1 breakpoints deleted; 0 breakpoint locations disabled. |
| 135 | #} |