mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-09 15:19:07 +00:00
Compilation: restore saveState
This commit is contained in:
parent
2ff49751aa
commit
ad55fb7a20
1 changed files with 66 additions and 49 deletions
|
|
@ -2870,11 +2870,7 @@ pub fn makeBinFileWritable(comp: *Compilation) !void {
|
||||||
|
|
||||||
const Header = extern struct {
|
const Header = extern struct {
|
||||||
intern_pool: extern struct {
|
intern_pool: extern struct {
|
||||||
//items_len: u32,
|
thread_count: u32,
|
||||||
//extra_len: u32,
|
|
||||||
//limbs_len: u32,
|
|
||||||
//string_bytes_len: u32,
|
|
||||||
//tracked_insts_len: u32,
|
|
||||||
src_hash_deps_len: u32,
|
src_hash_deps_len: u32,
|
||||||
decl_val_deps_len: u32,
|
decl_val_deps_len: u32,
|
||||||
namespace_deps_len: u32,
|
namespace_deps_len: u32,
|
||||||
|
|
@ -2882,28 +2878,39 @@ const Header = extern struct {
|
||||||
first_dependency_len: u32,
|
first_dependency_len: u32,
|
||||||
dep_entries_len: u32,
|
dep_entries_len: u32,
|
||||||
free_dep_entries_len: u32,
|
free_dep_entries_len: u32,
|
||||||
//files_len: u32,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
const PerThread = extern struct {
|
||||||
|
intern_pool: extern struct {
|
||||||
|
items_len: u32,
|
||||||
|
extra_len: u32,
|
||||||
|
limbs_len: u32,
|
||||||
|
string_bytes_len: u32,
|
||||||
|
tracked_insts_len: u32,
|
||||||
|
files_len: u32,
|
||||||
|
},
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Note that all state that is included in the cache hash namespace is *not*
|
/// Note that all state that is included in the cache hash namespace is *not*
|
||||||
/// saved, such as the target and most CLI flags. A cache hit will only occur
|
/// saved, such as the target and most CLI flags. A cache hit will only occur
|
||||||
/// when subsequent compiler invocations use the same set of flags.
|
/// when subsequent compiler invocations use the same set of flags.
|
||||||
pub fn saveState(comp: *Compilation) !void {
|
pub fn saveState(comp: *Compilation) !void {
|
||||||
var bufs_list: [21]std.posix.iovec_const = undefined;
|
|
||||||
var bufs_len: usize = 0;
|
|
||||||
|
|
||||||
const lf = comp.bin_file orelse return;
|
const lf = comp.bin_file orelse return;
|
||||||
|
|
||||||
|
const gpa = comp.gpa;
|
||||||
|
|
||||||
|
var bufs = std.ArrayList(std.posix.iovec_const).init(gpa);
|
||||||
|
defer bufs.deinit();
|
||||||
|
|
||||||
|
var pt_headers = std.ArrayList(Header.PerThread).init(gpa);
|
||||||
|
defer pt_headers.deinit();
|
||||||
|
|
||||||
if (comp.module) |zcu| {
|
if (comp.module) |zcu| {
|
||||||
const ip = &zcu.intern_pool;
|
const ip = &zcu.intern_pool;
|
||||||
const header: Header = .{
|
const header: Header = .{
|
||||||
.intern_pool = .{
|
.intern_pool = .{
|
||||||
//.items_len = @intCast(ip.items.len),
|
.thread_count = @intCast(ip.locals.len),
|
||||||
//.extra_len = @intCast(ip.extra.items.len),
|
|
||||||
//.limbs_len = @intCast(ip.limbs.items.len),
|
|
||||||
//.string_bytes_len = @intCast(ip.string_bytes.items.len),
|
|
||||||
//.tracked_insts_len = @intCast(ip.tracked_insts.count()),
|
|
||||||
.src_hash_deps_len = @intCast(ip.src_hash_deps.count()),
|
.src_hash_deps_len = @intCast(ip.src_hash_deps.count()),
|
||||||
.decl_val_deps_len = @intCast(ip.decl_val_deps.count()),
|
.decl_val_deps_len = @intCast(ip.decl_val_deps.count()),
|
||||||
.namespace_deps_len = @intCast(ip.namespace_deps.count()),
|
.namespace_deps_len = @intCast(ip.namespace_deps.count()),
|
||||||
|
|
@ -2911,38 +2918,54 @@ pub fn saveState(comp: *Compilation) !void {
|
||||||
.first_dependency_len = @intCast(ip.first_dependency.count()),
|
.first_dependency_len = @intCast(ip.first_dependency.count()),
|
||||||
.dep_entries_len = @intCast(ip.dep_entries.items.len),
|
.dep_entries_len = @intCast(ip.dep_entries.items.len),
|
||||||
.free_dep_entries_len = @intCast(ip.free_dep_entries.items.len),
|
.free_dep_entries_len = @intCast(ip.free_dep_entries.items.len),
|
||||||
//.files_len = @intCast(ip.files.entries.len),
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
addBuf(&bufs_list, &bufs_len, mem.asBytes(&header));
|
|
||||||
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.limbs.items));
|
|
||||||
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.extra.items));
|
|
||||||
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.items.items(.data)));
|
|
||||||
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.items.items(.tag)));
|
|
||||||
//addBuf(&bufs_list, &bufs_len, ip.string_bytes.items);
|
|
||||||
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.tracked_insts.keys()));
|
|
||||||
|
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.src_hash_deps.keys()));
|
try pt_headers.ensureTotalCapacityPrecise(header.intern_pool.thread_count);
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.src_hash_deps.values()));
|
for (ip.locals) |*local| pt_headers.appendAssumeCapacity(.{
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.decl_val_deps.keys()));
|
.intern_pool = .{
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.decl_val_deps.values()));
|
.items_len = @intCast(local.mutate.items.len),
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_deps.keys()));
|
.extra_len = @intCast(local.mutate.extra.len),
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_deps.values()));
|
.limbs_len = @intCast(local.mutate.limbs.len),
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_name_deps.keys()));
|
.string_bytes_len = @intCast(local.mutate.strings.len),
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.namespace_name_deps.values()));
|
.tracked_insts_len = @intCast(local.mutate.tracked_insts.len),
|
||||||
|
.files_len = @intCast(local.mutate.files.len),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.first_dependency.keys()));
|
try bufs.ensureTotalCapacityPrecise(14 + 8 * pt_headers.items.len);
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.first_dependency.values()));
|
addBuf(&bufs, mem.asBytes(&header));
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.dep_entries.items));
|
addBuf(&bufs, mem.sliceAsBytes(pt_headers.items));
|
||||||
addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.free_dep_entries.items));
|
|
||||||
|
|
||||||
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.files.keys()));
|
addBuf(&bufs, mem.sliceAsBytes(ip.src_hash_deps.keys()));
|
||||||
//addBuf(&bufs_list, &bufs_len, mem.sliceAsBytes(ip.files.values()));
|
addBuf(&bufs, mem.sliceAsBytes(ip.src_hash_deps.values()));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(ip.decl_val_deps.keys()));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(ip.decl_val_deps.values()));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(ip.namespace_deps.keys()));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(ip.namespace_deps.values()));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(ip.namespace_name_deps.keys()));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(ip.namespace_name_deps.values()));
|
||||||
|
|
||||||
// TODO: compilation errors
|
addBuf(&bufs, mem.sliceAsBytes(ip.first_dependency.keys()));
|
||||||
// TODO: namespaces
|
addBuf(&bufs, mem.sliceAsBytes(ip.first_dependency.values()));
|
||||||
// TODO: decls
|
addBuf(&bufs, mem.sliceAsBytes(ip.dep_entries.items));
|
||||||
// TODO: linker state
|
addBuf(&bufs, mem.sliceAsBytes(ip.free_dep_entries.items));
|
||||||
|
|
||||||
|
for (ip.locals, pt_headers.items) |*local, pt_header| {
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(local.shared.limbs.view().items(.@"0")[0..pt_header.intern_pool.limbs_len]));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(local.shared.extra.view().items(.@"0")[0..pt_header.intern_pool.extra_len]));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(local.shared.items.view().items(.data)[0..pt_header.intern_pool.items_len]));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(local.shared.items.view().items(.tag)[0..pt_header.intern_pool.items_len]));
|
||||||
|
addBuf(&bufs, local.shared.strings.view().items(.@"0")[0..pt_header.intern_pool.string_bytes_len]);
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(local.shared.tracked_insts.view().items(.@"0")[0..pt_header.intern_pool.tracked_insts_len]));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(local.shared.files.view().items(.bin_digest)[0..pt_header.intern_pool.files_len]));
|
||||||
|
addBuf(&bufs, mem.sliceAsBytes(local.shared.files.view().items(.root_decl)[0..pt_header.intern_pool.files_len]));
|
||||||
|
}
|
||||||
|
|
||||||
|
//// TODO: compilation errors
|
||||||
|
//// TODO: namespaces
|
||||||
|
//// TODO: decls
|
||||||
|
//// TODO: linker state
|
||||||
}
|
}
|
||||||
var basename_buf: [255]u8 = undefined;
|
var basename_buf: [255]u8 = undefined;
|
||||||
const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{
|
const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{
|
||||||
|
|
@ -2956,20 +2979,14 @@ pub fn saveState(comp: *Compilation) !void {
|
||||||
// the previous incremental compilation state.
|
// the previous incremental compilation state.
|
||||||
var af = try lf.emit.directory.handle.atomicFile(basename, .{});
|
var af = try lf.emit.directory.handle.atomicFile(basename, .{});
|
||||||
defer af.deinit();
|
defer af.deinit();
|
||||||
try af.file.pwritevAll(bufs_list[0..bufs_len], 0);
|
try af.file.pwritevAll(bufs.items, 0);
|
||||||
try af.finish();
|
try af.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn addBuf(bufs_list: []std.posix.iovec_const, bufs_len: *usize, buf: []const u8) void {
|
fn addBuf(list: *std.ArrayList(std.posix.iovec_const), buf: []const u8) void {
|
||||||
// Even when len=0, the undefined pointer might cause EFAULT.
|
// Even when len=0, the undefined pointer might cause EFAULT.
|
||||||
if (buf.len == 0) return;
|
if (buf.len == 0) return;
|
||||||
|
list.appendAssumeCapacity(.{ .base = buf.ptr, .len = buf.len });
|
||||||
const i = bufs_len.*;
|
|
||||||
bufs_len.* = i + 1;
|
|
||||||
bufs_list[i] = .{
|
|
||||||
.base = buf.ptr,
|
|
||||||
.len = buf.len,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This function is temporally single-threaded.
|
/// This function is temporally single-threaded.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue