| ... | ... | @@ -2870,11 +2870,7 @@ pub fn makeBinFileWritable(comp: *Compilation) !void { |
| 2870 | 2870 | |
| 2871 | 2871 | const Header = extern struct { |
| 2872 | 2872 | 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, |
| 2878 | 2874 | src_hash_deps_len: u32, |
| 2879 | 2875 | decl_val_deps_len: u32, |
| 2880 | 2876 | namespace_deps_len: u32, |
| ... | ... | @@ -2882,28 +2878,39 @@ const Header = extern struct { |
| 2882 | 2878 | first_dependency_len: u32, |
| 2883 | 2879 | dep_entries_len: u32, |
| 2884 | 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 | 2895 | /// Note that all state that is included in the cache hash namespace is *not* |
| 2890 | 2896 | /// saved, such as the target and most CLI flags. A cache hit will only occur |
| 2891 | 2897 | /// when subsequent compiler invocations use the same set of flags. |
| 2892 | 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 | 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 | 2909 | if (comp.module) |zcu| { |
| 2899 | 2910 | const ip = &zcu.intern_pool; |
| 2900 | 2911 | const header: Header = .{ |
| 2901 | 2912 | .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), |
| 2907 | 2914 | .src_hash_deps_len = @intCast(ip.src_hash_deps.count()), |
| 2908 | 2915 | .decl_val_deps_len = @intCast(ip.decl_val_deps.count()), |
| 2909 | 2916 | .namespace_deps_len = @intCast(ip.namespace_deps.count()), |
| ... | ... | @@ -2911,38 +2918,54 @@ pub fn saveState(comp: *Compilation) !void { |
| 2911 | 2918 | .first_dependency_len = @intCast(ip.first_dependency.count()), |
| 2912 | 2919 | .dep_entries_len = @intCast(ip.dep_entries.items.len), |
| 2913 | 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)); |
| 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 |
| 2946 | 2969 | } |
| 2947 | 2970 | var basename_buf: [255]u8 = undefined; |
| 2948 | 2971 | const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{ |
| ... | ... | @@ -2956,20 +2979,14 @@ pub fn saveState(comp: *Compilation) !void { |
| 2956 | 2979 | // the previous incremental compilation state. |
| 2957 | 2980 | var af = try lf.emit.directory.handle.atomicFile(basename, .{}); |
| 2958 | 2981 | defer af.deinit(); |
| 2959 | | try af.file.pwritevAll(bufs_list[0..bufs_len], 0); |
| 2982 | try af.file.pwritevAll(bufs.items, 0); |
| 2960 | 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 | 2987 | // Even when len=0, the undefined pointer might cause EFAULT. |
| 2965 | 2988 | 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 }); |
| 2973 | 2990 | } |
| 2974 | 2991 | |
| 2975 | 2992 | /// This function is temporally single-threaded. |