1use crate::context::{ConstId, GlobalId, TypeId};
4
5#[derive(Clone, Debug, PartialEq)]
7pub enum ConstantData {
8 Int { ty: TypeId, val: u64 },
10 IntWide { ty: TypeId, words: Vec<u64> },
12 Float { ty: TypeId, bits: u64 },
14 Null(TypeId),
16 Undef(TypeId),
18 Poison(TypeId),
20 ZeroInitializer(TypeId),
22 Array { ty: TypeId, elements: Vec<ConstId> },
24 Struct { ty: TypeId, fields: Vec<ConstId> },
26 Vector { ty: TypeId, elements: Vec<ConstId> },
28 GlobalRef {
31 ty: TypeId,
32 id: GlobalId,
33 name: String,
34 },
35}
36
37#[derive(Clone, Debug)]
39pub struct Argument {
40 pub name: String,
42 pub ty: TypeId,
44 pub index: u32,
46}
47
48#[derive(Clone, Debug)]
50pub struct GlobalVariable {
51 pub name: String,
53 pub ty: TypeId,
55 pub initializer: Option<ConstId>,
57 pub is_constant: bool,
59 pub linkage: Linkage,
61}
62
63#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
65pub enum Linkage {
66 Private,
68 Internal,
70 External,
72 Weak,
74 WeakOdr,
76 LinkOnce,
78 LinkOnceOdr,
80 Common,
82 AvailableExternally,
84}
85
86impl Linkage {
87 pub fn as_str(self) -> &'static str {
89 match self {
90 Linkage::Private => "private",
91 Linkage::Internal => "internal",
92 Linkage::External => "",
93 Linkage::Weak => "weak",
94 Linkage::WeakOdr => "weak_odr",
95 Linkage::LinkOnce => "linkonce",
96 Linkage::LinkOnceOdr => "linkonce_odr",
97 Linkage::Common => "common",
98 Linkage::AvailableExternally => "available_externally",
99 }
100 }
101
102 pub fn is_external(self) -> bool {
104 self == Linkage::External
105 }
106}
107
108impl Default for Linkage {
109 fn default() -> Self {
110 Linkage::External
111 }
112}
113
114#[cfg(test)]
115mod tests {
116 use super::*;
117
118 #[test]
119 fn linkage_str() {
120 assert_eq!(Linkage::Private.as_str(), "private");
121 assert_eq!(Linkage::External.as_str(), "");
122 assert_eq!(Linkage::Internal.as_str(), "internal");
123 }
124}