1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
use llvm_sys::core::{LLVMIsAConstantArray, LLVMIsAConstantDataArray};
use llvm_sys::prelude::LLVMValueRef;
use std::ffi::CStr;
use std::fmt;
use crate::support::LLVMString;
use crate::types::ArrayType;
use crate::values::traits::AsValueRef;
use crate::values::{Value, InstructionValue, MetadataValue};
#[derive(PartialEq, Eq, Clone, Copy, Hash)]
pub struct ArrayValue {
array_value: Value
}
impl ArrayValue {
pub(crate) fn new(value: LLVMValueRef) -> Self {
assert!(!value.is_null());
ArrayValue {
array_value: Value::new(value),
}
}
pub fn get_name(&self) -> &CStr {
self.array_value.get_name()
}
pub fn set_name(&self, name: &str) {
self.array_value.set_name(name);
}
pub fn get_type(&self) -> ArrayType {
ArrayType::new(self.array_value.get_type())
}
pub fn is_null(&self) -> bool {
self.array_value.is_null()
}
pub fn is_undef(&self) -> bool {
self.array_value.is_undef()
}
pub fn print_to_string(&self) -> LLVMString {
self.array_value.print_to_string()
}
pub fn print_to_stderr(&self) {
self.array_value.print_to_stderr()
}
pub fn as_instruction(&self) -> Option<InstructionValue> {
self.array_value.as_instruction()
}
pub fn has_metadata(&self) -> bool {
self.array_value.has_metadata()
}
pub fn get_metadata(&self, kind_id: u32) -> Option<MetadataValue> {
self.array_value.get_metadata(kind_id)
}
pub fn set_metadata(&self, metadata: MetadataValue, kind_id: u32) {
self.array_value.set_metadata(metadata, kind_id)
}
pub fn replace_all_uses_with(&self, other: ArrayValue) {
self.array_value.replace_all_uses_with(other.as_value_ref())
}
pub fn is_const(&self) -> bool {
self.array_value.is_const()
}
}
impl AsValueRef for ArrayValue {
fn as_value_ref(&self) -> LLVMValueRef {
self.array_value.value
}
}
impl fmt::Debug for ArrayValue {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let llvm_value = self.print_to_string();
let llvm_type = self.get_type();
let name = self.get_name();
let is_const = self.is_const();
let is_null = self.is_null();
let is_const_array = unsafe {
!LLVMIsAConstantArray(self.as_value_ref()).is_null()
};
let is_const_data_array = unsafe {
!LLVMIsAConstantDataArray(self.as_value_ref()).is_null()
};
f.debug_struct("ArrayValue")
.field("name", &name)
.field("address", &self.as_value_ref())
.field("is_const", &is_const)
.field("is_const_array", &is_const_array)
.field("is_const_data_array", &is_const_data_array)
.field("is_null", &is_null)
.field("llvm_value", &llvm_value)
.field("llvm_type", &llvm_type)
.finish()
}
}