@@ -2870,79 +2870,102 @@ 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 ,
2881
2877
namespace_name_deps_len : u32 ,
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 ()),
2910
2917
.namespace_name_deps_len = @intCast (ip .namespace_name_deps .count ()),
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.
0 commit comments