authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-07-12 23:00:21-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-07-13 04:47:38-04:00
logad55fb7a209e1b9d41b8d4f1d3e48211ff20d2f9
tree8616218b90808dc359e8ab107e1acd7902a60074
parent2ff49751aa932a6c0a0a09b8fd15e05ca6288c9b

Compilation: restore `saveState`


1 files changed, 70 insertions(+), 53 deletions(-)

src/Compilation.zig+70-53
...@@ -2870,11 +2870,7 @@ pub fn makeBinFileWritable(comp: *Compilation) !void {...@@ -2870,11 +2870,7 @@ pub fn makeBinFileWritable(comp: *Compilation) !void {
28702870
2871const Header = extern struct {2871const Header = extern struct {
2872 intern_pool: extern struct {2872 intern_pool: extern struct {
2873 //items_len: u32,2873 thread_count: u32,
2874 //extra_len: u32,
2875 //limbs_len: u32,
2876 //string_bytes_len: u32,
2877 //tracked_insts_len: u32,
2878 src_hash_deps_len: u32,2874 src_hash_deps_len: u32,
2879 decl_val_deps_len: u32,2875 decl_val_deps_len: u32,
2880 namespace_deps_len: u32,2876 namespace_deps_len: u32,
...@@ -2882,28 +2878,39 @@ const Header = extern struct {...@@ -2882,28 +2878,39 @@ const Header = extern struct {
2882 first_dependency_len: u32,2878 first_dependency_len: u32,
2883 dep_entries_len: u32,2879 dep_entries_len: u32,
2884 free_dep_entries_len: u32,2880 free_dep_entries_len: u32,
2885 //files_len: u32,
2886 },2881 },
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 };
2887};2893};
28882894
2889/// Note that all state that is included in the cache hash namespace is *not*2895/// Note that all state that is included in the cache hash namespace is *not*
2890/// saved, such as the target and most CLI flags. A cache hit will only occur2896/// saved, such as the target and most CLI flags. A cache hit will only occur
2891/// when subsequent compiler invocations use the same set of flags.2897/// when subsequent compiler invocations use the same set of flags.
2892pub fn saveState(comp: *Compilation) !void {2898pub fn saveState(comp: *Compilation) !void {
2893 var bufs_list: [21]std.posix.iovec_const = undefined;
2894 var bufs_len: usize = 0;
2895
2896 const lf = comp.bin_file orelse return;2899 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
2898 if (comp.module) |zcu| {2909 if (comp.module) |zcu| {
2899 const ip = &zcu.intern_pool;2910 const ip = &zcu.intern_pool;
2900 const header: Header = .{2911 const header: Header = .{
2901 .intern_pool = .{2912 .intern_pool = .{
2902 //.items_len = @intCast(ip.items.len),2913 .thread_count = @intCast(ip.locals.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()),
2907 .src_hash_deps_len = @intCast(ip.src_hash_deps.count()),2914 .src_hash_deps_len = @intCast(ip.src_hash_deps.count()),
2908 .decl_val_deps_len = @intCast(ip.decl_val_deps.count()),2915 .decl_val_deps_len = @intCast(ip.decl_val_deps.count()),
2909 .namespace_deps_len = @intCast(ip.namespace_deps.count()),2916 .namespace_deps_len = @intCast(ip.namespace_deps.count()),
...@@ -2911,38 +2918,54 @@ pub fn saveState(comp: *Compilation) !void {...@@ -2911,38 +2918,54 @@ pub fn saveState(comp: *Compilation) !void {
2911 .first_dependency_len = @intCast(ip.first_dependency.count()),2918 .first_dependency_len = @intCast(ip.first_dependency.count()),
2912 .dep_entries_len = @intCast(ip.dep_entries.items.len),2919 .dep_entries_len = @intCast(ip.dep_entries.items.len),
2913 .free_dep_entries_len = @intCast(ip.free_dep_entries.items.len),2920 .free_dep_entries_len = @intCast(ip.free_dep_entries.items.len),
2914 //.files_len = @intCast(ip.files.entries.len),
2915 },2921 },
2916 };2922 };
2917 addBuf(&bufs_list, &bufs_len, mem.asBytes(&header));2923
2918 //addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.limbs.items));2924 try pt_headers.ensureTotalCapacityPrecise(header.intern_pool.thread_count);
2919 //addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.extra.items));2925 for (ip.locals) |*local| pt_headers.appendAssumeCapacity(.{
2920 //addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.items.items(.data)));2926 .intern_pool = .{
2921 //addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.items.items(.tag)));2927 .items_len = @intCast(local.mutate.items.len),
2922 //addBuf(&bufs_list, &bufs_len, ip.string_bytes.items);2928 .extra_len = @intCast(local.mutate.extra.len),
2923 //addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.tracked_insts.keys()));2929 .limbs_len = @intCast(local.mutate.limbs.len),
29242930 .string_bytes_len = @intCast(local.mutate.strings.len),
2925 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.src_hash_deps.keys()));2931 .tracked_insts_len = @intCast(local.mutate.tracked_insts.len),
2926 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.src_hash_deps.values()));2932 .files_len = @intCast(local.mutate.files.len),
2927 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.decl_val_deps.keys()));2933 },
2928 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.decl_val_deps.values()));2934 });
2929 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_deps.keys()));2935
2930 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_deps.values()));2936 try bufs.ensureTotalCapacityPrecise(14 + 8 * pt_headers.items.len);
2931 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_name_deps.keys()));2937 addBuf(&bufs, mem.asBytes(&header));
2932 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_name_deps.values()));2938 addBuf(&bufs, mem.sliceAsBytes(pt_headers.items));
29332939
2934 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.first_dependency.keys()));2940 addBuf(&bufs, mem.sliceAsBytes(ip.src_hash_deps.keys()));
2935 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.first_dependency.values()));2941 addBuf(&bufs, mem.sliceAsBytes(ip.src_hash_deps.values()));
2936 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.dep_entries.items));2942 addBuf(&bufs, mem.sliceAsBytes(ip.decl_val_deps.keys()));
2937 addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.free_dep_entries.items));2943 addBuf(&bufs, mem.sliceAsBytes(ip.decl_val_deps.values()));
29382944 addBuf(&bufs, mem.sliceAsBytes(ip.namespace_deps.keys()));
2939 //addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.files.keys()));2945 addBuf(&bufs, mem.sliceAsBytes(ip.namespace_deps.values()));
2940 //addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.files.values()));2946 addBuf(&bufs, mem.sliceAsBytes(ip.namespace_name_deps.keys()));
29412947 addBuf(&bufs, mem.sliceAsBytes(ip.namespace_name_deps.values()));
2942 // TODO: compilation errors2948
2943 // TODO: namespaces2949 addBuf(&bufs, mem.sliceAsBytes(ip.first_dependency.keys()));
2944 // TODO: decls2950 addBuf(&bufs, mem.sliceAsBytes(ip.first_dependency.values()));
2945 // TODO: linker state2951 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
2946 }2969 }
2947 var basename_buf: [255]u8 = undefined;2970 var basename_buf: [255]u8 = undefined;
2948 const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{2971 const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{
...@@ -2956,20 +2979,14 @@ pub fn saveState(comp: *Compilation) !void {...@@ -2956,20 +2979,14 @@ pub fn saveState(comp: *Compilation) !void {
2956 // the previous incremental compilation state.2979 // the previous incremental compilation state.
2957 var af = try lf.emit.directory.handle.atomicFile(basename, .{});2980 var af = try lf.emit.directory.handle.atomicFile(basename, .{});
2958 defer af.deinit();2981 defer af.deinit();
2959 try af.file.pwritevAll(bufs_list[0..bufs_len], 0);2982 try af.file.pwritevAll(bufs.items, 0);
2960 try af.finish();2983 try af.finish();
2961}2984}
29622985
2963fn addBuf(bufs_list: []std.posix.iovec_const, bufs_len: *usize, buf: []const u8) void {2986fn addBuf(list: *std.ArrayList(std.posix.iovec_const), buf: []const u8) void {
2964 // Even when len=0, the undefined pointer might cause EFAULT.2987 // Even when len=0, the undefined pointer might cause EFAULT.
2965 if (buf.len == 0) return;2988 if (buf.len == 0) return;
29662989 list.appendAssumeCapacity(.{ .base = buf.ptr, .len = buf.len });
2967 const i = bufs_len.*;
2968 bufs_len.* = i + 1;
2969 bufs_list[i] = .{
2970 .base = buf.ptr,
2971 .len = buf.len,
2972 };
2973}2990}
29742991
2975/// This function is temporally single-threaded.2992/// This function is temporally single-threaded.