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