diff --git a/Cargo.lock b/Cargo.lock index 8837f744..9bc37664 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1118,6 +1118,9 @@ dependencies = [ [[package]] name = "oxide_bytecode" version = "0.1.0" +dependencies = [ + "oxide_log", +] [[package]] name = "oxide_cfg" @@ -1126,6 +1129,7 @@ dependencies = [ "oxide_bytecode", "oxide_emit", "oxide_ir", + "oxide_log", "oxide_parser", ] @@ -1185,6 +1189,7 @@ dependencies = [ "oxide_emit", "oxide_ir", "oxide_liveness", + "oxide_log", "oxide_parser", "oxide_vm", ] @@ -1195,6 +1200,7 @@ version = "0.1.0" dependencies = [ "oxide_bytecode", "oxide_ir", + "oxide_log", "oxide_parser", "regex", "regress", @@ -1205,6 +1211,7 @@ name = "oxide_ir" version = "0.1.0" dependencies = [ "oxide_bytecode", + "oxide_log", "smallvec", ] @@ -1231,6 +1238,7 @@ dependencies = [ "oxide_cfg", "oxide_emit", "oxide_ir", + "oxide_log", "oxide_parser", ] @@ -1254,6 +1262,7 @@ dependencies = [ "oxc_semantic", "oxc_span", "oxc_syntax", + "oxide_log", ] [[package]] @@ -1267,6 +1276,7 @@ dependencies = [ "oxide_emit", "oxide_ir", "oxide_liveness", + "oxide_log", "oxide_parser", "oxide_vm", ] @@ -1276,6 +1286,7 @@ name = "oxide_runtime_api" version = "0.1.0" dependencies = [ "oxide_kernel", + "oxide_log", "oxide_types", "ryu", ] @@ -1302,6 +1313,7 @@ version = "0.1.0" dependencies = [ "bumpalo", "hashbrown 0.14.5", + "oxide_log", "proptest", "rustc-hash", ] diff --git a/crates/oxide_bytecode/Cargo.toml b/crates/oxide_bytecode/Cargo.toml index ed73f348..298cb98e 100644 --- a/crates/oxide_bytecode/Cargo.toml +++ b/crates/oxide_bytecode/Cargo.toml @@ -7,3 +7,4 @@ rust-version.workspace = true description = "OxideJS - Shared bytecode protocol and compiled module ABI" [dependencies] +oxide_log = { path = "../oxide_log" } diff --git a/crates/oxide_bytecode/src/bytecode_log.rs b/crates/oxide_bytecode/src/bytecode_log.rs new file mode 100644 index 00000000..db222d4b --- /dev/null +++ b/crates/oxide_bytecode/src/bytecode_log.rs @@ -0,0 +1,37 @@ +//! bytecode 日志宏:`bytecode_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 编译管线属 Kernel 子系统,`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志。 + +#[macro_export] +macro_rules! bytecode_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! bytecode_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! bytecode_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! bytecode_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! bytecode_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_bytecode/src/lib.rs b/crates/oxide_bytecode/src/lib.rs index 97805159..c8bf8c8e 100644 --- a/crates/oxide_bytecode/src/lib.rs +++ b/crates/oxide_bytecode/src/lib.rs @@ -1,5 +1,8 @@ #![doc = "OxideJS - Shared bytecode protocol and compiled module ABI"] +/// bytecode 日志宏(`bytecode_error`/`bytecode_info` 等),target 为 `oxide::kernel`。 +mod bytecode_log; + /// 编译产物与常量池 ABI([`CompiledModule`] / [`Constant`])。 pub mod module; /// 操作码表与指令编解码([`OpCode`] / [`Instr`])。 diff --git a/crates/oxide_cfg/Cargo.toml b/crates/oxide_cfg/Cargo.toml index e30079a9..671c19af 100644 --- a/crates/oxide_cfg/Cargo.toml +++ b/crates/oxide_cfg/Cargo.toml @@ -9,6 +9,7 @@ description = "OxideJS - basic block partition and CFG analysis pass over IR" [dependencies] oxide_ir = { path = "../oxide_ir" } oxide_bytecode = { path = "../oxide_bytecode" } +oxide_log = { path = "../oxide_log" } [dev-dependencies] oxide_parser = { path = "../oxide_parser" } diff --git a/crates/oxide_cfg/src/cfg_log.rs b/crates/oxide_cfg/src/cfg_log.rs new file mode 100644 index 00000000..92d4f09c --- /dev/null +++ b/crates/oxide_cfg/src/cfg_log.rs @@ -0,0 +1,37 @@ +//! CFG 日志宏:`cfg_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 编译管线属 Kernel 子系统,`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志。 + +#[macro_export] +macro_rules! cfg_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! cfg_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! cfg_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! cfg_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! cfg_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_cfg/src/lib.rs b/crates/oxide_cfg/src/lib.rs index f4bd2d87..38bb1efd 100644 --- a/crates/oxide_cfg/src/lib.rs +++ b/crates/oxide_cfg/src/lib.rs @@ -8,6 +8,7 @@ //! (异常边)→ `finalize`(exit 哨兵 + preds 反推)。每阶段是独立文件的纯函数, //! 中间产物(heads / blocks / exit_id)显式传参,无共享可变状态。 +mod cfg_log; mod exception; mod finalize; mod partition; @@ -93,7 +94,9 @@ pub fn build_cfg(f: &IRFunction) -> Cfg { let heads = partition::partition_blocks(f); let (mut blocks, exit_id) = split::split_and_edges(f, &heads); exception::add_exception_edges(f, &mut blocks); - finalize::finalize(blocks, exit_id) + let cfg = finalize::finalize(blocks, exit_id); + cfg_debug!("build_cfg: {} blocks", cfg.blocks.len()); + cfg } #[cfg(test)] diff --git a/crates/oxide_compiler/src/compiler.rs b/crates/oxide_compiler/src/compiler.rs index 5029c0d1..9d084d27 100644 --- a/crates/oxide_compiler/src/compiler.rs +++ b/crates/oxide_compiler/src/compiler.rs @@ -43,8 +43,10 @@ impl Compiler { pub fn compile(&self, program: &oxide_parser::Program) -> Result { crate::compiler_debug!("compile: starting..."); let mut ir = Emitter::new().emit_program(program)?; + crate::compiler_debug!("compile: after emit {} insts", ir.insts.len()); if self.enable_dce { oxide_dce::dce(&mut ir); // 顶层函数;nested 不递归 + crate::compiler_debug!("compile: after DCE {} insts", ir.insts.len()); } if self.enable_regalloc && !ir.const_overflow { // 优化管线:liveness → 精确 DCE → 重算 liveness → RegAlloc @@ -56,6 +58,7 @@ impl Compiler { let cfg2 = oxide_cfg::build_cfg(&ir); // 精确 DCE 删指令后 inst 下标位移,CFG 重建 let live2 = oxide_liveness::liveness(&ir, &cfg2); // 重算,绝不用过期 live oxide_regalloc::alloc(&mut ir, &live2)?; // 无可行染色 → RangeError 上抛 + crate::compiler_debug!("compile: after regalloc {} insts", ir.insts.len()); } crate::compiler_debug!("compile: done, {} instructions", ir.insts.len()); let mut module = lower(&ir)?; diff --git a/crates/oxide_dce/Cargo.toml b/crates/oxide_dce/Cargo.toml index dab2a2bb..400104a6 100644 --- a/crates/oxide_dce/Cargo.toml +++ b/crates/oxide_dce/Cargo.toml @@ -11,6 +11,7 @@ oxide_ir = { path = "../oxide_ir" } oxide_cfg = { path = "../oxide_cfg" } oxide_bytecode = { path = "../oxide_bytecode" } oxide_liveness = { path = "../oxide_liveness" } +oxide_log = { path = "../oxide_log" } [dev-dependencies] oxide_parser = { path = "../oxide_parser" } diff --git a/crates/oxide_dce/src/dce_log.rs b/crates/oxide_dce/src/dce_log.rs new file mode 100644 index 00000000..56e46ede --- /dev/null +++ b/crates/oxide_dce/src/dce_log.rs @@ -0,0 +1,37 @@ +//! DCE 日志宏:`dce_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 编译管线属 Kernel 子系统,`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志。 + +#[macro_export] +macro_rules! dce_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! dce_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! dce_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! dce_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! dce_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_dce/src/lib.rs b/crates/oxide_dce/src/lib.rs index dde63c76..3108baf8 100644 --- a/crates/oxide_dce/src/lib.rs +++ b/crates/oxide_dce/src/lib.rs @@ -13,6 +13,7 @@ //! 精确二轮 `dce_precise`:liveness 驱动的死指令 + 局部死 STORE_VAR 删除, //! 消费 `oxide_liveness::LiveInfo`,mark-sweep 重建复用 Pass C。 +mod dce_log; mod iter_sweep; mod precise_sweep; mod reachability; @@ -31,6 +32,8 @@ pub fn dce(f: &mut IRFunction) { let mut keep = reachability::pass_a_reachable(f); // Pass B:可达存活指令上全函数 use 计数迭代删除到不动点(连锁删上游写者)。 iter_sweep::pass_b_dead_code(f, &mut keep); + let dead = keep.iter().filter(|k| !**k).count(); + dce_info!("DCE: removing {} dead instructions", dead); // Pass C:mark-sweep 一次性重建 insts + label_pos 重映射。 rebuild::pass_c_sweep(f, &keep); } diff --git a/crates/oxide_emit/Cargo.toml b/crates/oxide_emit/Cargo.toml index 6805ace0..251d3053 100644 --- a/crates/oxide_emit/Cargo.toml +++ b/crates/oxide_emit/Cargo.toml @@ -10,6 +10,7 @@ description = "OxideJS - AST to IR emit pass" oxide_parser = { path = "../oxide_parser" } oxide_bytecode = { path = "../oxide_bytecode" } oxide_ir = { path = "../oxide_ir" } +oxide_log = { path = "../oxide_log" } regex.workspace = true regress.workspace = true diff --git a/crates/oxide_emit/src/emit.rs b/crates/oxide_emit/src/emit.rs index 4fb172be..604a5459 100644 --- a/crates/oxide_emit/src/emit.rs +++ b/crates/oxide_emit/src/emit.rs @@ -1270,6 +1270,7 @@ impl Emitter { /// 调用方为 `oxide_compiler::Compiler::compile`:本函数完成 emit 半程, /// 随后由 `oxide_ir::lower::lower` 降为字节码。 pub fn emit_program(&self, program: &oxide_parser::Program) -> Result { + crate::emit_debug!("emit_program: {} stmts", program.body.len()); let mut ctx = CompileCtx::new(); // 脚本顶层:var/function 声明需落到全局对象,let/const/class 不进全局。 ctx.is_global_scope = true; diff --git a/crates/oxide_emit/src/emit_log.rs b/crates/oxide_emit/src/emit_log.rs new file mode 100644 index 00000000..8046d9c4 --- /dev/null +++ b/crates/oxide_emit/src/emit_log.rs @@ -0,0 +1,37 @@ +//! emit 日志宏:`emit_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 编译管线属 Kernel 子系统,`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志。 + +#[macro_export] +macro_rules! emit_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! emit_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! emit_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! emit_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! emit_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_emit/src/lib.rs b/crates/oxide_emit/src/lib.rs index 7ca5fb29..3df1f338 100644 --- a/crates/oxide_emit/src/lib.rs +++ b/crates/oxide_emit/src/lib.rs @@ -8,6 +8,7 @@ pub mod class; pub mod closure; pub mod emit; +mod emit_log; pub mod emit_ctx; pub mod expr; pub mod prepass; diff --git a/crates/oxide_ir/Cargo.toml b/crates/oxide_ir/Cargo.toml index a60f3d7f..e2160f73 100644 --- a/crates/oxide_ir/Cargo.toml +++ b/crates/oxide_ir/Cargo.toml @@ -8,4 +8,5 @@ description = "OxideJS - IR intermediate representation and lowering to bytecode [dependencies] oxide_bytecode = { path = "../oxide_bytecode" } +oxide_log = { path = "../oxide_log" } smallvec.workspace = true diff --git a/crates/oxide_ir/src/ir_log.rs b/crates/oxide_ir/src/ir_log.rs new file mode 100644 index 00000000..d5b1c1d8 --- /dev/null +++ b/crates/oxide_ir/src/ir_log.rs @@ -0,0 +1,37 @@ +//! IR 日志宏:`ir_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 编译管线属 Kernel 子系统,`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志。 + +#[macro_export] +macro_rules! ir_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! ir_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! ir_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! ir_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! ir_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_ir/src/lib.rs b/crates/oxide_ir/src/lib.rs index 03dbd0f5..c6200873 100644 --- a/crates/oxide_ir/src/lib.rs +++ b/crates/oxide_ir/src/lib.rs @@ -13,6 +13,7 @@ pub mod contract; pub mod inst; +mod ir_log; pub mod lower; pub mod operand; diff --git a/crates/oxide_ir/src/lower.rs b/crates/oxide_ir/src/lower.rs index bbfacb4d..b58319cf 100644 --- a/crates/oxide_ir/src/lower.rs +++ b/crates/oxide_ir/src/lower.rs @@ -15,6 +15,7 @@ use crate::IRFunction; /// IRFunction → CompiledModule 等价转换。溢出/标签错误消息为既有格式,逐字保持一致。 pub fn lower(f: &IRFunction) -> Result { + crate::ir_debug!("lower: {} insts", f.insts.len()); // 溢出检查 1:常量池(先于寄存器——超大常量池伴生的海量 vreg 会使后续检查的 // 稠密 bitset 表示爆内存;常量池超限是更基础的失效,先报它) if f.const_overflow || f.constants.len() > u16::MAX as usize { diff --git a/crates/oxide_liveness/Cargo.toml b/crates/oxide_liveness/Cargo.toml index e7c1760f..1f491614 100644 --- a/crates/oxide_liveness/Cargo.toml +++ b/crates/oxide_liveness/Cargo.toml @@ -9,6 +9,7 @@ description = "OxideJS - liveness analysis pass over IR (CFG dataflow + per-inst [dependencies] oxide_ir = { path = "../oxide_ir" } oxide_cfg = { path = "../oxide_cfg" } +oxide_log = { path = "../oxide_log" } [dev-dependencies] oxide_parser = { path = "../oxide_parser" } diff --git a/crates/oxide_liveness/src/lib.rs b/crates/oxide_liveness/src/lib.rs index 28d192eb..d4a55bb6 100644 --- a/crates/oxide_liveness/src/lib.rs +++ b/crates/oxide_liveness/src/lib.rs @@ -7,6 +7,7 @@ mod dataflow; mod live_info; +mod liveness_log; mod ranges; pub use live_info::LiveInfo; @@ -20,6 +21,7 @@ pub fn liveness(f: &IRFunction, cfg: &Cfg) -> LiveInfo { if f.insts.is_empty() { return LiveInfo::new(); } + liveness_debug!("liveness: {} blocks, {} insts", cfg.blocks.len(), f.insts.len()); let (block_in, block_out, reg_count) = dataflow::block_liveness(f, cfg); let (inst_before, inst_after) = ranges::inst_liveness(f, cfg, &block_out, &block_in, reg_count); LiveInfo { diff --git a/crates/oxide_liveness/src/liveness_log.rs b/crates/oxide_liveness/src/liveness_log.rs new file mode 100644 index 00000000..df5ded8d --- /dev/null +++ b/crates/oxide_liveness/src/liveness_log.rs @@ -0,0 +1,37 @@ +//! liveness 日志宏:`liveness_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 编译管线属 Kernel 子系统,`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志。 + +#[macro_export] +macro_rules! liveness_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! liveness_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! liveness_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! liveness_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! liveness_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_parser/Cargo.toml b/crates/oxide_parser/Cargo.toml index 339dce47..2ae63ce4 100644 --- a/crates/oxide_parser/Cargo.toml +++ b/crates/oxide_parser/Cargo.toml @@ -7,6 +7,7 @@ rust-version.workspace = true description = "OxideJS - JavaScript parser (oxc_parser re-export)" [dependencies] +oxide_log = { path = "../oxide_log" } oxc_parser.workspace = true oxc_allocator.workspace = true oxc_ast.workspace = true diff --git a/crates/oxide_parser/src/lib.rs b/crates/oxide_parser/src/lib.rs index 0492ba24..b0ccf835 100644 --- a/crates/oxide_parser/src/lib.rs +++ b/crates/oxide_parser/src/lib.rs @@ -1,6 +1,7 @@ #![doc = "OxideJS - JavaScript parser (oxc_parser re-export)"] mod error; +mod parser_log; /// 解析错误:消息 + 源文件字节区间(起始,结束)。 pub use error::OxideError; diff --git a/crates/oxide_parser/src/parser_log.rs b/crates/oxide_parser/src/parser_log.rs new file mode 100644 index 00000000..009d61f0 --- /dev/null +++ b/crates/oxide_parser/src/parser_log.rs @@ -0,0 +1,37 @@ +//! parser 日志宏:`parser_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 编译管线属 Kernel 子系统,`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志。 + +#[macro_export] +macro_rules! parser_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! parser_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! parser_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! parser_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! parser_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_regalloc/Cargo.toml b/crates/oxide_regalloc/Cargo.toml index ab571077..b0d1e2f5 100644 --- a/crates/oxide_regalloc/Cargo.toml +++ b/crates/oxide_regalloc/Cargo.toml @@ -11,6 +11,7 @@ oxide_ir = { path = "../oxide_ir" } oxide_liveness = { path = "../oxide_liveness" } oxide_bytecode = { path = "../oxide_bytecode" } oxide_cfg = { path = "../oxide_cfg" } +oxide_log = { path = "../oxide_log" } [dev-dependencies] oxide_parser = { path = "../oxide_parser" } diff --git a/crates/oxide_regalloc/src/lib.rs b/crates/oxide_regalloc/src/lib.rs index 7dd409c5..8876e504 100644 --- a/crates/oxide_regalloc/src/lib.rs +++ b/crates/oxide_regalloc/src/lib.rs @@ -10,6 +10,7 @@ mod alloc_map; mod color; mod finish; mod graph; +mod regalloc_log; mod rewrite; pub use alloc_map::{Alloc, AllocMap, FreshKind, FreshVreg, SpillPlan}; @@ -50,6 +51,7 @@ pub fn alloc(f: &mut IRFunction, live: &LiveInfo) -> Result<(), String> { oxide_liveness::liveness(f, &cfg) }; let map = color(f, &live)?; + regalloc_debug!("alloc: {} vregs -> {} phys", map.map.len(), map.phys_peak); rewrite::run(f, &map); finish::run(f, &map); for child in &mut f.nested { diff --git a/crates/oxide_regalloc/src/regalloc_log.rs b/crates/oxide_regalloc/src/regalloc_log.rs new file mode 100644 index 00000000..523c1bb2 --- /dev/null +++ b/crates/oxide_regalloc/src/regalloc_log.rs @@ -0,0 +1,37 @@ +//! RegAlloc 日志宏:`regalloc_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 编译管线属 Kernel 子系统,`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志。 + +#[macro_export] +macro_rules! regalloc_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! regalloc_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! regalloc_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! regalloc_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! regalloc_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_runtime_api/Cargo.toml b/crates/oxide_runtime_api/Cargo.toml index cd1ce93f..37e3c3fb 100644 --- a/crates/oxide_runtime_api/Cargo.toml +++ b/crates/oxide_runtime_api/Cargo.toml @@ -9,4 +9,5 @@ description = "OxideJS - VmHost trait: the abstract Vm interface builtins are wr [dependencies] oxide_types = { path = "../oxide_types" } oxide_kernel = { path = "../oxide_kernel" } +oxide_log = { path = "../oxide_log" } ryu.workspace = true diff --git a/crates/oxide_runtime_api/src/lib.rs b/crates/oxide_runtime_api/src/lib.rs index fa71cc31..c8ef3011 100644 --- a/crates/oxide_runtime_api/src/lib.rs +++ b/crates/oxide_runtime_api/src/lib.rs @@ -10,6 +10,8 @@ //! trait 面向泛型而非对象安全:单态化 `H = Vm` 使每个 `host.*()` 调用内联, //! 相对 builtins 直接位于 `oxide_vm` 内部没有运行时开销。 +mod runtime_api_log; + use std::sync::Arc; use oxide_kernel::kernel::{KernelCore, KernelSession}; diff --git a/crates/oxide_runtime_api/src/runtime_api_log.rs b/crates/oxide_runtime_api/src/runtime_api_log.rs new file mode 100644 index 00000000..423a0677 --- /dev/null +++ b/crates/oxide_runtime_api/src/runtime_api_log.rs @@ -0,0 +1,38 @@ +//! runtime_api 日志宏:`runtime_api_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 接口层供编译管线与运行时共享,日志归 Kernel 子系统 +//! (`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志)。 + +#[macro_export] +macro_rules! runtime_api_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! runtime_api_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! runtime_api_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! runtime_api_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! runtime_api_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +} diff --git a/crates/oxide_types/Cargo.toml b/crates/oxide_types/Cargo.toml index 15008e82..7ebd159e 100644 --- a/crates/oxide_types/Cargo.toml +++ b/crates/oxide_types/Cargo.toml @@ -9,6 +9,7 @@ description = "OxideJS - Shared core types (JsValue, JsObject, Shape, P, Epoch)" [dependencies] bumpalo.workspace = true hashbrown.workspace = true +oxide_log = { path = "../oxide_log" } rustc-hash.workspace = true [dev-dependencies] diff --git a/crates/oxide_types/src/lib.rs b/crates/oxide_types/src/lib.rs index 4a4debc7..531262fe 100644 --- a/crates/oxide_types/src/lib.rs +++ b/crates/oxide_types/src/lib.rs @@ -13,5 +13,8 @@ pub mod shape; /// ECMAScript 值(NaN-boxing 的 `JsValue`)。 pub mod value; +/// 类型层日志宏(`types_error`/`types_info` 等),target 为 `oxide::kernel`。 +mod types_log; + /// 重导出 [`error`] 模块的运行时错误类型。 pub use error::{JsError, JsErrorKind}; diff --git a/crates/oxide_types/src/types_log.rs b/crates/oxide_types/src/types_log.rs new file mode 100644 index 00000000..03cbf373 --- /dev/null +++ b/crates/oxide_types/src/types_log.rs @@ -0,0 +1,38 @@ +//! 类型层日志宏:`types_error!/warn!/info!/debug!/trace!`,经由 oxide_log 上报。 +//! 类型层供编译管线与运行时共享,日志归 Kernel 子系统 +//! (`OXIDE_LOG=oxide::kernel=debug` 控制本 crate 日志)。 + +#[macro_export] +macro_rules! types_error { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::ERROR, $($arg)*) + }; +} + +#[macro_export] +macro_rules! types_warn { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::WARN, $($arg)*) + }; +} + +#[macro_export] +macro_rules! types_info { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::INFO, $($arg)*) + }; +} + +#[macro_export] +macro_rules! types_debug { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::DEBUG, $($arg)*) + }; +} + +#[macro_export] +macro_rules! types_trace { + ($($arg:tt)*) => { + oxide_log::__log_event!("oxide::kernel", oxide_log::tracing::Level::TRACE, $($arg)*) + }; +}