| //! This crate generates Rust sources for use by |
| //! [`cranelift_codegen`](../cranelift_codegen/index.html). |
| |
| #[macro_use] |
| mod cdsl; |
| mod srcgen; |
| |
| pub mod error; |
| pub mod isa; |
| |
| mod gen_inst; |
| mod gen_settings; |
| mod gen_types; |
| |
| mod constant_hash; |
| mod shared; |
| mod unique_table; |
| |
| /// Generate an ISA from an architecture string (e.g. "x86_64"). |
| pub fn isa_from_arch(arch: &str) -> Result<isa::Isa, String> { |
| isa::Isa::from_arch(arch).ok_or_else(|| format!("no supported isa found for arch `{}`", arch)) |
| } |
| |
| /// Generates all the Rust source files used in Cranelift from the meta-language. |
| pub fn generate(isas: &[isa::Isa], out_dir: &str, isle_dir: &str) -> Result<(), error::Error> { |
| // Common definitions. |
| let shared_defs = shared::define(); |
| |
| gen_settings::generate( |
| &shared_defs.settings, |
| gen_settings::ParentGroup::None, |
| "settings.rs", |
| out_dir, |
| )?; |
| gen_types::generate("types.rs", out_dir)?; |
| |
| gen_inst::generate( |
| &shared_defs.all_formats, |
| &shared_defs.all_instructions, |
| "opcodes.rs", |
| "inst_builder.rs", |
| "clif_opt.isle", |
| "clif_lower.isle", |
| out_dir, |
| isle_dir, |
| )?; |
| |
| // Per ISA definitions. |
| for isa in isa::define(isas) { |
| gen_settings::generate( |
| &isa.settings, |
| gen_settings::ParentGroup::Shared, |
| &format!("settings-{}.rs", isa.name), |
| out_dir, |
| )?; |
| } |
| |
| Ok(()) |
| } |