@@ -244,6 +244,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
244
244
ptr_loads (2 ),
245
245
is_assignment_target (false )
246
246
{
247
+ llvm_utils->tuple_api = tuple_api.get ();
248
+ llvm_utils->list_api = list_api.get ();
247
249
}
248
250
249
251
llvm::Value* CreateLoad (llvm::Value *x) {
@@ -1147,7 +1149,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1147
1149
this ->visit_expr (*x.m_args [i]);
1148
1150
llvm::Value* item = tmp;
1149
1151
llvm::Value* pos = llvm::ConstantInt::get (context, llvm::APInt (32 , i));
1150
- list_api->write_item (const_list, pos, item);
1152
+ list_api->write_item (const_list, pos, item, list_type-> m_type , *module );
1151
1153
}
1152
1154
ptr_loads = ptr_loads_copy;
1153
1155
tmp = const_list;
@@ -1203,31 +1205,34 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1203
1205
}
1204
1206
1205
1207
void visit_ListAppend (const ASR::ListAppend_t& x) {
1208
+ ASR::List_t* asr_list = ASR::down_cast<ASR::List_t>(ASRUtils::expr_type (x.m_a ));
1206
1209
uint64_t ptr_loads_copy = ptr_loads;
1207
1210
ptr_loads = 0 ;
1208
1211
this ->visit_expr (*x.m_a );
1209
- ptr_loads = ptr_loads_copy;
1210
1212
llvm::Value* plist = tmp;
1211
1213
1214
+ ptr_loads = !LLVM::is_llvm_struct (asr_list->m_type );
1212
1215
this ->visit_expr_wrapper (x.m_ele , true );
1213
1216
llvm::Value *item = tmp;
1217
+ ptr_loads = ptr_loads_copy;
1214
1218
1215
- ASR::List_t* asr_list = ASR::down_cast<ASR::List_t>(ASRUtils::expr_type (x.m_a ));
1216
- std::string type_code = ASRUtils::get_type_code (asr_list->m_type );
1217
- list_api->append (plist, item, *module, type_code);
1219
+ list_api->append (plist, item, asr_list->m_type , *module);
1218
1220
}
1219
1221
1220
1222
void visit_ListItem (const ASR::ListItem_t& x) {
1223
+ ASR::ttype_t * el_type = ASRUtils::get_contained_type (
1224
+ ASRUtils::expr_type (x.m_a ));
1221
1225
uint64_t ptr_loads_copy = ptr_loads;
1222
1226
ptr_loads = 0 ;
1223
1227
this ->visit_expr (*x.m_a );
1224
- ptr_loads = ptr_loads_copy;
1225
1228
llvm::Value* plist = tmp;
1226
1229
1230
+ ptr_loads = 1 ;
1227
1231
this ->visit_expr_wrapper (x.m_pos , true );
1232
+ ptr_loads = ptr_loads_copy;
1228
1233
llvm::Value *pos = tmp;
1229
1234
1230
- tmp = list_api->read_item (plist, pos);
1235
+ tmp = list_api->read_item (plist, pos, LLVM::is_llvm_struct (el_type) );
1231
1236
}
1232
1237
1233
1238
void visit_ListLen (const ASR::ListLen_t& x) {
@@ -1244,36 +1249,47 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1244
1249
}
1245
1250
1246
1251
void visit_ListInsert (const ASR::ListInsert_t& x) {
1252
+ ASR::List_t* asr_list = ASR::down_cast<ASR::List_t>(
1253
+ ASRUtils::expr_type (x.m_a ));
1247
1254
uint64_t ptr_loads_copy = ptr_loads;
1248
1255
ptr_loads = 0 ;
1249
1256
this ->visit_expr (*x.m_a );
1250
- ptr_loads = ptr_loads_copy;
1251
1257
llvm::Value* plist = tmp;
1252
1258
1259
+ ptr_loads = 1 ;
1253
1260
this ->visit_expr_wrapper (x.m_pos , true );
1254
1261
llvm::Value *pos = tmp;
1255
1262
1263
+ ptr_loads = !LLVM::is_llvm_struct (asr_list->m_type );
1256
1264
this ->visit_expr_wrapper (x.m_ele , true );
1257
1265
llvm::Value *item = tmp;
1266
+ ptr_loads = ptr_loads_copy;
1258
1267
1259
- ASR::List_t* asr_list = ASR::down_cast<ASR::List_t>(
1260
- ASRUtils::expr_type (x.m_a ));
1261
- std::string type_code = ASRUtils::get_type_code (asr_list->m_type );
1262
-
1263
- list_api->insert_item (plist, pos, item, *module, type_code);
1268
+ list_api->insert_item (plist, pos, item, asr_list->m_type , *module);
1264
1269
}
1265
1270
1266
1271
void visit_ListRemove (const ASR::ListRemove_t& x) {
1267
1272
ASR::ttype_t * asr_el_type = ASRUtils::get_contained_type (ASRUtils::expr_type (x.m_a ));
1268
1273
uint64_t ptr_loads_copy = ptr_loads;
1269
1274
ptr_loads = 0 ;
1270
1275
this ->visit_expr (*x.m_a );
1271
- ptr_loads = ptr_loads_copy;
1272
1276
llvm::Value* plist = tmp;
1273
1277
1278
+ ptr_loads = !LLVM::is_llvm_struct (asr_el_type);
1274
1279
this ->visit_expr_wrapper (x.m_ele , true );
1280
+ ptr_loads = ptr_loads_copy;
1275
1281
llvm::Value *item = tmp;
1276
- list_api->remove (plist, item, asr_el_type->type , *module);
1282
+ list_api->remove (plist, item, asr_el_type, *module);
1283
+ }
1284
+
1285
+ void visit_ListClear (const ASR::ListClear_t& x) {
1286
+ uint64_t ptr_loads_copy = ptr_loads;
1287
+ ptr_loads = 0 ;
1288
+ this ->visit_expr (*x.m_a );
1289
+ llvm::Value* plist = tmp;
1290
+ ptr_loads = ptr_loads_copy;
1291
+
1292
+ list_api->list_clear (plist);
1277
1293
}
1278
1294
1279
1295
void visit_TupleLen (const ASR::TupleLen_t& x) {
@@ -1291,7 +1307,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1291
1307
this ->visit_expr_wrapper (x.m_pos , true );
1292
1308
llvm::Value *pos = tmp;
1293
1309
1294
- tmp = tuple_api->read_item (ptuple, pos);
1310
+ tmp = tuple_api->read_item (ptuple, pos, LLVM::is_llvm_struct (x. m_type ) );
1295
1311
}
1296
1312
1297
1313
void visit_ArrayItem (const ASR::ArrayItem_t& x) {
@@ -1838,7 +1854,9 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
1838
1854
a_kind);
1839
1855
std::string el_type_code = ASRUtils::get_type_code (asr_list->m_type );
1840
1856
int32_t type_size = -1 ;
1841
- if ( ASR::is_a<ASR::Character_t>(*asr_list->m_type ) ) {
1857
+ if ( LLVM::is_llvm_struct (asr_list->m_type ) ||
1858
+ ASR::is_a<ASR::Character_t>(*asr_list->m_type ) ||
1859
+ ASR::is_a<ASR::Complex_t>(*asr_list->m_type ) ) {
1842
1860
llvm::DataLayout data_layout (module.get ());
1843
1861
type_size = data_layout.getTypeAllocSize (el_llvm_type);
1844
1862
} else {
@@ -2218,8 +2236,17 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
2218
2236
is_malloc_array_type,
2219
2237
is_list, m_dims, n_dims,
2220
2238
a_kind);
2239
+ int32_t type_size = -1 ;
2240
+ if ( LLVM::is_llvm_struct (asr_list->m_type ) ||
2241
+ ASR::is_a<ASR::Character_t>(*asr_list->m_type ) ||
2242
+ ASR::is_a<ASR::Complex_t>(*asr_list->m_type ) ) {
2243
+ llvm::DataLayout data_layout (module.get ());
2244
+ type_size = data_layout.getTypeAllocSize (el_llvm_type);
2245
+ } else {
2246
+ type_size = a_kind;
2247
+ }
2221
2248
std::string el_type_code = ASRUtils::get_type_code (asr_list->m_type );
2222
- type = list_api->get_list_type (el_llvm_type, el_type_code, a_kind )->getPointerTo ();
2249
+ type = list_api->get_list_type (el_llvm_type, el_type_code, type_size )->getPointerTo ();
2223
2250
break ;
2224
2251
}
2225
2252
default :
@@ -2943,7 +2970,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
2943
2970
ASR::List_t* value_asr_list = ASR::down_cast<ASR::List_t>(
2944
2971
ASRUtils::expr_type (x.m_value ));
2945
2972
std::string value_type_code = ASRUtils::get_type_code (value_asr_list->m_type );
2946
- list_api->list_deepcopy (value_list, target_list, value_type_code, *module);
2973
+ list_api->list_deepcopy (value_list, target_list,
2974
+ value_asr_list, *module);
2947
2975
return ;
2948
2976
} else if ( is_target_tuple && is_value_tuple ) {
2949
2977
uint64_t ptr_loads_copy = ptr_loads;
@@ -2981,7 +3009,8 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
2981
3009
ASR::Tuple_t* value_tuple_type = ASR::down_cast<ASR::Tuple_t>(asr_value_type);
2982
3010
std::string type_code = ASRUtils::get_type_code (value_tuple_type->m_type ,
2983
3011
value_tuple_type->n_type );
2984
- tuple_api->tuple_deepcopy (value_tuple, target_tuple, type_code);
3012
+ tuple_api->tuple_deepcopy (value_tuple, target_tuple,
3013
+ value_tuple_type, *module);
2985
3014
}
2986
3015
}
2987
3016
return ;
0 commit comments