Skip to content

Commit

Permalink
Always declare fixed size array members of structs as C array type
Browse files Browse the repository at this point in the history
  • Loading branch information
czgdp1807 committed Dec 30, 2022
1 parent f83e650 commit 7252547
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 27 deletions.
42 changes: 21 additions & 21 deletions src/libasr/codegen/asr_to_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
ASR::dimension_t* m_dims, int n_dims,
bool use_ref, bool dummy,
bool declare_value, bool is_fixed_size,
bool is_pointer=false) {
bool is_pointer=false,
ASR::abiType m_abi=ASR::abiType::Source) {
std::string indent(indentation_level*indentation_spaces, ' ');
std::string type_name_copy = type_name;
type_name = c_ds_api->get_array_type(type_name, encoded_type_name, array_types_decls);
Expand Down Expand Up @@ -132,7 +133,11 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
sub.pop_back();
}
} else {
sub = format_type_c("", type_name, v_m_name, use_ref, dummy);
if( m_abi == ASR::abiType::BindC ) {
sub = format_type_c("", type_name_copy, v_m_name + "[]", use_ref, dummy);
} else {
sub = format_type_c("", type_name, v_m_name, use_ref, dummy);
}
}
}

Expand All @@ -154,13 +159,7 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
ASR::dimension_t* m_dims = nullptr;
size_t n_dims = ASRUtils::extract_dimensions_from_ttype(mem_type, m_dims);
sub += indent + convert_variable_decl(*mem_var, true, true, true, true, mem_var_name) + ";\n";
if( mem_var->m_abi == ASR::abiType::BindC &&
ASRUtils::is_fixed_size_array(m_dims, n_dims) ) {
int64_t fixed_size_array = ASRUtils::get_fixed_size_of_array(m_dims, n_dims);
sub += indent + "memcpy(" + name + "->" + itr.first + ", " + mem_var_name + ", " +
std::to_string(fixed_size_array) + "*sizeof(" +
CUtils::get_c_type_from_ttype_t(mem_type) + "));\n";
} else {
if( !ASRUtils::is_fixed_size_array(m_dims, n_dims) ) {
sub += indent + name + "->" + itr.first + " = " + mem_var_name + ";\n";
}
} else if( ASR::is_a<ASR::Struct_t>(*mem_type) ) {
Expand Down Expand Up @@ -253,15 +252,15 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
if( is_array ) {
bool is_fixed_size = true;
dims = convert_dims_c(t->n_dims, t->m_dims, v_m_type, is_fixed_size, true);
if( v.m_abi == ASR::abiType::BindC && is_fixed_size ) {
bool is_struct_type_member = ASR::is_a<ASR::StructType_t>(
*ASR::down_cast<ASR::symbol_t>(v.m_parent_symtab->asr_owner));
if( is_fixed_size && is_struct_type_member ) {
if( !force_declare ) {
force_declare_name = std::string(v.m_name);
}
sub = type_name + " " + force_declare_name + dims;
} else {
std::string encoded_type_name = "i" + std::to_string(t->m_kind * 8);
bool is_struct_type_member = ASR::is_a<ASR::StructType_t>(
*ASR::down_cast<ASR::symbol_t>(v.m_parent_symtab->asr_owner));
if( !force_declare ) {
force_declare_name = std::string(v.m_name);
}
Expand All @@ -271,7 +270,8 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
(v.m_intent != ASRUtils::intent_in &&
v.m_intent != ASRUtils::intent_inout &&
v.m_intent != ASRUtils::intent_out &&
!is_struct_type_member) || force_declare, is_fixed_size);
!is_struct_type_member) || force_declare,
is_fixed_size, false, v.m_abi);
}
} else {
bool is_fixed_size = true;
Expand All @@ -285,15 +285,15 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
if( is_array ) {
bool is_fixed_size = true;
dims = convert_dims_c(t->n_dims, t->m_dims, v_m_type, is_fixed_size, true);
if( v.m_abi == ASR::abiType::BindC && is_fixed_size ) {
bool is_struct_type_member = ASR::is_a<ASR::StructType_t>(
*ASR::down_cast<ASR::symbol_t>(v.m_parent_symtab->asr_owner));
if( is_fixed_size && is_struct_type_member ) {
if( !force_declare ) {
force_declare_name = std::string(v.m_name);
}
sub = type_name + " " + force_declare_name + dims;
} else {
std::string encoded_type_name = "r" + std::to_string(t->m_kind * 8);
bool is_struct_type_member = ASR::is_a<ASR::StructType_t>(
*ASR::down_cast<ASR::symbol_t>(v.m_parent_symtab->asr_owner));
if( !force_declare ) {
force_declare_name = std::string(v.m_name);
}
Expand All @@ -318,15 +318,15 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
if( is_array ) {
bool is_fixed_size = true;
dims = convert_dims_c(t->n_dims, t->m_dims, v_m_type, is_fixed_size, true);
if( v.m_abi == ASR::abiType::BindC && is_fixed_size ) {
bool is_struct_type_member = ASR::is_a<ASR::StructType_t>(
*ASR::down_cast<ASR::symbol_t>(v.m_parent_symtab->asr_owner));
if( is_fixed_size && is_struct_type_member ) {
if( !force_declare ) {
force_declare_name = std::string(v.m_name);
}
sub = type_name + " " + force_declare_name + dims;
} else {
std::string encoded_type_name = "c" + std::to_string(t->m_kind * 8);
bool is_struct_type_member = ASR::is_a<ASR::StructType_t>(
*ASR::down_cast<ASR::symbol_t>(v.m_parent_symtab->asr_owner));
if( !force_declare ) {
force_declare_name = std::string(v.m_name);
}
Expand Down Expand Up @@ -1126,8 +1126,8 @@ R"(
ASR::ttype_t* x_mv_type = ASRUtils::expr_type(x.m_v);
ASR::dimension_t* m_dims;
int n_dims = ASRUtils::extract_dimensions_from_ttype(x_mv_type, m_dims);
bool is_data_only_array = (ASRUtils::is_fixed_size_array(m_dims, n_dims) &&
ASRUtils::expr_abi(x.m_v) == ASR::abiType::BindC);
bool is_data_only_array = ASRUtils::is_fixed_size_array(m_dims, n_dims) &&
ASR::is_a<ASR::StructType_t>(*ASRUtils::get_asr_owner(x.m_v));
if( is_data_only_array ) {
out += "[";
} else {
Expand Down
8 changes: 4 additions & 4 deletions src/libasr/codegen/asr_to_c_cpp.h
Original file line number Diff line number Diff line change
Expand Up @@ -732,10 +732,10 @@ R"(#include <stdio.h>
size_t n_target_dims = ASRUtils::extract_dimensions_from_ttype(m_target_type, m_target_dims);
ASR::dimension_t* m_value_dims = nullptr;
size_t n_value_dims = ASRUtils::extract_dimensions_from_ttype(m_value_type, m_value_dims);
bool is_target_data_only_array = (ASRUtils::expr_abi(x.m_target) == ASR::abiType::BindC &&
ASRUtils::is_fixed_size_array(m_target_dims, n_target_dims));
bool is_value_data_only_array = (ASRUtils::expr_abi(x.m_value) == ASR::abiType::BindC &&
ASRUtils::is_fixed_size_array(m_value_dims, n_value_dims));
bool is_target_data_only_array = ASRUtils::is_fixed_size_array(m_target_dims, n_target_dims) &&
ASR::is_a<ASR::StructType_t>(*ASRUtils::get_asr_owner(x.m_target));
bool is_value_data_only_array = ASRUtils::is_fixed_size_array(m_value_dims, n_value_dims) &&
ASR::is_a<ASR::StructType_t>(*ASRUtils::get_asr_owner(x.m_value));
if( is_target_data_only_array || is_value_data_only_array ) {
int64_t target_size = -1, value_size = -1;
if( !is_target_data_only_array ) {
Expand Down
13 changes: 11 additions & 2 deletions src/libasr/codegen/c_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -695,8 +695,17 @@ class CCPPDSUtils {
generated_code += indent + tab + get_deepcopy(member_type_asr, "&(src->" + item.first + ")",
"&(dest->" + item.first + ")") + ";\n";
} else if( ASRUtils::is_array(member_type_asr) ) {
generated_code += indent + tab + get_deepcopy(member_type_asr, "src->" + item.first,
"dest->" + item.first) + ";\n";
ASR::dimension_t* m_dims = nullptr;
size_t n_dims = ASRUtils::extract_dimensions_from_ttype(member_type_asr, m_dims);
if( ASRUtils::is_fixed_size_array(m_dims, n_dims) ) {
std::string array_size = std::to_string(ASRUtils::get_fixed_size_of_array(m_dims, n_dims));
array_size += "*sizeof(" + CUtils::get_c_type_from_ttype_t(member_type_asr) + ")";
generated_code += indent + tab + "memcpy(dest->" + item.first + ", src->" + item.first +
", " + array_size + ");\n";
} else {
generated_code += indent + tab + get_deepcopy(member_type_asr, "src->" + item.first,
"dest->" + item.first) + ";\n";
}
} else {
generated_code += indent + tab + "dest->" + item.first + " = " + " src->" + item.first + ";\n";
}
Expand Down

0 comments on commit 7252547

Please sign in to comment.