vicis-core 0.2.0

Manipulate LLVM-IR in Pure Rust
Documentation
mod parser;

pub use parser::{parse, parse_global_type_and_const};

use crate::ir::{
    module::{linkage::Linkage, name::Name, unnamed_addr::UnnamedAddr},
    types::{Type, Types},
    value::ConstantData,
};

#[derive(Clone)]
pub struct GlobalVariable {
    pub name: Name,
    pub linkage: Option<Linkage>,
    pub unnamed_addr: Option<UnnamedAddr>,
    pub is_constant: bool,
    pub ty: Type,
    pub init: Option<ConstantData>,
    pub align: u32,
}

impl GlobalVariable {
    pub fn to_string(&self, types: &Types) -> String {
        format!(
            "@{} = {}{}{}{} {}{}",
            self.name,
            self.linkage
                .map_or("".to_string(), |linkage| format!("{:?} ", linkage)),
            self.unnamed_addr
                .map_or("".to_string(), |u| format!("{:?} ", u)),
            if self.is_constant {
                "constant "
            } else {
                "global "
            },
            types.to_string(self.ty),
            self.init.as_ref().map_or("".to_string(), |init| {
                if matches!(init, ConstantData::AggregateZero) {
                    "zeroinitializer".to_string()
                } else {
                    init.to_string(types)
                }
            }),
            if self.align == 0 {
                "".to_string()
            } else {
                format!(", align {}", self.align)
            }
        )
    }
}