Stage ABI-scoped unit generations

This commit is contained in:
udo
2026-07-18 14:09:38 +00:00
parent 810c19b042
commit 1952c7d762
27 changed files with 302 additions and 53 deletions
+60 -10
View File
@@ -1,6 +1,7 @@
#include "compiler.h"
#include "compiler-parser.h"
#include "hash.h"
#include "../wasm/abi.h"
#include <algorithm>
#include <cerrno>
#include <chrono>
@@ -16,7 +17,7 @@
namespace {
const u64 UCE_UNIT_ABI_VERSION = 11;
const u64 UCE_UNIT_ABI_VERSION = UCE_COMPILER_UNIT_ABI_VERSION;
struct SharedUnitFilesystemState
{
@@ -35,6 +36,8 @@ struct SharedUnitFilesystemState
time_t required_time = 0;
u64 metadata_abi_version = 0;
u64 runtime_abi_version = UCE_UNIT_ABI_VERSION;
u64 metadata_wasm_core_abi_version = 0;
u64 runtime_wasm_core_abi_version = UCE_WASM_CORE_ABI_VERSION;
String metadata_content;
String compile_output_content;
String metadata_build_token;
@@ -262,7 +265,8 @@ String compiler_unit_input_signature(Request* context, SharedUnit* su, bool allo
return(
compiler_unit_source_signature(su->file_name, allow_recent_source_stat) + ":" +
gen_sha1(file_get_contents(setup_template)) + ":" +
std::to_string(UCE_UNIT_ABI_VERSION)
std::to_string(UCE_UNIT_ABI_VERSION) + ":" +
std::to_string(UCE_WASM_CORE_ABI_VERSION)
);
}
@@ -281,6 +285,7 @@ String compiler_unit_metadata_text(Request* context, SharedUnit* su, String inpu
return(
"format=uce-unit-metadata-v1\n"
"unit_abi_version=" + std::to_string(UCE_UNIT_ABI_VERSION) + "\n"
"wasm_core_abi_version=" + std::to_string(UCE_WASM_CORE_ABI_VERSION) + "\n"
"source_path=" + su->file_name + "\n"
"input_signature=" + input_signature + "\n"
"build_token=" + compiler_unit_build_token() + "\n"
@@ -387,7 +392,7 @@ time_t compiler_runtime_abi_time(Request* context)
String compiler_registry_file_name(Request* context)
{
return(context->server->config["BIN_DIRECTORY"] + "/known-uce-files.txt");
return(compiler_unit_bin_directory(context) + "/known-uce-files.txt");
}
String compiler_registry_lock_file_name(Request* context)
@@ -397,12 +402,12 @@ String compiler_registry_lock_file_name(Request* context)
String compiler_priority_file_name(Request* context)
{
return(context->server->config["BIN_DIRECTORY"] + "/proactive-priority.txt");
return(compiler_unit_bin_directory(context) + "/proactive-priority.txt");
}
String compiler_source_generation_file_name(Request* context)
{
return(context->server->config["BIN_DIRECTORY"] + "/source-generation.txt");
return(compiler_unit_bin_directory(context) + "/source-generation.txt");
}
int compiler_open_lock_file(String file_name, String purpose, bool nonblocking = false)
@@ -553,6 +558,9 @@ SharedUnitFilesystemState inspect_shared_unit_filesystem(Request* context, Share
auto input_it = metadata.find("input_signature");
if(input_it != metadata.end())
state.metadata_input_signature = input_it->second;
auto core_abi_it = metadata.find("wasm_core_abi_version");
if(core_abi_it != metadata.end() && compiler_is_u64_string(core_abi_it->second))
state.metadata_wasm_core_abi_version = (u64)atoll(core_abi_it->second.c_str());
auto source_it = metadata.find("source_path");
if(source_it != metadata.end())
state.metadata_source_path = source_it->second;
@@ -562,7 +570,11 @@ SharedUnitFilesystemState inspect_shared_unit_filesystem(Request* context, Share
}
if(state.compile_output_exists)
state.compile_output_content = file_get_contents(su->compile_output_file_name);
state.abi_compatible = (state.metadata_parsed && state.metadata_abi_version == state.runtime_abi_version);
state.abi_compatible = (
state.metadata_parsed &&
state.metadata_abi_version == state.runtime_abi_version &&
state.metadata_wasm_core_abi_version == state.runtime_wasm_core_abi_version
);
state.input_signature_matches = (
state.metadata_parsed &&
state.metadata_input_signature != "" &&
@@ -791,7 +803,23 @@ String compiler_generated_cpp_path(Request* context, String source_file)
{
if(!context || !context->server || source_file == "")
return("");
return(context->server->config["BIN_DIRECTORY"] + dirname(source_file) + "/" + basename(source_file) + ".cpp");
return(compiler_unit_bin_directory(context) + dirname(source_file) + "/" + basename(source_file) + ".cpp");
}
String compiler_unit_bin_directory(Request* context)
{
if(!context || !context->server)
return("");
return(path_join(
context->server->config["BIN_DIRECTORY"],
"units-c" + std::to_string(UCE_UNIT_ABI_VERSION) +
"-w" + std::to_string(UCE_WASM_CORE_ABI_VERSION)
));
}
String compiler_unit_wasm_path(Request* context, String source_file)
{
return(compiler_unit_bin_directory(context) + source_file + ".wasm");
}
String compiler_generated_cpp_path(SharedUnit* su)
@@ -809,8 +837,8 @@ void setup_unit_paths(Request* context, SharedUnit* su, String file_name)
return;
su->src_path = dirname(file_name);
su->bin_path = context->server->config["BIN_DIRECTORY"] + su->src_path;
su->pre_path = context->server->config["BIN_DIRECTORY"] + su->src_path;
su->bin_path = compiler_unit_bin_directory(context) + su->src_path;
su->pre_path = compiler_unit_bin_directory(context) + su->src_path;
su->src_file_name = basename(file_name);
su->wasm_file_name = su->src_file_name + ".wasm";
@@ -1023,7 +1051,7 @@ SharedUnit* compiler_get_shared_unit_internal(Request* context, String file_name
SharedUnit* su = new SharedUnit();
setup_unit_paths(context, su, file_name);
bool can_serve_stale = !force_recompile && compiler_request_can_serve_stale_artifact(context);
bool can_serve_stale = !force_recompile && compiler_unit_can_serve_stale_artifact(context, file_name);
int fdlock = compiler_open_lock_file(su->wasm_name + ".lock", "shared-unit:" + file_name, can_serve_stale);
if(fdlock == -2 && file_exists(su->wasm_name))
{
@@ -1178,6 +1206,26 @@ bool compiler_request_can_serve_stale_artifact(Request* context)
float_val(context->server->config["PROACTIVE_COMPILE_CHECK_INTERVAL"]) > 0);
}
bool compiler_unit_can_serve_stale_artifact(Request* context, String file_name)
{
if(!compiler_request_can_serve_stale_artifact(context))
return(false);
file_name = compiler_normalize_unit_path(context, file_name);
if(file_name == "")
return(false);
SharedUnit su;
setup_unit_paths(context, &su, file_name);
auto state = inspect_shared_unit_filesystem(context, &su, true);
return(
state.source_exists &&
state.compiled_time != 0 &&
state.metadata_exists &&
state.metadata_parsed &&
state.abi_compatible &&
state.metadata_source_path == file_name
);
}
void compiler_prioritize_unit(Request* context, String file_name)
{
if(!compiler_request_can_serve_stale_artifact(context))
@@ -1493,6 +1541,8 @@ DValue unit_info(String path)
info["required_mtime"] = (f64)fs_state.required_time;
info["runtime_abi_version"] = (f64)fs_state.runtime_abi_version;
info["metadata_abi_version"] = (f64)fs_state.metadata_abi_version;
info["runtime_wasm_core_abi_version"] = (f64)fs_state.runtime_wasm_core_abi_version;
info["metadata_wasm_core_abi_version"] = (f64)fs_state.metadata_wasm_core_abi_version;
info["current_input_signature"] = fs_state.current_input_signature;
info["metadata_input_signature"] = fs_state.metadata_input_signature;
info["metadata_build_token"] = fs_state.metadata_build_token;