1 //! This crate generates Rust sources for use by
2 //! [`cranelift_codegen`](../cranelift_codegen/index.html).
3 #[macro_use]
4 mod cdsl;
5 mod srcgen;
6 
7 pub mod error;
8 pub mod isa;
9 
10 mod gen_binemit;
11 mod gen_encodings;
12 mod gen_inst;
13 mod gen_legalizer;
14 mod gen_registers;
15 mod gen_settings;
16 mod gen_types;
17 
18 mod default_map;
19 mod shared;
20 mod unique_table;
21 
22 /// Generate an ISA from an architecture string (e.g. "x86_64").
23 pub 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.
28 pub 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 }
85