{"id":18130296,"url":"https://github.com/playxe/b3-rs","last_synced_at":"2025-04-15T06:55:29.132Z","repository":{"id":148262144,"uuid":"615606862","full_name":"playXE/b3-rs","owner":"playXE","description":"JIT codegen backend with SSA IR based on B3 from WebKit","archived":false,"fork":false,"pushed_at":"2023-10-26T17:13:06.000Z","size":978,"stargazers_count":62,"open_issues_count":9,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-15T06:55:22.307Z","etag":null,"topics":["compiler","graphcoloring","irc","jit","linearscan","optimizations","ssa","webkit"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/playXE.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-18T06:09:14.000Z","updated_at":"2025-01-25T04:36:24.000Z","dependencies_parsed_at":"2024-11-16T11:14:27.725Z","dependency_job_id":null,"html_url":"https://github.com/playXE/b3-rs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/playXE%2Fb3-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/playXE%2Fb3-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/playXE%2Fb3-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/playXE%2Fb3-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/playXE","download_url":"https://codeload.github.com/playXE/b3-rs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249023713,"owners_count":21199958,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compiler","graphcoloring","irc","jit","linearscan","optimizations","ssa","webkit"],"created_at":"2024-11-01T11:07:14.095Z","updated_at":"2025-04-15T06:55:29.117Z","avatar_url":"https://github.com/playXE.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# b3-rs\n\nBackend based on [Bare Bones Backend](https://webkit.org/docs/b3/) from WebKit. I am making it for educational purposes. \n\n## Usage\n\nSee examples and `src/tests.rs`.\n\nHere's iterative factorial generator:\n\n```rust\n// imports ARGUMENT_GPR0\nuse b3::macroassembler::jit::gpr_info::*;\n\nfn main() {\n    let opts = b3::Options::default();\n    let mut proc = b3::Procedure::new(opts);\n\n    // Create entry block. The argument to `add_block` is block frequency. \n    // Blocks with different frequences are ordered differently. By default\n    // they are recalculated before lowering to Assembly IR.\n    // set `opts.estimate_static_execution_counts` to `false` to use user provided frequency.\n    let entry = proc.add_block(1.0);\n\n    let mut builder = b3::BasicBlockBuilder::new(\u0026mut proc, entry);\n\n    // Argument management is offloaded to client code. Here we load argument from first GPR argument register,\n    // it is RDI on x86-64\n    let number = builder.argument(b3::Reg::new_gpr(ARGUMENT_GPR0), b3::Type::Int32);\n\n    // Declare variables. They are automatically converted to SSA form.\n    let i = builder.procedure.add_variable(b3::Type::Int32);\n    let factorial = builder.procedure.add_variable(b3::Type::Int32);\n\n    // Create blocks for `for` loop. \n    let for_header = builder.procedure.add_block(1.0);\n    let for_body = builder.procedure.add_block(1.0);\n    let for_exit = builder.procedure.add_block(1.0);\n\n    let one = builder.const32(1);\n    builder.var_set(factorial, one);\n    builder.var_set(i, one);\n\n    builder.jump(Some(for_header));\n\n    builder.block = for_header;\n\n    let i_value = builder.var_get(i);\n    let cmp = builder.binary(b3::Opcode::LessEqual, i_value, number);\n\n    // Conditional branch.\n    builder.branch(cmp, for_body, (for_exit, b3::Frequency::Normal));\n\n    builder.block = for_body;\n\n    let i_value = builder.var_get(i);\n    let factorial_value = builder.var_get(factorial);\n    let mul = builder.binary(b3::Opcode::Mul, i_value, factorial_value);\n    builder.var_set(factorial, mul);\n\n    let i_value = builder.var_get(i);\n    let one = builder.const32(1);\n    let add = builder.binary(b3::Opcode::Add, i_value, one);\n\n    builder.var_set(i, add);\n\n    builder.jump(Some(for_header));\n\n    builder.block = for_exit;\n\n    let factorial_value = builder.var_get(factorial);\n    builder.return_(Some(factorial_value));\n\n    // Compiles B3 IR down to machine code. \n    let compilation = b3::compile(proc);\n    // use `entrypoint(0)` to get first entrypoint of code. \n    // NOTE: Multiple entrypoints are not yet supported.\n    let func: extern \"C\" fn(i32) -\u003e i32 = unsafe { std::mem::transmute(compilation.entrypoint(0)) };\n\n    assert_eq!(func(5), 120);\n}\n```\n\n## Contributors\n\n- [PROMETHIA](https://github.com/PROMETHIA-27) - helped to fix UB and port B3 to stable toolchain.\n\n## Licensing\n\nOriginal B3 code belongs to WebKit and is licensed under BSD-2. Rust port of B3 because of that is also licensed with BSD-2 license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplayxe%2Fb3-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplayxe%2Fb3-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplayxe%2Fb3-rs/lists"}