[meta] Tweak generation of settings/registers;

This commit is contained in:
Benjamin Bouvier
2019-03-11 19:14:07 +01:00
parent 393b88af6e
commit f3f449b45b
5 changed files with 29 additions and 23 deletions

View File

@@ -132,9 +132,9 @@ fn gen_isa(isa: &TargetIsa, fmt: &mut Formatter) {
fmtln!(fmt, "}"); fmtln!(fmt, "}");
} }
pub fn generate(isa: &TargetIsa, base_filename: &str, out_dir: &str) -> Result<(), error::Error> { pub fn generate(isa: &TargetIsa, filename: &str, out_dir: &str) -> Result<(), error::Error> {
let mut fmt = Formatter::new(); let mut fmt = Formatter::new();
gen_isa(&isa, &mut fmt); gen_isa(&isa, &mut fmt);
fmt.update_file(format!("{}-{}.rs", base_filename, isa.name), out_dir)?; fmt.update_file(filename, out_dir)?;
Ok(()) Ok(())
} }

View File

@@ -1,16 +1,14 @@
use crate::cdsl::camel_case; use crate::cdsl::camel_case;
use crate::cdsl::isa::TargetIsa;
use crate::cdsl::settings::{ use crate::cdsl::settings::{
BoolSetting, Predicate, Preset, Setting, SettingGroup, SpecificSetting, BoolSetting, Predicate, Preset, Setting, SettingGroup, SpecificSetting,
}; };
use crate::constant_hash::{generate_table, simple_hash}; use crate::constant_hash::{generate_table, simple_hash};
use crate::error; use crate::error;
use crate::shared;
use crate::srcgen::{Formatter, Match}; use crate::srcgen::{Formatter, Match};
use crate::unique_table::UniqueSeqTable; use crate::unique_table::UniqueSeqTable;
use std::collections::HashMap; use std::collections::HashMap;
enum ParentGroup { pub enum ParentGroup {
None, None,
Shared, Shared,
} }
@@ -187,12 +185,12 @@ fn gen_getters(group: &SettingGroup, fmt: &mut Formatter) {
fmt.doc_comment("Get a view of the boolean predicates."); fmt.doc_comment("Get a view of the boolean predicates.");
fmtln!( fmtln!(
fmt, fmt,
"pub fn predicate_view(&self) -> ::settings::PredicateView {" "pub fn predicate_view(&self) -> crate::settings::PredicateView {"
); );
fmt.indent(|fmt| { fmt.indent(|fmt| {
fmtln!( fmtln!(
fmt, fmt,
"::settings::PredicateView::new(&self.bytes[{}..])", "crate::settings::PredicateView::new(&self.bytes[{}..])",
group.bool_start_byte_offset group.bool_start_byte_offset
); );
}); });
@@ -441,17 +439,14 @@ fn gen_group(group: &SettingGroup, parent: ParentGroup, fmt: &mut Formatter) {
gen_display(group, fmt); gen_display(group, fmt);
} }
pub fn generate_common(filename: &str, out_dir: &str) -> Result<SettingGroup, error::Error> { pub fn generate(
let settings = shared::settings::generate(); settings: &SettingGroup,
parent_group: ParentGroup,
filename: &str,
out_dir: &str,
) -> Result<(), error::Error> {
let mut fmt = Formatter::new(); let mut fmt = Formatter::new();
gen_group(&settings, ParentGroup::None, &mut fmt); gen_group(&settings, parent_group, &mut fmt);
fmt.update_file(filename, out_dir)?; fmt.update_file(filename, out_dir)?;
Ok(settings)
}
pub fn generate(isa: &TargetIsa, prefix: &str, out_dir: &str) -> Result<(), error::Error> {
let mut fmt = Formatter::new();
gen_group(&isa.settings, ParentGroup::Shared, &mut fmt);
fmt.update_file(format!("{}-{}.rs", prefix, isa.name), out_dir)?;
Ok(()) Ok(())
} }

View File

@@ -20,16 +20,27 @@ pub fn isa_from_arch(arch: &str) -> Result<isa::Isa, String> {
/// Generates all the Rust source files used in Cranelift from the meta-language. /// Generates all the Rust source files used in Cranelift from the meta-language.
pub fn generate(isas: &Vec<isa::Isa>, out_dir: &str) -> Result<(), error::Error> { pub fn generate(isas: &Vec<isa::Isa>, out_dir: &str) -> Result<(), error::Error> {
// Common definitions. // Common definitions.
let shared_settings = gen_settings::generate_common("new_settings.rs", &out_dir)?; let settings = shared::settings::define();
gen_settings::generate(
&settings,
gen_settings::ParentGroup::None,
"new_settings.rs",
&out_dir,
)?;
gen_types::generate("types.rs", &out_dir)?; gen_types::generate("types.rs", &out_dir)?;
// Per ISA definitions. // Per ISA definitions.
let isas = isa::define(isas, &shared_settings); let isas = isa::define(isas, &settings);
for isa in isas { for isa in isas {
gen_registers::generate(&isa, "registers", &out_dir)?; gen_registers::generate(&isa, &format!("registers-{}.rs", isa.name), &out_dir)?;
gen_settings::generate(&isa, "new_settings", &out_dir)?; gen_settings::generate(
&isa.settings,
gen_settings::ParentGroup::Shared,
&format!("new_settings-{}", isa.name),
&out_dir,
)?;
} }
Ok(()) Ok(())

View File

@@ -1,6 +1,6 @@
use crate::cdsl::settings::{SettingGroup, SettingGroupBuilder}; use crate::cdsl::settings::{SettingGroup, SettingGroupBuilder};
pub fn generate() -> SettingGroup { pub fn define() -> SettingGroup {
let mut settings = SettingGroupBuilder::new("shared"); let mut settings = SettingGroupBuilder::new("shared");
settings.add_enum( settings.add_enum(

View File

@@ -113,7 +113,7 @@ impl Iterator for FloatIterator {
/// A type representing CPU flags. /// A type representing CPU flags.
/// ///
/// Flags can't be stored in memory. /// Flags can't be stored in memory.
#[derive(Debug, Clone, Copy, Eq, PartialEq)] #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum Flag { pub enum Flag {
/// CPU flags from an integer comparison. /// CPU flags from an integer comparison.
IFlags, IFlags,