Skip to main content

cranelift_codegen_meta/
lib.rs

1//! This crate generates Rust sources for use by
2//! [`cranelift_codegen`](../cranelift_codegen/index.html).
3#[macro_use]
4mod cdsl;
5mod srcgen;
6
7pub mod error;
8pub mod isa;
9
10mod gen_binemit;
11mod gen_encodings;
12mod gen_inst;
13mod gen_legalizer;
14mod gen_registers;
15mod gen_settings;
16mod gen_types;
17
18mod default_map;
19mod shared;
20mod unique_table;
21
22/// Generate an ISA from an architecture string (e.g. "x86_64").
23pub fn isa_from_arch(arch: &str) -> Result<isa::Isa, String> {
24    isa::Isa::from_arch(arch).ok_or_else(|| format!("no supported isa found for arch `{}`", arch))
25}
26
27/// Generates all the Rust source files used in Cranelift from the meta-language.
28pub fn generate(isas: &[isa::Isa], out_dir: &str) -> Result<(), error::Error> {
29    // Create all the definitions:
30    // - common definitions.
31    let mut shared_defs = shared::define();
32
33    gen_settings::generate(
34        &shared_defs.settings,
35        gen_settings::ParentGroup::None,
36        "settings.rs",
37        &out_dir,
38    )?;
39    gen_types::generate("types.rs", &out_dir)?;
40
41    // - per ISA definitions.
42    let isas = isa::define(isas, &mut shared_defs);
43
44    // At this point, all definitions are done.
45    let all_formats = shared_defs.verify_instruction_formats();
46
47    // Generate all the code.
48    gen_inst::generate(
49        all_formats,
50        &shared_defs.all_instructions,
51        "opcodes.rs",
52        "inst_builder.rs",
53        &out_dir,
54    )?;
55
56    gen_legalizer::generate(&isas, &shared_defs.transform_groups, "legalize", &out_dir)?;
57
58    for isa in isas {
59        gen_registers::generate(&isa, &format!("registers-{}.rs", isa.name), &out_dir)?;
60
61        gen_settings::generate(
62            &isa.settings,
63            gen_settings::ParentGroup::Shared,
64            &format!("settings-{}.rs", isa.name),
65            &out_dir,
66        )?;
67
68        gen_encodings::generate(
69            &shared_defs,
70            &isa,
71            &format!("encoding-{}.rs", isa.name),
72            &out_dir,
73        )?;
74
75        gen_binemit::generate(
76            &isa.name,
77            &isa.recipes,
78            &format!("binemit-{}.rs", isa.name),
79            &out_dir,
80        )?;
81    }
82
83    Ok(())
84}