| ... | @@ -7,6 +7,7 @@ const Step = std.Build.Step; | ... | @@ -7,6 +7,7 @@ const Step = std.Build.Step; |
| 7 | const Coverage = std.debug.Coverage; | 7 | const Coverage = std.debug.Coverage; |
| 8 | const abi = std.Build.Fuzz.abi; | 8 | const abi = std.Build.Fuzz.abi; |
| 9 | const log = std.log; | 9 | const log = std.log; |
| | 10 | const assert = std.debug.assert; |
| 10 | | 11 | |
| 11 | const WebServer = @This(); | 12 | const WebServer = @This(); |
| 12 | | 13 | |
| ... | @@ -383,7 +384,10 @@ fn sendCoverageContext( | ... | @@ -383,7 +384,10 @@ fn sendCoverageContext( |
| 383 | // TODO: make each events URL correspond to one coverage map | 384 | // TODO: make each events URL correspond to one coverage map |
| 384 | const coverage_map = &coverage_maps[0]; | 385 | const coverage_map = &coverage_maps[0]; |
| 385 | const cov_header: *const abi.SeenPcsHeader = @ptrCast(coverage_map.mapped_memory[0..@sizeOf(abi.SeenPcsHeader)]); | 386 | const cov_header: *const abi.SeenPcsHeader = @ptrCast(coverage_map.mapped_memory[0..@sizeOf(abi.SeenPcsHeader)]); |
| | 387 | comptime assert(abi.SeenPcsHeader.trailing[0] == .pc_addr); |
| 386 | const seen_pcs = coverage_map.mapped_memory[@sizeOf(abi.SeenPcsHeader) + coverage_map.source_locations.len * @sizeOf(usize) ..]; | 388 | const seen_pcs = coverage_map.mapped_memory[@sizeOf(abi.SeenPcsHeader) + coverage_map.source_locations.len * @sizeOf(usize) ..]; |
| | 389 | comptime assert(abi.SeenPcsHeader.trailing[1][0] == .pc_bits); |
| | 390 | comptime assert(abi.SeenPcsHeader.trailing[1][1] == u8); |
| 387 | const n_runs = @atomicLoad(usize, &cov_header.n_runs, .monotonic); | 391 | const n_runs = @atomicLoad(usize, &cov_header.n_runs, .monotonic); |
| 388 | const unique_runs = @atomicLoad(usize, &cov_header.unique_runs, .monotonic); | 392 | const unique_runs = @atomicLoad(usize, &cov_header.unique_runs, .monotonic); |
| 389 | const lowest_stack = @atomicLoad(usize, &cov_header.lowest_stack, .monotonic); | 393 | const lowest_stack = @atomicLoad(usize, &cov_header.lowest_stack, .monotonic); |
| ... | @@ -630,6 +634,7 @@ fn prepareTables( | ... | @@ -630,6 +634,7 @@ fn prepareTables( |
| 630 | gop.value_ptr.mapped_memory = mapped_memory; | 634 | gop.value_ptr.mapped_memory = mapped_memory; |
| 631 | | 635 | |
| 632 | const header: *const abi.SeenPcsHeader = @ptrCast(mapped_memory[0..@sizeOf(abi.SeenPcsHeader)]); | 636 | const header: *const abi.SeenPcsHeader = @ptrCast(mapped_memory[0..@sizeOf(abi.SeenPcsHeader)]); |
| | 637 | comptime assert(abi.SeenPcsHeader.trailing[0] == .pc_addr); |
| 633 | const pcs_bytes = mapped_memory[@sizeOf(abi.SeenPcsHeader)..][0 .. header.pcs_len * @sizeOf(usize)]; | 638 | const pcs_bytes = mapped_memory[@sizeOf(abi.SeenPcsHeader)..][0 .. header.pcs_len * @sizeOf(usize)]; |
| 634 | const pcs = std.mem.bytesAsSlice(usize, pcs_bytes); | 639 | const pcs = std.mem.bytesAsSlice(usize, pcs_bytes); |
| 635 | const source_locations = try gpa.alloc(Coverage.SourceLocation, pcs.len); | 640 | const source_locations = try gpa.alloc(Coverage.SourceLocation, pcs.len); |
| ... | @@ -649,6 +654,7 @@ fn addEntryPoint(ws: *WebServer, coverage_id: u64, addr: u64) error{ AlreadyRepo | ... | @@ -649,6 +654,7 @@ fn addEntryPoint(ws: *WebServer, coverage_id: u64, addr: u64) error{ AlreadyRepo |
| 649 | | 654 | |
| 650 | const coverage_map = ws.coverage_files.getPtr(coverage_id).?; | 655 | const coverage_map = ws.coverage_files.getPtr(coverage_id).?; |
| 651 | const ptr = coverage_map.mapped_memory; | 656 | const ptr = coverage_map.mapped_memory; |
| | 657 | comptime assert(abi.SeenPcsHeader.trailing[0] == .pc_addr); |
| 652 | const pcs_bytes = ptr[@sizeOf(abi.SeenPcsHeader)..][0 .. coverage_map.source_locations.len * @sizeOf(usize)]; | 658 | const pcs_bytes = ptr[@sizeOf(abi.SeenPcsHeader)..][0 .. coverage_map.source_locations.len * @sizeOf(usize)]; |
| 653 | const pcs: []const usize = @alignCast(std.mem.bytesAsSlice(usize, pcs_bytes)); | 659 | const pcs: []const usize = @alignCast(std.mem.bytesAsSlice(usize, pcs_bytes)); |
| 654 | const index = std.sort.upperBound(usize, pcs, addr, struct { | 660 | const index = std.sort.upperBound(usize, pcs, addr, struct { |