use crate::context::{ConstId, GlobalId, TypeId};
#[derive(Clone, Debug, PartialEq)]
pub enum ConstantData {
Int { ty: TypeId, val: u64 },
IntWide { ty: TypeId, words: Vec<u64> },
Float { ty: TypeId, bits: u64 },
Null(TypeId),
Undef(TypeId),
Poison(TypeId),
ZeroInitializer(TypeId),
Array { ty: TypeId, elements: Vec<ConstId> },
Struct { ty: TypeId, fields: Vec<ConstId> },
Vector { ty: TypeId, elements: Vec<ConstId> },
GlobalRef {
ty: TypeId,
id: GlobalId,
name: String,
},
}
#[derive(Clone, Debug)]
pub struct Argument {
pub name: String,
pub ty: TypeId,
pub index: u32,
}
#[derive(Clone, Debug)]
pub struct GlobalVariable {
pub name: String,
pub ty: TypeId,
pub initializer: Option<ConstId>,
pub is_constant: bool,
pub linkage: Linkage,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Linkage {
Private,
Internal,
External,
Weak,
WeakOdr,
LinkOnce,
LinkOnceOdr,
Common,
AvailableExternally,
}
impl Linkage {
pub fn as_str(self) -> &'static str {
match self {
Linkage::Private => "private",
Linkage::Internal => "internal",
Linkage::External => "",
Linkage::Weak => "weak",
Linkage::WeakOdr => "weak_odr",
Linkage::LinkOnce => "linkonce",
Linkage::LinkOnceOdr => "linkonce_odr",
Linkage::Common => "common",
Linkage::AvailableExternally => "available_externally",
}
}
pub fn is_external(self) -> bool {
self == Linkage::External
}
}
impl Default for Linkage {
fn default() -> Self {
Linkage::External
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn linkage_str() {
assert_eq!(Linkage::Private.as_str(), "private");
assert_eq!(Linkage::External.as_str(), "");
assert_eq!(Linkage::Internal.as_str(), "internal");
}
}