Enforce all OperandKind have documentation

This commit is contained in:
bjorn3
2021-10-31 19:27:12 +01:00
parent e8f3c0c6a9
commit f84e1c16c7
3 changed files with 98 additions and 40 deletions

View File

@@ -130,19 +130,15 @@ impl OperandKind {
rust_field_name: &'static str, rust_field_name: &'static str,
rust_type: &'static str, rust_type: &'static str,
fields: OperandKindFields, fields: OperandKindFields,
doc: &'static str,
) -> Self { ) -> Self {
Self { Self {
rust_field_name, rust_field_name,
rust_type, rust_type,
fields, fields,
doc: None, doc: Some(doc),
} }
} }
pub fn with_doc(mut self, doc: &'static str) -> Self {
assert!(self.doc.is_none());
self.doc = Some(doc);
self
}
fn doc(&self) -> Option<&str> { fn doc(&self) -> Option<&str> {
if let Some(doc) = &self.doc { if let Some(doc) = &self.doc {
return Some(doc); return Some(doc);
@@ -152,18 +148,19 @@ impl OperandKind {
OperandKindFields::ImmEnum(_) OperandKindFields::ImmEnum(_)
| OperandKindFields::ImmValue | OperandKindFields::ImmValue
| OperandKindFields::EntityRef | OperandKindFields::EntityRef
| OperandKindFields::VariableArgs => None, | OperandKindFields::VariableArgs => unreachable!(),
} }
} }
} }
impl Into<OperandKind> for &TypeVar { impl Into<OperandKind> for &TypeVar {
fn into(self) -> OperandKind { fn into(self) -> OperandKind {
OperandKind::new( OperandKind {
"value", rust_field_name: "value",
"ir::Value", rust_type: "ir::Value",
OperandKindFields::TypeVar(self.into()), fields: OperandKindFields::TypeVar(self.into()),
) doc: None,
}
} }
} }
impl Into<OperandKind> for &OperandKind { impl Into<OperandKind> for &OperandKind {

View File

@@ -2,7 +2,12 @@ use crate::cdsl::operands::{OperandKind, OperandKindFields};
/// Small helper to initialize an OperandBuilder with the right kind, for a given name and doc. /// Small helper to initialize an OperandBuilder with the right kind, for a given name and doc.
fn new(format_field_name: &'static str, rust_type: &'static str, doc: &'static str) -> OperandKind { fn new(format_field_name: &'static str, rust_type: &'static str, doc: &'static str) -> OperandKind {
OperandKind::new(format_field_name, rust_type, OperandKindFields::EntityRef).with_doc(doc) OperandKind::new(
format_field_name,
rust_type,
OperandKindFields::EntityRef,
doc,
)
} }
pub(crate) struct EntityRefs { pub(crate) struct EntityRefs {
@@ -59,7 +64,10 @@ impl EntityRefs {
table: new("table", "ir::Table", "A table."), table: new("table", "ir::Table", "A table."),
varargs: OperandKind::new("", "&[Value]", OperandKindFields::VariableArgs).with_doc( varargs: OperandKind::new(
"",
"&[Value]",
OperandKindFields::VariableArgs,
r#" r#"
A variable size list of `value` operands. A variable size list of `value` operands.

View File

@@ -73,40 +73,76 @@ pub(crate) struct Immediates {
pub atomic_rmw_op: OperandKind, pub atomic_rmw_op: OperandKind,
} }
fn new_imm(format_field_name: &'static str, rust_type: &'static str) -> OperandKind { fn new_imm(
OperandKind::new(format_field_name, rust_type, OperandKindFields::ImmValue) format_field_name: &'static str,
rust_type: &'static str,
doc: &'static str,
) -> OperandKind {
OperandKind::new(
format_field_name,
rust_type,
OperandKindFields::ImmValue,
doc,
)
} }
fn new_enum( fn new_enum(
format_field_name: &'static str, format_field_name: &'static str,
rust_type: &'static str, rust_type: &'static str,
values: EnumValues, values: EnumValues,
doc: &'static str,
) -> OperandKind { ) -> OperandKind {
OperandKind::new( OperandKind::new(
format_field_name, format_field_name,
rust_type, rust_type,
OperandKindFields::ImmEnum(values), OperandKindFields::ImmEnum(values),
doc,
) )
} }
impl Immediates { impl Immediates {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
imm64: new_imm("imm", "ir::immediates::Imm64").with_doc("A 64-bit immediate integer."), imm64: new_imm(
uimm8: new_imm("imm", "ir::immediates::Uimm8") "imm",
.with_doc("An 8-bit immediate unsigned integer."), "ir::immediates::Imm64",
uimm32: new_imm("imm", "ir::immediates::Uimm32") "A 64-bit immediate integer.",
.with_doc("A 32-bit immediate unsigned integer."), ),
uimm128: new_imm("imm", "ir::Immediate") uimm8: new_imm(
.with_doc("A 128-bit immediate unsigned integer."), "imm",
pool_constant: new_imm("constant_handle", "ir::Constant") "ir::immediates::Uimm8",
.with_doc("A constant stored in the constant pool."), "An 8-bit immediate unsigned integer.",
offset32: new_imm("offset", "ir::immediates::Offset32") ),
.with_doc("A 32-bit immediate signed offset."), uimm32: new_imm(
ieee32: new_imm("imm", "ir::immediates::Ieee32") "imm",
.with_doc("A 32-bit immediate floating point number."), "ir::immediates::Uimm32",
ieee64: new_imm("imm", "ir::immediates::Ieee64") "A 32-bit immediate unsigned integer.",
.with_doc("A 64-bit immediate floating point number."), ),
boolean: new_imm("imm", "bool").with_doc("An immediate boolean."), uimm128: new_imm(
"imm",
"ir::Immediate",
"A 128-bit immediate unsigned integer.",
),
pool_constant: new_imm(
"constant_handle",
"ir::Constant",
"A constant stored in the constant pool.",
),
offset32: new_imm(
"offset",
"ir::immediates::Offset32",
"A 32-bit immediate signed offset.",
),
ieee32: new_imm(
"imm",
"ir::immediates::Ieee32",
"A 32-bit immediate floating point number.",
),
ieee64: new_imm(
"imm",
"ir::immediates::Ieee64",
"A 64-bit immediate floating point number.",
),
boolean: new_imm("imm", "bool", "An immediate boolean."),
intcc: { intcc: {
let mut intcc_values = HashMap::new(); let mut intcc_values = HashMap::new();
intcc_values.insert("eq", "Equal"); intcc_values.insert("eq", "Equal");
@@ -121,8 +157,12 @@ impl Immediates {
intcc_values.insert("ult", "UnsignedLessThan"); intcc_values.insert("ult", "UnsignedLessThan");
intcc_values.insert("of", "Overflow"); intcc_values.insert("of", "Overflow");
intcc_values.insert("nof", "NotOverflow"); intcc_values.insert("nof", "NotOverflow");
new_enum("cond", "ir::condcodes::IntCC", intcc_values) new_enum(
.with_doc("An integer comparison condition code.") "cond",
"ir::condcodes::IntCC",
intcc_values,
"An integer comparison condition code.",
)
}, },
floatcc: { floatcc: {
@@ -141,18 +181,27 @@ impl Immediates {
floatcc_values.insert("ule", "UnorderedOrLessThanOrEqual"); floatcc_values.insert("ule", "UnorderedOrLessThanOrEqual");
floatcc_values.insert("ugt", "UnorderedOrGreaterThan"); floatcc_values.insert("ugt", "UnorderedOrGreaterThan");
floatcc_values.insert("uge", "UnorderedOrGreaterThanOrEqual"); floatcc_values.insert("uge", "UnorderedOrGreaterThanOrEqual");
new_enum("cond", "ir::condcodes::FloatCC", floatcc_values) new_enum(
.with_doc("A floating point comparison condition code") "cond",
"ir::condcodes::FloatCC",
floatcc_values,
"A floating point comparison condition code",
)
}, },
memflags: new_imm("flags", "ir::MemFlags").with_doc("Memory operation flags"), memflags: new_imm("flags", "ir::MemFlags", "Memory operation flags"),
trapcode: { trapcode: {
let mut trapcode_values = HashMap::new(); let mut trapcode_values = HashMap::new();
trapcode_values.insert("stk_ovf", "StackOverflow"); trapcode_values.insert("stk_ovf", "StackOverflow");
trapcode_values.insert("heap_oob", "HeapOutOfBounds"); trapcode_values.insert("heap_oob", "HeapOutOfBounds");
trapcode_values.insert("int_ovf", "IntegerOverflow"); trapcode_values.insert("int_ovf", "IntegerOverflow");
trapcode_values.insert("int_divz", "IntegerDivisionByZero"); trapcode_values.insert("int_divz", "IntegerDivisionByZero");
new_enum("code", "ir::TrapCode", trapcode_values).with_doc("A trap reason code.") new_enum(
"code",
"ir::TrapCode",
trapcode_values,
"A trap reason code.",
)
}, },
atomic_rmw_op: { atomic_rmw_op: {
let mut atomic_rmw_op_values = HashMap::new(); let mut atomic_rmw_op_values = HashMap::new();
@@ -167,8 +216,12 @@ impl Immediates {
atomic_rmw_op_values.insert("umax", "Umax"); atomic_rmw_op_values.insert("umax", "Umax");
atomic_rmw_op_values.insert("smin", "Smin"); atomic_rmw_op_values.insert("smin", "Smin");
atomic_rmw_op_values.insert("smax", "Smax"); atomic_rmw_op_values.insert("smax", "Smax");
new_enum("op", "ir::AtomicRmwOp", atomic_rmw_op_values) new_enum(
.with_doc("Atomic Read-Modify-Write Ops") "op",
"ir::AtomicRmwOp",
atomic_rmw_op_values,
"Atomic Read-Modify-Write Ops",
)
}, },
} }
} }