From bb3757c76fc6be881bac2d7df30ab580c7d6cb49 Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Mon, 11 Dec 2023 10:40:51 +0530 Subject: [PATCH 1/2] Fixed output through c_sym backend for test_gruntz.py --- integration_tests/CMakeLists.txt | 2 +- src/libasr/codegen/asr_to_c.cpp | 12 ++++++------ src/libasr/codegen/asr_to_c_cpp.h | 19 ++++++++++++++++++- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt index d5a477f006..b0dac2be81 100644 --- a/integration_tests/CMakeLists.txt +++ b/integration_tests/CMakeLists.txt @@ -717,7 +717,7 @@ RUN(NAME symbolics_10 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_11 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_12 LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME symbolics_13 LABELS cpython_sym c_sym llvm_sym NOFAST) -RUN(NAME test_gruntz LABELS cpython_sym llvm_sym NOFAST) +RUN(NAME test_gruntz LABELS cpython_sym c_sym llvm_sym NOFAST) RUN(NAME sizeof_01 LABELS llvm c EXTRAFILES sizeof_01b.c) diff --git a/src/libasr/codegen/asr_to_c.cpp b/src/libasr/codegen/asr_to_c.cpp index c39fc2990f..bae0a5e7d4 100644 --- a/src/libasr/codegen/asr_to_c.cpp +++ b/src/libasr/codegen/asr_to_c.cpp @@ -415,11 +415,6 @@ class ASRToCVisitor : public BaseCCPPVisitor headers.insert("complex.h"); convert_variable_decl_util(v, is_array, declare_as_constant, use_ref, dummy, force_declare, force_declare_name, n_dims, m_dims, v_m_type, dims, sub); - } else if (ASR::is_a(*v_m_type)) { - headers.insert("symengine/cwrapper.h"); - std::string type_name = "basic"; - std::string v_m_name = v.m_name; - sub = format_type_c("", type_name, v_m_name, use_ref, dummy); } else if (ASRUtils::is_logical(*v_m_type)) { convert_variable_decl_util(v, is_array, declare_as_constant, use_ref, dummy, force_declare, force_declare_name, n_dims, m_dims, v_m_type, dims, sub); @@ -529,7 +524,12 @@ class ASRToCVisitor : public BaseCCPPVisitor } else if (ASR::is_a(*v_m_type)) { ASR::List_t* t = ASR::down_cast(v_m_type); std::string list_type_c = c_ds_api->get_list_type(t); - sub = format_type_c("", list_type_c, v.m_name, + std::string name = v.m_name; + if (name == "_lpython_return_variable" && v.m_intent == ASRUtils::intent_out) { + is_return_var_intent_out = true; + name = "*" + name; + } + sub = format_type_c("", list_type_c, name, false, false); } else if (ASR::is_a(*v_m_type)) { ASR::Tuple_t* t = ASR::down_cast(v_m_type); diff --git a/src/libasr/codegen/asr_to_c_cpp.h b/src/libasr/codegen/asr_to_c_cpp.h index e7dbd05a3f..89874c9677 100644 --- a/src/libasr/codegen/asr_to_c_cpp.h +++ b/src/libasr/codegen/asr_to_c_cpp.h @@ -148,6 +148,8 @@ class BaseCCPPVisitor : public ASR::BaseVisitor SymbolTable* current_scope; bool is_string_concat_present; + bool is_return_var_intent_out = false; + BaseCCPPVisitor(diag::Diagnostics &diag, Platform &platform, CompilerOptions &_compiler_options, bool gen_stdstring, bool gen_stdcomplex, bool is_c, int64_t default_lower_bound) : diag{diag}, @@ -1077,6 +1079,16 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) { || param->m_intent == ASRUtils::intent_out) && !ASRUtils::is_aggregate_type(param->m_type))) { args += "&" + src; + } else if (std::string(param->m_name) == "_lpython_return_variable" + && param->m_intent == ASRUtils::intent_out) { + if (ASR::is_a(*param->m_type)) { + ASR::List_t* list_type = ASR::down_cast(param->m_type); + if (list_type->m_type->type == ASR::ttypeType::CPtr){ + args += "&" + src; + } + } else { + args += src; + } } else { args += src; } @@ -1367,7 +1379,12 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) { if( is_target_list && is_value_list ) { ASR::List_t* list_target = ASR::down_cast(ASRUtils::expr_type(x.m_target)); std::string list_dc_func = c_ds_api->get_list_deepcopy_func(list_target); - src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n"; + if (target == "_lpython_return_variable" && is_return_var_intent_out) { + src += indent + list_dc_func + "(&" + value + ", " + target + ");\n\n"; + is_return_var_intent_out = false; + } else { + src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n"; + } } else if ( is_target_tup && is_value_tup ) { ASR::Tuple_t* tup_target = ASR::down_cast(ASRUtils::expr_type(x.m_target)); std::string dc_func = c_ds_api->get_tuple_deepcopy_func(tup_target); From 9f0fe589057744d35eb876f1347c021acbd4809a Mon Sep 17 00:00:00 2001 From: anutosh491 Date: Sun, 7 Jan 2024 18:22:44 +0530 Subject: [PATCH 2/2] Removed use of lpython_return_variable --- src/libasr/codegen/asr_to_c.cpp | 3 +-- src/libasr/codegen/asr_to_c_cpp.h | 18 +++++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/libasr/codegen/asr_to_c.cpp b/src/libasr/codegen/asr_to_c.cpp index bae0a5e7d4..acf1ae5977 100644 --- a/src/libasr/codegen/asr_to_c.cpp +++ b/src/libasr/codegen/asr_to_c.cpp @@ -525,8 +525,7 @@ class ASRToCVisitor : public BaseCCPPVisitor ASR::List_t* t = ASR::down_cast(v_m_type); std::string list_type_c = c_ds_api->get_list_type(t); std::string name = v.m_name; - if (name == "_lpython_return_variable" && v.m_intent == ASRUtils::intent_out) { - is_return_var_intent_out = true; + if (v.m_intent == ASRUtils::intent_out) { name = "*" + name; } sub = format_type_c("", list_type_c, name, diff --git a/src/libasr/codegen/asr_to_c_cpp.h b/src/libasr/codegen/asr_to_c_cpp.h index 89874c9677..c81ed357f5 100644 --- a/src/libasr/codegen/asr_to_c_cpp.h +++ b/src/libasr/codegen/asr_to_c_cpp.h @@ -148,8 +148,6 @@ class BaseCCPPVisitor : public ASR::BaseVisitor SymbolTable* current_scope; bool is_string_concat_present; - bool is_return_var_intent_out = false; - BaseCCPPVisitor(diag::Diagnostics &diag, Platform &platform, CompilerOptions &_compiler_options, bool gen_stdstring, bool gen_stdcomplex, bool is_c, int64_t default_lower_bound) : diag{diag}, @@ -1079,8 +1077,7 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) { || param->m_intent == ASRUtils::intent_out) && !ASRUtils::is_aggregate_type(param->m_type))) { args += "&" + src; - } else if (std::string(param->m_name) == "_lpython_return_variable" - && param->m_intent == ASRUtils::intent_out) { + } else if (param->m_intent == ASRUtils::intent_out) { if (ASR::is_a(*param->m_type)) { ASR::List_t* list_type = ASR::down_cast(param->m_type); if (list_type->m_type->type == ASR::ttypeType::CPtr){ @@ -1379,9 +1376,16 @@ PyMODINIT_FUNC PyInit_lpython_module_)" + fn_name + R"((void) { if( is_target_list && is_value_list ) { ASR::List_t* list_target = ASR::down_cast(ASRUtils::expr_type(x.m_target)); std::string list_dc_func = c_ds_api->get_list_deepcopy_func(list_target); - if (target == "_lpython_return_variable" && is_return_var_intent_out) { - src += indent + list_dc_func + "(&" + value + ", " + target + ");\n\n"; - is_return_var_intent_out = false; + if (ASR::is_a(*x.m_target)) { + ASR::symbol_t *target_sym = ASR::down_cast(x.m_target)->m_v; + if (ASR::is_a(*target_sym)) { + ASR::Variable_t *v = ASR::down_cast(target_sym); + if (v->m_intent == ASRUtils::intent_out) { + src += indent + list_dc_func + "(&" + value + ", " + target + ");\n\n"; + } else { + src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n"; + } + } } else { src += indent + list_dc_func + "(&" + value + ", &" + target + ");\n\n"; }