Skip to content

Commit ad55fb7

Browse files
committed
Compilation: restore saveState
1 parent 2ff4975 commit ad55fb7

File tree

1 file changed

+70
-53
lines changed

1 file changed

+70
-53
lines changed

src/Compilation.zig

Lines changed: 70 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2870,79 +2870,102 @@ pub fn makeBinFileWritable(comp: *Compilation) !void {
28702870

28712871
const Header = extern struct {
28722872
intern_pool: extern struct {
2873-
//items_len: u32,
2874-
//extra_len: u32,
2875-
//limbs_len: u32,
2876-
//string_bytes_len: u32,
2877-
//tracked_insts_len: u32,
2873+
thread_count: u32,
28782874
src_hash_deps_len: u32,
28792875
decl_val_deps_len: u32,
28802876
namespace_deps_len: u32,
28812877
namespace_name_deps_len: u32,
28822878
first_dependency_len: u32,
28832879
dep_entries_len: u32,
28842880
free_dep_entries_len: u32,
2885-
//files_len: u32,
28862881
},
2882+
2883+
const PerThread = extern struct {
2884+
intern_pool: extern struct {
2885+
items_len: u32,
2886+
extra_len: u32,
2887+
limbs_len: u32,
2888+
string_bytes_len: u32,
2889+
tracked_insts_len: u32,
2890+
files_len: u32,
2891+
},
2892+
};
28872893
};
28882894

28892895
/// Note that all state that is included in the cache hash namespace is *not*
28902896
/// saved, such as the target and most CLI flags. A cache hit will only occur
28912897
/// when subsequent compiler invocations use the same set of flags.
28922898
pub fn saveState(comp: *Compilation) !void {
2893-
var bufs_list: [21]std.posix.iovec_const = undefined;
2894-
var bufs_len: usize = 0;
2895-
28962899
const lf = comp.bin_file orelse return;
28972900

2901+
const gpa = comp.gpa;
2902+
2903+
var bufs = std.ArrayList(std.posix.iovec_const).init(gpa);
2904+
defer bufs.deinit();
2905+
2906+
var pt_headers = std.ArrayList(Header.PerThread).init(gpa);
2907+
defer pt_headers.deinit();
2908+
28982909
if (comp.module) |zcu| {
28992910
const ip = &zcu.intern_pool;
29002911
const header: Header = .{
29012912
.intern_pool = .{
2902-
//.items_len = @intCast(ip.items.len),
2903-
//.extra_len = @intCast(ip.extra.items.len),
2904-
//.limbs_len = @intCast(ip.limbs.items.len),
2905-
//.string_bytes_len = @intCast(ip.string_bytes.items.len),
2906-
//.tracked_insts_len = @intCast(ip.tracked_insts.count()),
2913+
.thread_count = @intCast(ip.locals.len),
29072914
.src_hash_deps_len = @intCast(ip.src_hash_deps.count()),
29082915
.decl_val_deps_len = @intCast(ip.decl_val_deps.count()),
29092916
.namespace_deps_len = @intCast(ip.namespace_deps.count()),
29102917
.namespace_name_deps_len = @intCast(ip.namespace_name_deps.count()),
29112918
.first_dependency_len = @intCast(ip.first_dependency.count()),
29122919
.dep_entries_len = @intCast(ip.dep_entries.items.len),
29132920
.free_dep_entries_len = @intCast(ip.free_dep_entries.items.len),
2914-
//.files_len = @intCast(ip.files.entries.len),
29152921
},
29162922
};
2917-
addBuf(&bufs_list, &bufs_len, mem.asBytes(&header));
2918-
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.limbs.items));
2919-
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.extra.items));
2920-
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.items.items(.data)));
2921-
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.items.items(.tag)));
2922-
//addBuf(&bufs_list, &bufs_len, ip.string_bytes.items);
2923-
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.tracked_insts.keys()));
2924-
2925-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.src_hash_deps.keys()));
2926-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.src_hash_deps.values()));
2927-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.decl_val_deps.keys()));
2928-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.decl_val_deps.values()));
2929-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_deps.keys()));
2930-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_deps.values()));
2931-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_name_deps.keys()));
2932-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_name_deps.values()));
2933-
2934-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.first_dependency.keys()));
2935-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.first_dependency.values()));
2936-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.dep_entries.items));
2937-
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.free_dep_entries.items));
2938-
2939-
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.files.keys()));
2940-
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.files.values()));
2941-
2942-
// TODO: compilation errors
2943-
// TODO: namespaces
2944-
// TODO: decls
2945-
// TODO: linker state
2923+
2924+
try pt_headers.ensureTotalCapacityPrecise(header.intern_pool.thread_count);
2925+
for (ip.locals) |*local| pt_headers.appendAssumeCapacity(.{
2926+
.intern_pool = .{
2927+
.items_len = @intCast(local.mutate.items.len),
2928+
.extra_len = @intCast(local.mutate.extra.len),
2929+
.limbs_len = @intCast(local.mutate.limbs.len),
2930+
.string_bytes_len = @intCast(local.mutate.strings.len),
2931+
.tracked_insts_len = @intCast(local.mutate.tracked_insts.len),
2932+
.files_len = @intCast(local.mutate.files.len),
2933+
},
2934+
});
2935+
2936+
try bufs.ensureTotalCapacityPrecise(14 + 8 * pt_headers.items.len);
2937+
addBuf(&bufs, mem.asBytes(&header));
2938+
addBuf(&bufs, mem.sliceAsBytes(pt_headers.items));
2939+
2940+
addBuf(&bufs, mem.sliceAsBytes(ip.src_hash_deps.keys()));
2941+
addBuf(&bufs, mem.sliceAsBytes(ip.src_hash_deps.values()));
2942+
addBuf(&bufs, mem.sliceAsBytes(ip.decl_val_deps.keys()));
2943+
addBuf(&bufs, mem.sliceAsBytes(ip.decl_val_deps.values()));
2944+
addBuf(&bufs, mem.sliceAsBytes(ip.namespace_deps.keys()));
2945+
addBuf(&bufs, mem.sliceAsBytes(ip.namespace_deps.values()));
2946+
addBuf(&bufs, mem.sliceAsBytes(ip.namespace_name_deps.keys()));
2947+
addBuf(&bufs, mem.sliceAsBytes(ip.namespace_name_deps.values()));
2948+
2949+
addBuf(&bufs, mem.sliceAsBytes(ip.first_dependency.keys()));
2950+
addBuf(&bufs, mem.sliceAsBytes(ip.first_dependency.values()));
2951+
addBuf(&bufs, mem.sliceAsBytes(ip.dep_entries.items));
2952+
addBuf(&bufs, mem.sliceAsBytes(ip.free_dep_entries.items));
2953+
2954+
for (ip.locals, pt_headers.items) |*local, pt_header| {
2955+
addBuf(&bufs, mem.sliceAsBytes(local.shared.limbs.view().items(.@"0")[0..pt_header.intern_pool.limbs_len]));
2956+
addBuf(&bufs, mem.sliceAsBytes(local.shared.extra.view().items(.@"0")[0..pt_header.intern_pool.extra_len]));
2957+
addBuf(&bufs, mem.sliceAsBytes(local.shared.items.view().items(.data)[0..pt_header.intern_pool.items_len]));
2958+
addBuf(&bufs, mem.sliceAsBytes(local.shared.items.view().items(.tag)[0..pt_header.intern_pool.items_len]));
2959+
addBuf(&bufs, local.shared.strings.view().items(.@"0")[0..pt_header.intern_pool.string_bytes_len]);
2960+
addBuf(&bufs, mem.sliceAsBytes(local.shared.tracked_insts.view().items(.@"0")[0..pt_header.intern_pool.tracked_insts_len]));
2961+
addBuf(&bufs, mem.sliceAsBytes(local.shared.files.view().items(.bin_digest)[0..pt_header.intern_pool.files_len]));
2962+
addBuf(&bufs, mem.sliceAsBytes(local.shared.files.view().items(.root_decl)[0..pt_header.intern_pool.files_len]));
2963+
}
2964+
2965+
//// TODO: compilation errors
2966+
//// TODO: namespaces
2967+
//// TODO: decls
2968+
//// TODO: linker state
29462969
}
29472970
var basename_buf: [255]u8 = undefined;
29482971
const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{
@@ -2956,20 +2979,14 @@ pub fn saveState(comp: *Compilation) !void {
29562979
// the previous incremental compilation state.
29572980
var af = try lf.emit.directory.handle.atomicFile(basename, .{});
29582981
defer af.deinit();
2959-
try af.file.pwritevAll(bufs_list[0..bufs_len], 0);
2982+
try af.file.pwritevAll(bufs.items, 0);
29602983
try af.finish();
29612984
}
29622985

2963-
fn addBuf(bufs_list: []std.posix.iovec_const, bufs_len: *usize, buf: []const u8) void {
2986+
fn addBuf(list: *std.ArrayList(std.posix.iovec_const), buf: []const u8) void {
29642987
// Even when len=0, the undefined pointer might cause EFAULT.
29652988
if (buf.len == 0) return;
2966-
2967-
const i = bufs_len.*;
2968-
bufs_len.* = i + 1;
2969-
bufs_list[i] = .{
2970-
.base = buf.ptr,
2971-
.len = buf.len,
2972-
};
2989+
list.appendAssumeCapacity(.{ .base = buf.ptr, .len = buf.len });
29732990
}
29742991

29752992
/// This function is temporally single-threaded.

0 commit comments

Comments
 (0)