Skip to content

Commit 7efa3b7

Browse files
[C] Visit Global StructType
1 parent 7eebfd7 commit 7efa3b7

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/libasr/codegen/asr_to_c.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,32 @@ R"(
645645
array_types_decls += src;
646646
}
647647

648+
if (x.m_global_scope->get_symbol("_global_symbols") != nullptr) {
649+
struct_dep_graph.clear();
650+
SymbolTable *global_symbols = ASR::down_cast<ASR::Module_t>(
651+
x.m_global_scope->get_symbol("_global_symbols"))->m_symtab;
652+
for (auto &item : global_symbols->get_scope()) {
653+
if (ASR::is_a<ASR::StructType_t>(*item.second) ||
654+
ASR::is_a<ASR::EnumType_t>(*item.second) ||
655+
ASR::is_a<ASR::UnionType_t>(*item.second)) {
656+
std::vector<std::string> struct_deps_vec;
657+
std::pair<char**, size_t> struct_deps_ptr = ASRUtils::symbol_dependencies(item.second);
658+
for( size_t i = 0; i < struct_deps_ptr.second; i++ ) {
659+
struct_deps_vec.push_back(std::string(struct_deps_ptr.first[i]));
660+
}
661+
struct_dep_graph[item.first] = struct_deps_vec;
662+
}
663+
}
664+
665+
std::vector<std::string> struct_deps = ASRUtils::order_deps(struct_dep_graph);
666+
667+
for (auto &item : struct_deps) {
668+
ASR::symbol_t* struct_sym = global_symbols->get_symbol(item);
669+
visit_symbol(*struct_sym);
670+
array_types_decls += src;
671+
}
672+
}
673+
648674
// Topologically sort all global functions
649675
// and then define them in the right order
650676
std::vector<std::string> global_func_order = ASRUtils::determine_function_definition_order(x.m_global_scope);

0 commit comments

Comments
 (0)