vicis_core/ir/module/global_variable/
mod.rs1mod 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}