Skip to main content

vicis_core/ir/module/global_variable/
mod.rs

1mod parser;
2
3pub use parser::{parse, parse_global_type_and_const};
4
5use crate::ir::{
6    module::{linkage::Linkage, name::Name, unnamed_addr::UnnamedAddr},
7    types::{Type, Types},
8    value::ConstantData,
9};
10
11#[derive(Clone)]
12pub struct GlobalVariable {
13    pub name: Name,
14    pub linkage: Option<Linkage>,
15    pub unnamed_addr: Option<UnnamedAddr>,
16    pub is_constant: bool,
17    pub ty: Type,
18    pub init: Option<ConstantData>,
19    pub align: u32,
20}
21
22impl GlobalVariable {
23    pub fn to_string(&self, types: &Types) -> String {
24        format!(
25            "@{} = {}{}{}{} {}{}",
26            self.name,
27            self.linkage
28                .map_or("".to_string(), |linkage| format!("{:?} ", linkage)),
29            self.unnamed_addr
30                .map_or("".to_string(), |u| format!("{:?} ", u)),
31            if self.is_constant {
32                "constant "
33            } else {
34                "global "
35            },
36            types.to_string(self.ty),
37            self.init.as_ref().map_or("".to_string(), |init| {
38                if matches!(init, ConstantData::AggregateZero) {
39                    "zeroinitializer".to_string()
40                } else {
41                    init.to_string(types)
42                }
43            }),
44            if self.align == 0 {
45                "".to_string()
46            } else {
47                format!(", align {}", self.align)
48            }
49        )
50    }
51}