llvm_scratch/core/target_datalayout/
datalayout.rs1use std::fmt;
2
3use crate::core::target_datalayout as td;
4
5macro_rules! option_field_str {
6 ($container:ident, $member:ident) => {
7 match &$container.$member {
8 Some(v) => v.to_string(),
9 None => String::new(),
10 }
11 };
12}
13
14#[derive(PartialEq, PartialOrd, Eq, Ord, Debug)]
15pub struct TargetDataLayout {
16 pub endian: Option<td::Endian>,
17 pub mangling: Option<td::Mangling>,
18 pub integer_alignment: Option<td::IntegerAlignment>,
19 pub float_alignment: Option<td::FloatAlignment>,
20 pub native_integer_width: Option<td::NativeIntegerWidth>,
21}
22
23impl fmt::Display for TargetDataLayout {
24 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25 let layout_strs = vec![
26 option_field_str!(self, endian),
27 option_field_str!(self, mangling),
28 option_field_str!(self, integer_alignment),
29 option_field_str!(self, float_alignment),
30 option_field_str!(self, native_integer_width),
31 ]
32 .iter()
33 .filter(|st| !st.is_empty())
34 .map(|opt_str| opt_str.to_string())
35 .collect::<Vec<_>>();
36
37 write!(f, "{}", layout_strs.join("-"))
38 }
39}
40
41#[cfg(test)]
42mod macro_tests {
43 #[test]
44 fn test_option_field_str_macro() {
45 struct Sample {
46 foo: Option<i64>,
47 bar: Option<i64>,
48 }
49
50 let sample = Sample {
51 foo: Some(30),
52 bar: None,
53 };
54
55 assert_eq!("30".to_string(), option_field_str!(sample, foo));
56
57 assert_eq!(String::new(), option_field_str!(sample, bar));
58 }
59}