cranelift_codegen_meta/
lib.rs

1//! This crate generates Rust sources for use by
2//! [`cranelift_codegen`](../cranelift_codegen/index.html).
3
4use shared::Definitions;
5
6#[macro_use]
7mod cdsl;
8mod srcgen;
9
10pub mod error;
11pub mod isa;
12pub mod isle;
13
14mod gen_inst;
15mod gen_isle;
16mod gen_settings;
17mod gen_types;
18
19mod constant_hash;
20mod shared;
21mod unique_table;
22
23/// Generate an ISA from an architecture string (e.g. "x86_64").
24pub fn isa_from_arch(arch: &str) -> Result<isa::Isa, String> {
25    isa::Isa::from_arch(arch).ok_or_else(|| format!("no supported isa found for arch `{}`", arch))
26}
27
28/// Generates all the Rust source files used in Cranelift from the meta-language.
29pub fn generate_rust(isas: &[isa::Isa], out_dir: &std::path::Path) -> Result<(), error::Error> {
30    let shared_defs = shared::define();
31    generate_rust_for_shared_defs(&shared_defs, isas, out_dir)
32}
33
34fn generate_rust_for_shared_defs(
35    shared_defs: &Definitions,
36    isas: &[isa::Isa],
37    out_dir: &std::path::Path,
38) -> Result<(), error::Error> {
39    gen_settings::generate(
40        &shared_defs.settings,
41        gen_settings::ParentGroup::None,
42        "settings.rs",
43        out_dir,
44    )?;
45
46    gen_types::generate("types.rs", out_dir)?;
47
48    gen_inst::generate(
49        &shared_defs.all_formats,
50        &shared_defs.all_instructions,
51        "opcodes.rs",
52        "inst_builder.rs",
53        out_dir,
54    )?;
55
56    // Per ISA definitions.
57    for isa in isa::define(isas) {
58        gen_settings::generate(
59            &isa.settings,
60            gen_settings::ParentGroup::Shared,
61            &format!("settings-{}.rs", isa.name),
62            out_dir,
63        )?;
64    }
65
66    Ok(())
67}
68
69/// Generates all the ISLE source files used in Cranelift from the meta-language.
70pub fn generate_isle(isle_dir: &std::path::Path) -> Result<(), error::Error> {
71    let shared_defs = shared::define();
72    generate_isle_for_shared_defs(&shared_defs, isle_dir)
73}
74
75fn generate_isle_for_shared_defs(
76    shared_defs: &Definitions,
77    isle_dir: &std::path::Path,
78) -> Result<(), error::Error> {
79    gen_isle::generate(
80        &shared_defs.all_formats,
81        &shared_defs.all_instructions,
82        "clif_opt.isle",
83        "clif_lower.isle",
84        isle_dir,
85    )
86}
87
88/// Generates all the source files used in Cranelift from the meta-language.
89pub fn generate(
90    isas: &[isa::Isa],
91    out_dir: &std::path::Path,
92    isle_dir: &std::path::Path,
93) -> Result<(), error::Error> {
94    let shared_defs = shared::define();
95    generate_rust_for_shared_defs(&shared_defs, isas, out_dir)?;
96    generate_isle_for_shared_defs(&shared_defs, isle_dir)?;
97    Ok(())
98}