| ... | @@ -2870,11 +2870,7 @@ pub fn makeBinFileWritable(comp: *Compilation) !void { | ... | @@ -2870,11 +2870,7 @@ pub fn makeBinFileWritable(comp: *Compilation) !void { |
| 2870 | | 2870 | |
| 2871 | const Header = extern struct { | 2871 | const 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 | }; |
| 2888 | | 2894 | |
| 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 occur | 2896 | /// 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. |
| 2892 | pub fn saveState(comp: *Compilation) !void { | 2898 | pub 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; |
| 2897 | | 2900 | |
| | 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), |
| 2924 | | 2930 | .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)); |
| 2933 | | 2939 | |
| 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())); |
| 2938 | | 2944 | 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())); |
| 2941 | | 2947 | addBuf(&bufs, mem.sliceAsBytes(ip.namespace_name_deps.values())); |
| 2942 | // TODO: compilation errors | 2948 | |
| 2943 | // TODO: namespaces | 2949 | addBuf(&bufs, mem.sliceAsBytes(ip.first_dependency.keys())); |
| 2944 | // TODO: decls | 2950 | addBuf(&bufs, mem.sliceAsBytes(ip.first_dependency.values())); |
| 2945 | // TODO: linker state | 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 |
| 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 | } |
| 2962 | | 2985 | |
| 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 { |
| 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; |
| 2966 | | 2989 | 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 | } |
| 2974 | | 2991 | |
| 2975 | /// This function is temporally single-threaded. | 2992 | /// This function is temporally single-threaded. |