@@ -195,8 +195,8 @@ namespace LFortran {
195
195
}
196
196
case ASR::ttypeType::Tuple: {
197
197
ASR::Tuple_t* tuple_type = ASR::down_cast<ASR::Tuple_t>(asr_type);
198
- return LLVMTuple:: check_tuple_equality (left, right, tuple_type, context,
199
- this , builder, module );
198
+ return tuple_api-> check_tuple_equality (left, right, tuple_type, context,
199
+ builder, module );
200
200
}
201
201
default : {
202
202
throw LCompilersException (" LLVMUtils::is_equal_by_value isn't implemented for " +
@@ -205,6 +205,34 @@ namespace LFortran {
205
205
}
206
206
}
207
207
208
+ void LLVMUtils::deepcopy (llvm::Value* src, llvm::Value* dest,
209
+ ASR::ttype_t * asr_type, llvm::Module& module ) {
210
+ switch ( asr_type->type ) {
211
+ case ASR::ttypeType::Integer:
212
+ case ASR::ttypeType::Real:
213
+ case ASR::ttypeType::Character:
214
+ case ASR::ttypeType::Logical:
215
+ case ASR::ttypeType::Complex: {
216
+ LLVM::CreateStore (*builder, src, dest);
217
+ break ;
218
+ };
219
+ case ASR::ttypeType::Tuple: {
220
+ ASR::Tuple_t* tuple_type = ASR::down_cast<ASR::Tuple_t>(asr_type);
221
+ tuple_api->tuple_deepcopy (src, dest, tuple_type, module );
222
+ break ;
223
+ }
224
+ case ASR::ttypeType::List: {
225
+ ASR::List_t* list_type = ASR::down_cast<ASR::List_t>(asr_type);
226
+ list_api->list_deepcopy (src, dest, list_type, module );
227
+ break ;
228
+ }
229
+ default : {
230
+ throw LCompilersException (" LLVMUtils::deepcopy isn't implemented for " +
231
+ ASRUtils::type_to_str_python (asr_type));
232
+ }
233
+ }
234
+ }
235
+
208
236
LLVMList::LLVMList (llvm::LLVMContext& context_,
209
237
LLVMUtils* llvm_utils_,
210
238
llvm::IRBuilder<>* builder_):
@@ -259,9 +287,9 @@ namespace LFortran {
259
287
}
260
288
261
289
void LLVMList::list_deepcopy (llvm::Value* src, llvm::Value* dest,
262
- std::string& src_type_code,
263
- llvm::Module& module ) {
290
+ ASR::List_t* list_type, llvm::Module& module ) {
264
291
LFORTRAN_ASSERT (src->getType () == dest->getType ());
292
+ std::string src_type_code = ASRUtils::get_type_code (list_type->m_type );
265
293
llvm::Value* src_end_point = LLVM::CreateLoad (*builder, get_pointer_to_current_end_point (src));
266
294
llvm::Value* src_capacity = LLVM::CreateLoad (*builder, get_pointer_to_current_capacity (src));
267
295
llvm::Value* dest_end_point_ptr = get_pointer_to_current_end_point (dest);
@@ -281,10 +309,19 @@ namespace LFortran {
281
309
builder->CreateStore (copy_data, get_pointer_to_list_data (dest));
282
310
}
283
311
284
- void LLVMList::write_item (llvm::Value* list, llvm::Value* pos, llvm::Value* item) {
312
+ void LLVMList::write_item (llvm::Value* list, llvm::Value* pos,
313
+ llvm::Value* item, ASR::ttype_t * asr_type,
314
+ llvm::Module& module ) {
315
+ llvm::Value* list_data = LLVM::CreateLoad (*builder, get_pointer_to_list_data (list));
316
+ llvm::Value* element_ptr = llvm_utils->create_ptr_gep (list_data, pos);
317
+ llvm_utils->deepcopy (item, element_ptr, asr_type, module );
318
+ }
319
+
320
+ void LLVMList::write_item (llvm::Value* list, llvm::Value* pos,
321
+ llvm::Value* item) {
285
322
llvm::Value* list_data = LLVM::CreateLoad (*builder, get_pointer_to_list_data (list));
286
323
llvm::Value* element_ptr = llvm_utils->create_ptr_gep (list_data, pos);
287
- builder-> CreateStore (item, element_ptr);
324
+ LLVM:: CreateStore (*builder, item, element_ptr);
288
325
}
289
326
290
327
llvm::Value* LLVMList::read_item (llvm::Value* list, llvm::Value* pos, bool get_pointer) {
@@ -337,21 +374,22 @@ namespace LFortran {
337
374
}
338
375
339
376
void LLVMList::append (llvm::Value* list, llvm::Value* item,
340
- llvm::Module& module ,
341
- std::string& type_code) {
377
+ ASR::ttype_t * asr_type, llvm::Module& module ) {
342
378
llvm::Value* current_end_point = LLVM::CreateLoad (*builder, get_pointer_to_current_end_point (list));
343
379
llvm::Value* current_capacity = LLVM::CreateLoad (*builder, get_pointer_to_current_capacity (list));
380
+ std::string type_code = ASRUtils::get_type_code (asr_type);
344
381
int type_size = std::get<1 >(typecode2listtype[type_code]);
345
382
llvm::Type* el_type = std::get<2 >(typecode2listtype[type_code]);
346
383
resize_if_needed (list, current_end_point, current_capacity,
347
384
type_size, el_type, module );
348
- write_item (list, current_end_point, item);
385
+ write_item (list, current_end_point, item, asr_type, module );
349
386
shift_end_point_by_one (list);
350
387
}
351
388
352
389
void LLVMList::insert_item (llvm::Value* list, llvm::Value* pos,
353
- llvm::Value* item, llvm::Module& module ,
354
- std::string& type_code) {
390
+ llvm::Value* item, ASR::ttype_t * asr_type,
391
+ llvm::Module& module ) {
392
+ std::string type_code = ASRUtils::get_type_code (asr_type);
355
393
llvm::Value* current_end_point = LLVM::CreateLoad (*builder,
356
394
get_pointer_to_current_end_point (list));
357
395
llvm::Value* current_capacity = LLVM::CreateLoad (*builder,
@@ -406,7 +444,7 @@ namespace LFortran {
406
444
LLVM::CreateLoad (*builder, pos_ptr),
407
445
llvm::ConstantInt::get (context, llvm::APInt (32 , 1 )));
408
446
tmp = read_item (list, next_index, false );
409
- write_item (list, next_index, LLVM::CreateLoad (*builder, tmp_ptr));
447
+ write_item (list, next_index, LLVM::CreateLoad (*builder, tmp_ptr));
410
448
LLVM::CreateStore (*builder, tmp, tmp_ptr);
411
449
412
450
tmp = builder->CreateAdd (
@@ -419,7 +457,7 @@ namespace LFortran {
419
457
// end
420
458
llvm_utils->start_new_block (loopend);
421
459
422
- write_item (list, pos, item);
460
+ write_item (list, pos, item, asr_type, module );
423
461
shift_end_point_by_one (list);
424
462
}
425
463
@@ -601,27 +639,26 @@ namespace LFortran {
601
639
}
602
640
603
641
void LLVMTuple::tuple_deepcopy (llvm::Value* src, llvm::Value* dest,
604
- std::string& type_code ) {
642
+ ASR::Tuple_t* tuple_type, llvm::Module& module ) {
605
643
LFORTRAN_ASSERT (src->getType () == dest->getType ());
606
- size_t n_elements = typecode2tupletype[type_code]. second ;
607
- for ( size_t i = 0 ; i < n_elements; i++ ) {
608
- llvm::Value* src_item = read_item (src, i, false );
644
+ for ( size_t i = 0 ; i < tuple_type-> n_type ; i++ ) {
645
+ llvm::Value* src_item = read_item (src, i, LLVM::is_llvm_struct (
646
+ tuple_type-> m_type [i]) );
609
647
llvm::Value* dest_item_ptr = read_item (dest, i, true );
610
- builder->CreateStore (src_item, dest_item_ptr);
648
+ llvm_utils->deepcopy (src_item, dest_item_ptr,
649
+ tuple_type->m_type [i], module );
611
650
}
612
651
}
613
652
614
653
llvm::Value* LLVMTuple::check_tuple_equality (llvm::Value* t1, llvm::Value* t2,
615
654
ASR::Tuple_t* tuple_type,
616
655
llvm::LLVMContext& context,
617
- LLVMUtils* llvm_utils,
618
656
llvm::IRBuilder<>* builder,
619
657
llvm::Module& module ) {
620
- LLVMTuple tuple_api (context, llvm_utils, builder);
621
658
llvm::Value* is_equal = llvm::ConstantInt::get (context, llvm::APInt (1 , 1 ));
622
659
for ( size_t i = 0 ; i < tuple_type->n_type ; i++ ) {
623
- llvm::Value* t1i = tuple_api. read_item (t1, i);
624
- llvm::Value* t2i = tuple_api. read_item (t2, i);
660
+ llvm::Value* t1i = llvm_utils-> tuple_api -> read_item (t1, i);
661
+ llvm::Value* t2i = llvm_utils-> tuple_api -> read_item (t2, i);
625
662
llvm::Value* is_t1_eq_t2 = llvm_utils->is_equal_by_value (t1i, t2i, module ,
626
663
tuple_type->m_type [i]);
627
664
is_equal = builder->CreateAnd (is_equal, is_t1_eq_t2);
0 commit comments