@@ -298,7 +298,7 @@ namespace LFortran {
298
298
}
299
299
300
300
void LLVMUtils::deepcopy (llvm::Value* src, llvm::Value* dest,
301
- ASR::ttype_t * asr_type, llvm::Module& module) {
301
+ ASR::ttype_t * asr_type, llvm::Module* module) {
302
302
switch ( asr_type->type ) {
303
303
case ASR::ttypeType::Integer:
304
304
case ASR::ttypeType::Real:
@@ -318,6 +318,11 @@ namespace LFortran {
318
318
list_api->list_deepcopy (src, dest, list_type, module);
319
319
break ;
320
320
}
321
+ case ASR::ttypeType::Dict: {
322
+ ASR::Dict_t* dict_type = ASR::down_cast<ASR::Dict_t>(asr_type);
323
+ dict_api->dict_deepcopy (src, dest, dict_type, module);
324
+ break ;
325
+ }
321
326
default : {
322
327
throw LCompilersException (" LLVMUtils::deepcopy isn't implemented for " +
323
328
ASRUtils::type_to_str_python (asr_type));
@@ -611,12 +616,12 @@ namespace LFortran {
611
616
}
612
617
613
618
void LLVMList::list_deepcopy (llvm::Value* src, llvm::Value* dest,
614
- ASR::List_t* list_type, llvm::Module& module) {
619
+ ASR::List_t* list_type, llvm::Module* module) {
615
620
list_deepcopy (src, dest, list_type->m_type , module);
616
621
}
617
622
618
623
void LLVMList::list_deepcopy (llvm::Value* src, llvm::Value* dest,
619
- ASR::ttype_t * element_type, llvm::Module& module) {
624
+ ASR::ttype_t * element_type, llvm::Module* module) {
620
625
LFORTRAN_ASSERT (src->getType () == dest->getType ());
621
626
std::string src_type_code = ASRUtils::get_type_code (element_type);
622
627
llvm::Value* src_end_point = LLVM::CreateLoad (*builder, get_pointer_to_current_end_point (src));
@@ -629,7 +634,7 @@ namespace LFortran {
629
634
int32_t type_size = std::get<1 >(typecode2listtype[src_type_code]);
630
635
llvm::Value* arg_size = builder->CreateMul (llvm::ConstantInt::get (context,
631
636
llvm::APInt (32 , type_size)), src_capacity);
632
- llvm::Value* copy_data = LLVM::lfortran_malloc (context, module, *builder,
637
+ llvm::Value* copy_data = LLVM::lfortran_malloc (context, * module, *builder,
633
638
arg_size);
634
639
llvm::Type* el_type = std::get<2 >(typecode2listtype[src_type_code]);
635
640
copy_data = builder->CreateBitCast (copy_data, el_type->getPointerTo ());
@@ -700,12 +705,12 @@ namespace LFortran {
700
705
llvm::Value* src_key_list = get_key_list (src);
701
706
llvm::Value* dest_key_list = get_key_list (dest);
702
707
llvm_utils->list_api ->list_deepcopy (src_key_list, dest_key_list,
703
- dict_type->m_key_type , * module);
708
+ dict_type->m_key_type , module);
704
709
705
710
llvm::Value* src_value_list = get_value_list (src);
706
711
llvm::Value* dest_value_list = get_value_list (dest);
707
712
llvm_utils->list_api ->list_deepcopy (src_value_list, dest_value_list,
708
- dict_type->m_value_type , * module);
713
+ dict_type->m_value_type , module);
709
714
710
715
llvm::Value* src_key_mask = LLVM::CreateLoad (*builder, get_pointer_to_keymask (src));
711
716
llvm::Value* dest_key_mask_ptr = get_pointer_to_keymask (dest);
@@ -768,8 +773,8 @@ namespace LFortran {
768
773
}
769
774
llvm::Value* dest_key_ptr = llvm_utils->create_gep (curr_dest, 0 );
770
775
llvm::Value* dest_value_ptr = llvm_utils->create_gep (curr_dest, 1 );
771
- llvm_utils->deepcopy (src_key, dest_key_ptr, dict_type->m_key_type , * module);
772
- llvm_utils->deepcopy (src_value, dest_value_ptr, dict_type->m_value_type , * module);
776
+ llvm_utils->deepcopy (src_key, dest_key_ptr, dict_type->m_key_type , module);
777
+ llvm_utils->deepcopy (src_value, dest_value_ptr, dict_type->m_value_type , module);
773
778
774
779
llvm::Value* src_next_ptr = LLVM::CreateLoad (*builder, llvm_utils->create_gep (curr_src, 2 ));
775
780
llvm::Value* curr_dest_next_ptr = llvm_utils->create_gep (curr_dest, 2 );
@@ -957,7 +962,7 @@ namespace LFortran {
957
962
958
963
void LLVMList::write_item (llvm::Value* list, llvm::Value* pos,
959
964
llvm::Value* item, ASR::ttype_t * asr_type,
960
- llvm::Module& module, bool check_index_bound) {
965
+ llvm::Module* module, bool check_index_bound) {
961
966
if ( check_index_bound ) {
962
967
check_index_within_bounds (list, pos);
963
968
}
@@ -1323,9 +1328,9 @@ namespace LFortran {
1323
1328
this ->resolve_collision (capacity, key_hash, key, key_list, key_mask, *module, key_asr_type);
1324
1329
llvm::Value* pos = LLVM::CreateLoad (*builder, pos_ptr);
1325
1330
llvm_utils->list_api ->write_item (key_list, pos, key,
1326
- key_asr_type, * module, false );
1331
+ key_asr_type, module, false );
1327
1332
llvm_utils->list_api ->write_item (value_list, pos, value,
1328
- value_asr_type, * module, false );
1333
+ value_asr_type, module, false );
1329
1334
llvm::Value* key_mask_value = LLVM::CreateLoad (*builder,
1330
1335
llvm_utils->create_ptr_gep (key_mask, pos));
1331
1336
llvm::Value* is_slot_empty = builder->CreateICmpEQ (key_mask_value,
@@ -1352,9 +1357,9 @@ namespace LFortran {
1352
1357
this ->resolve_collision (capacity, key_hash, key, key_list, key_mask, *module, key_asr_type);
1353
1358
llvm::Value* pos = LLVM::CreateLoad (*builder, pos_ptr);
1354
1359
llvm_utils->list_api ->write_item (key_list, pos, key,
1355
- key_asr_type, * module, false );
1360
+ key_asr_type, module, false );
1356
1361
llvm_utils->list_api ->write_item (value_list, pos, value,
1357
- value_asr_type, * module, false );
1362
+ value_asr_type, module, false );
1358
1363
1359
1364
llvm::Value* key_mask_value = LLVM::CreateLoad (*builder,
1360
1365
llvm_utils->create_ptr_gep (key_mask, pos));
@@ -1407,8 +1412,8 @@ namespace LFortran {
1407
1412
llvm::Value* malloc_size = llvm::ConstantInt::get (llvm::Type::getInt32Ty (context), kv_struct_size);
1408
1413
llvm::Value* new_kv_struct_i8 = LLVM::lfortran_malloc (context, *module, *builder, malloc_size);
1409
1414
llvm::Value* new_kv_struct = builder->CreateBitCast (new_kv_struct_i8, kv_struct_type->getPointerTo ());
1410
- llvm_utils->deepcopy (key, llvm_utils->create_gep (new_kv_struct, 0 ), key_asr_type, * module);
1411
- llvm_utils->deepcopy (value, llvm_utils->create_gep (new_kv_struct, 1 ), value_asr_type, * module);
1415
+ llvm_utils->deepcopy (key, llvm_utils->create_gep (new_kv_struct, 0 ), key_asr_type, module);
1416
+ llvm_utils->deepcopy (value, llvm_utils->create_gep (new_kv_struct, 1 ), value_asr_type, module);
1412
1417
LLVM::CreateStore (*builder,
1413
1418
llvm::ConstantPointerNull::get (llvm::Type::getInt8PtrTy (context)),
1414
1419
llvm_utils->create_gep (new_kv_struct, 2 ));
@@ -1420,8 +1425,8 @@ namespace LFortran {
1420
1425
llvm_utils->start_new_block (elseBB);
1421
1426
{
1422
1427
llvm::Value* kv_struct = builder->CreateBitCast (kv_struct_i8, kv_struct_type->getPointerTo ());
1423
- llvm_utils->deepcopy (key, llvm_utils->create_gep (kv_struct, 0 ), key_asr_type, * module);
1424
- llvm_utils->deepcopy (value, llvm_utils->create_gep (kv_struct, 1 ), value_asr_type, * module);
1428
+ llvm_utils->deepcopy (key, llvm_utils->create_gep (kv_struct, 0 ), key_asr_type, module);
1429
+ llvm_utils->deepcopy (value, llvm_utils->create_gep (kv_struct, 1 ), value_asr_type, module);
1425
1430
}
1426
1431
llvm_utils->start_new_block (mergeBB);
1427
1432
llvm::Value* occupancy_ptr = get_pointer_to_occupancy (dict);
@@ -1766,10 +1771,10 @@ namespace LFortran {
1766
1771
llvm::Value* pos = LLVM::CreateLoad (*builder, pos_ptr);
1767
1772
llvm::Value* key_dest = llvm_utils->list_api ->read_item (new_key_list, pos,
1768
1773
true , false );
1769
- llvm_utils->deepcopy (key, key_dest, key_asr_type, * module);
1774
+ llvm_utils->deepcopy (key, key_dest, key_asr_type, module);
1770
1775
llvm::Value* value_dest = llvm_utils->list_api ->read_item (new_value_list, pos,
1771
1776
true , false );
1772
- llvm_utils->deepcopy (value, value_dest, value_asr_type, * module);
1777
+ llvm_utils->deepcopy (value, value_dest, value_asr_type, module);
1773
1778
1774
1779
llvm::Value* linear_prob_happened = builder->CreateICmpNE (key_hash, pos);
1775
1780
llvm::Value* set_max_2 = builder->CreateSelect (linear_prob_happened,
@@ -2225,21 +2230,21 @@ namespace LFortran {
2225
2230
}
2226
2231
2227
2232
void LLVMList::append (llvm::Value* list, llvm::Value* item,
2228
- ASR::ttype_t * asr_type, llvm::Module& module) {
2233
+ ASR::ttype_t * asr_type, llvm::Module* module) {
2229
2234
llvm::Value* current_end_point = LLVM::CreateLoad (*builder, get_pointer_to_current_end_point (list));
2230
2235
llvm::Value* current_capacity = LLVM::CreateLoad (*builder, get_pointer_to_current_capacity (list));
2231
2236
std::string type_code = ASRUtils::get_type_code (asr_type);
2232
2237
int type_size = std::get<1 >(typecode2listtype[type_code]);
2233
2238
llvm::Type* el_type = std::get<2 >(typecode2listtype[type_code]);
2234
2239
resize_if_needed (list, current_end_point, current_capacity,
2235
- type_size, el_type, module);
2240
+ type_size, el_type, * module);
2236
2241
write_item (list, current_end_point, item, asr_type, module);
2237
2242
shift_end_point_by_one (list);
2238
2243
}
2239
2244
2240
2245
void LLVMList::insert_item (llvm::Value* list, llvm::Value* pos,
2241
2246
llvm::Value* item, ASR::ttype_t * asr_type,
2242
- llvm::Module& module) {
2247
+ llvm::Module* module) {
2243
2248
std::string type_code = ASRUtils::get_type_code (asr_type);
2244
2249
llvm::Value* current_end_point = LLVM::CreateLoad (*builder,
2245
2250
get_pointer_to_current_end_point (list));
@@ -2248,7 +2253,7 @@ namespace LFortran {
2248
2253
int type_size = std::get<1 >(typecode2listtype[type_code]);
2249
2254
llvm::Type* el_type = std::get<2 >(typecode2listtype[type_code]);
2250
2255
resize_if_needed (list, current_end_point, current_capacity,
2251
- type_size, el_type, module);
2256
+ type_size, el_type, * module);
2252
2257
2253
2258
/* While loop equivalent in C++:
2254
2259
* end_point // nth index of list
@@ -2514,7 +2519,7 @@ namespace LFortran {
2514
2519
}
2515
2520
2516
2521
void LLVMTuple::tuple_deepcopy (llvm::Value* src, llvm::Value* dest,
2517
- ASR::Tuple_t* tuple_type, llvm::Module& module) {
2522
+ ASR::Tuple_t* tuple_type, llvm::Module* module) {
2518
2523
LFORTRAN_ASSERT (src->getType () == dest->getType ());
2519
2524
for ( size_t i = 0 ; i < tuple_type->n_type ; i++ ) {
2520
2525
llvm::Value* src_item = read_item (src, i, LLVM::is_llvm_struct (
0 commit comments