Skip to main content

vicis_core/ir/module/metadata/
mod.rs

1pub mod parser;
2
3pub use parser::operand as parse_operand;
4pub use parser::parse;
5
6use crate::ir::{module::name::Name, value::ConstantInt};
7use std::fmt;
8
9#[derive(PartialEq, Clone)]
10pub enum Metadata {
11    String(String),
12    Name(Name),
13    Int(ConstantInt),
14    Node(Vec<Self>),
15}
16
17// struct MetadataNode(Vec<Metadata>);
18
19// Metadata Node
20
21impl fmt::Debug for Metadata {
22    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23        fn fmt_int(i: &ConstantInt, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24            // TODO: Find another simpler way
25            match i {
26                ConstantInt::Int1(_) => write!(f, "i1 "),
27                ConstantInt::Int8(_) => write!(f, "i8 "),
28                ConstantInt::Int32(_) => write!(f, "i32 "),
29                ConstantInt::Int64(_) => write!(f, "i64 "),
30            }?;
31            write!(f, "{}", i)
32        }
33
34        match self {
35            Self::String(s) => write!(f, "!\"{}\"", s),
36            Self::Name(n) => write!(f, "!{}", n),
37            Self::Int(i) => fmt_int(i, f),
38            Self::Node(list) => {
39                write!(f, "!{{")?;
40                for (k, m) in list.iter().enumerate() {
41                    if k == 0 {
42                        write!(f, "{:?}", m)?;
43                    } else {
44                        write!(f, ", {:?}", m)?;
45                    }
46                }
47                write!(f, "}}")
48            }
49        }
50    }
51}