@@ -49,8 +49,17 @@ namespace LFortran {
49
49
llvm::IRBuilder<> &builder, llvm::Value* arg_size);
50
50
llvm::Value* lfortran_realloc (llvm::LLVMContext &context, llvm::Module &module ,
51
51
llvm::IRBuilder<> &builder, llvm::Value* ptr, llvm::Value* arg_size);
52
+ static inline bool is_llvm_struct (ASR::ttype_t * asr_type) {
53
+ return ASR::is_a<ASR::Tuple_t>(*asr_type) ||
54
+ ASR::is_a<ASR::List_t>(*asr_type) ||
55
+ ASR::is_a<ASR::Derived_t>(*asr_type) ||
56
+ ASR::is_a<ASR::Class_t>(*asr_type);
57
+ }
52
58
}
53
59
60
+ class LLVMList ;
61
+ class LLVMTuple ;
62
+
54
63
class LLVMUtils {
55
64
56
65
private:
@@ -60,6 +69,9 @@ namespace LFortran {
60
69
61
70
public:
62
71
72
+ LLVMTuple* tuple_api;
73
+ LLVMList* list_api;
74
+
63
75
LLVMUtils (llvm::LLVMContext& context,
64
76
llvm::IRBuilder<>* _builder);
65
77
@@ -78,6 +90,12 @@ namespace LFortran {
78
90
llvm::Value* lfortran_str_cmp (llvm::Value* left_arg, llvm::Value* right_arg,
79
91
std::string runtime_func_name, llvm::Module& module );
80
92
93
+ llvm::Value* is_equal_by_value (llvm::Value* left, llvm::Value* right,
94
+ llvm::Module& module , ASR::ttype_t * asr_type);
95
+
96
+ void deepcopy (llvm::Value* src, llvm::Value* dest,
97
+ ASR::ttype_t * asr_type, llvm::Module& module );
98
+
81
99
}; // LLVMUtils
82
100
83
101
class LLVMList {
@@ -98,7 +116,7 @@ namespace LFortran {
98
116
public:
99
117
100
118
LLVMList (llvm::LLVMContext& context_, LLVMUtils* llvm_utils,
101
- llvm::IRBuilder<>* builder);
119
+ llvm::IRBuilder<>* builder);
102
120
103
121
llvm::Type* get_list_type (llvm::Type* el_type, std::string& type_code,
104
122
int32_t type_size);
@@ -114,29 +132,35 @@ namespace LFortran {
114
132
llvm::Value* get_pointer_to_current_capacity (llvm::Value* list);
115
133
116
134
void list_deepcopy (llvm::Value* src, llvm::Value* dest,
117
- std::string& src_type_code ,
135
+ ASR::List_t* list_type ,
118
136
llvm::Module& module );
119
137
120
138
llvm::Value* read_item (llvm::Value* list, llvm::Value* pos,
121
139
bool get_pointer=false );
122
140
123
141
llvm::Value* len (llvm::Value* list);
124
142
143
+ void write_item (llvm::Value* list, llvm::Value* pos,
144
+ llvm::Value* item, ASR::ttype_t * asr_type,
145
+ llvm::Module& module );
146
+
125
147
void write_item (llvm::Value* list, llvm::Value* pos,
126
148
llvm::Value* item);
127
149
128
150
void append (llvm::Value* list, llvm::Value* item,
129
- llvm::Module& module , std::string& type_code );
151
+ ASR:: ttype_t * asr_type, llvm::Module& module );
130
152
131
153
void insert_item (llvm::Value* list, llvm::Value* pos,
132
- llvm::Value* item, llvm::Module& module ,
133
- std::string& type_code );
154
+ llvm::Value* item, ASR:: ttype_t * asr_type ,
155
+ llvm::Module& module );
134
156
135
157
void remove (llvm::Value* list, llvm::Value* item,
136
- ASR::ttypeType item_type, llvm::Module& module );
158
+ ASR::ttype_t * item_type, llvm::Module& module );
159
+
160
+ void list_clear (llvm::Value* list);
137
161
138
162
llvm::Value* find_item_position (llvm::Value* list,
139
- llvm::Value* item, ASR::ttypeType item_type,
163
+ llvm::Value* item, ASR::ttype_t * item_type,
140
164
llvm::Module& module );
141
165
};
142
166
@@ -167,7 +191,11 @@ namespace LFortran {
167
191
bool get_pointer=false );
168
192
169
193
void tuple_deepcopy (llvm::Value* src, llvm::Value* dest,
170
- std::string& type_code);
194
+ ASR::Tuple_t* type_code, llvm::Module& module );
195
+
196
+ llvm::Value* check_tuple_equality (llvm::Value* t1, llvm::Value* t2,
197
+ ASR::Tuple_t* tuple_type, llvm::LLVMContext& context,
198
+ llvm::IRBuilder<>* builder, llvm::Module& module );
171
199
};
172
200
173
201
} // LFortran
0 commit comments