From 04825791c2eae9ca7b6de00bbc5e5eac2c200538 Mon Sep 17 00:00:00 2001 From: arteevraina Date: Thu, 26 Oct 2023 00:01:25 +0530 Subject: [PATCH 1/2] refactor: check for dependency only in parent scope --- src/libasr/asr_verify.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libasr/asr_verify.cpp b/src/libasr/asr_verify.cpp index 785478765d..bad26da46b 100644 --- a/src/libasr/asr_verify.cpp +++ b/src/libasr/asr_verify.cpp @@ -441,15 +441,15 @@ class VerifyVisitor : public BaseWalkVisitor verify_unique_dependencies(x.m_dependencies, x.n_dependencies, x.m_name, x.base.base.loc); - // Get the x symtab. - SymbolTable *x_symtab = x.m_symtab; + // Get the x parent symtab. + SymbolTable *x_parent_symtab = x.m_symtab->parent; // Dependencies of the function should be from function's parent symbol table. for( size_t i = 0; i < x.n_dependencies; i++ ) { std::string found_dep = x.m_dependencies[i]; // Get the symbol of the found_dep. - ASR::symbol_t* dep_sym = x_symtab->resolve_symbol(found_dep); + ASR::symbol_t* dep_sym = x_parent_symtab->resolve_symbol(found_dep); require(dep_sym != nullptr, "Dependency " + found_dep + " is inside symbol table " + std::string(x.m_name)); From c487d20f93033c2f0c4c464d42694317b56e61ac Mon Sep 17 00:00:00 2001 From: arteevraina Date: Sat, 4 Nov 2023 14:54:23 +0530 Subject: [PATCH 2/2] refactor: added logic for associate block & block before adding dependencies --- src/libasr/asr_utils.h | 24 ++++++++++++++++++------ src/libasr/asr_verify.cpp | 26 +++++++++++++++++++------- src/libasr/pass/pass_utils.h | 27 +++++++++++++++++++++------ 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/libasr/asr_utils.h b/src/libasr/asr_utils.h index 06e42e7fd9..b773f0772b 100644 --- a/src/libasr/asr_utils.h +++ b/src/libasr/asr_utils.h @@ -20,9 +20,15 @@ } \ SymbolTable* temp_scope = current_scope; \ if (asr_owner_sym && temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(final_sym)->get_counter() && \ - !ASR::is_a(*asr_owner_sym) && !ASR::is_a(*final_sym) && \ - !ASR::is_a(*final_sym)) { \ - current_function_dependencies.push_back(al, ASRUtils::symbol_name(final_sym)); \ + !ASR::is_a(*final_sym) && !ASR::is_a(*final_sym)) { \ + if (ASR::is_a(*asr_owner_sym) || ASR::is_a(*asr_owner_sym)) { \ + temp_scope = temp_scope->parent; \ + if (temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(final_sym)->get_counter()) { \ + current_function_dependencies.push_back(al, ASRUtils::symbol_name(final_sym)); \ + } \ + } else { \ + current_function_dependencies.push_back(al, ASRUtils::symbol_name(final_sym)); \ + } \ } \ #define ADD_ASR_DEPENDENCIES_WITH_NAME(current_scope, final_sym, current_function_dependencies, dep_name) ASR::symbol_t* asr_owner_sym = nullptr; \ @@ -31,9 +37,15 @@ } \ SymbolTable* temp_scope = current_scope; \ if (asr_owner_sym && temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(final_sym)->get_counter() && \ - !ASR::is_a(*asr_owner_sym) && !ASR::is_a(*final_sym) && \ - !ASR::is_a(*final_sym)) { \ - current_function_dependencies.push_back(al, dep_name); \ + !ASR::is_a(*final_sym) && !ASR::is_a(*final_sym)) { \ + if (ASR::is_a(*asr_owner_sym) || ASR::is_a(*asr_owner_sym)) { \ + temp_scope = temp_scope->parent; \ + if (temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(final_sym)->get_counter()) { \ + current_function_dependencies.push_back(al, dep_name); \ + } \ + } else { \ + current_function_dependencies.push_back(al, dep_name); \ + } \ } \ namespace LCompilers { diff --git a/src/libasr/asr_verify.cpp b/src/libasr/asr_verify.cpp index bad26da46b..ffdad9f39e 100644 --- a/src/libasr/asr_verify.cpp +++ b/src/libasr/asr_verify.cpp @@ -891,10 +891,16 @@ class VerifyVisitor : public BaseWalkVisitor SymbolTable* temp_scope = current_symtab; - if (temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter() && - !ASR::is_a(*asr_owner_sym) && !ASR::is_a(*x.m_name) && - !ASR::is_a(*x.m_name)) { - function_dependencies.push_back(std::string(ASRUtils::symbol_name(x.m_name))); + if (asr_owner_sym && temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter() && + !ASR::is_a(*x.m_name) && !ASR::is_a(*x.m_name)) { + if (ASR::is_a(*asr_owner_sym) || ASR::is_a(*asr_owner_sym)) { + temp_scope = temp_scope->parent; + if (temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter()) { + function_dependencies.push_back(std::string(ASRUtils::symbol_name(x.m_name))); + } + } else { + function_dependencies.push_back(std::string(ASRUtils::symbol_name(x.m_name))); + } } if( ASR::is_a(*x.m_name) ) { @@ -1037,9 +1043,15 @@ class VerifyVisitor : public BaseWalkVisitor SymbolTable* temp_scope = current_symtab; if (asr_owner_sym && temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter() && - !ASR::is_a(*asr_owner_sym) && !ASR::is_a(*x.m_name) && - !ASR::is_a(*x.m_name)) { - function_dependencies.push_back(std::string(ASRUtils::symbol_name(x.m_name))); + !ASR::is_a(*x.m_name) && !ASR::is_a(*x.m_name)) { + if (ASR::is_a(*asr_owner_sym) || ASR::is_a(*asr_owner_sym)) { + temp_scope = temp_scope->parent; + if (temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter()) { + function_dependencies.push_back(std::string(ASRUtils::symbol_name(x.m_name))); + } + } else { + function_dependencies.push_back(std::string(ASRUtils::symbol_name(x.m_name))); + } } if( ASR::is_a(*x.m_name) ) { diff --git a/src/libasr/pass/pass_utils.h b/src/libasr/pass/pass_utils.h index dddd00b3b7..0066388749 100644 --- a/src/libasr/pass/pass_utils.h +++ b/src/libasr/pass/pass_utils.h @@ -341,9 +341,15 @@ namespace LCompilers { SymbolTable* temp_scope = current_scope; if (asr_owner_sym && temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter() && - !ASR::is_a(*asr_owner_sym) && !ASR::is_a(*x.m_name) && - !ASR::is_a(*x.m_name)) { - function_dependencies.push_back(al, ASRUtils::symbol_name(x.m_name)); + !ASR::is_a(*x.m_name) && !ASR::is_a(*x.m_name)) { + if (ASR::is_a(*asr_owner_sym) || ASR::is_a(*asr_owner_sym)) { + temp_scope = temp_scope->parent; + if (temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter()) { + function_dependencies.push_back(al, ASRUtils::symbol_name(x.m_name)); + } + } else { + function_dependencies.push_back(al, ASRUtils::symbol_name(x.m_name)); + } } } @@ -367,9 +373,15 @@ namespace LCompilers { SymbolTable* temp_scope = current_scope; if (asr_owner_sym && temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter() && - !ASR::is_a(*asr_owner_sym) && !ASR::is_a(*x.m_name) && - !ASR::is_a(*x.m_name)) { - function_dependencies.push_back(al, ASRUtils::symbol_name(x.m_name)); + !ASR::is_a(*x.m_name) && !ASR::is_a(*x.m_name)) { + if (ASR::is_a(*asr_owner_sym) || ASR::is_a(*asr_owner_sym)) { + temp_scope = temp_scope->parent; + if (temp_scope->get_counter() != ASRUtils::symbol_parent_symtab(x.m_name)->get_counter()) { + function_dependencies.push_back(al, ASRUtils::symbol_name(x.m_name)); + } + } else { + function_dependencies.push_back(al, ASRUtils::symbol_name(x.m_name)); + } } } @@ -384,10 +396,13 @@ namespace LCompilers { } void visit_BlockCall(const ASR::BlockCall_t& x) { + SymbolTable *parent_symtab = current_scope; ASR::Block_t* block = ASR::down_cast(x.m_m); + current_scope = block->m_symtab; for (size_t i=0; in_body; i++) { visit_stmt(*(block->m_body[i])); } + current_scope = parent_symtab; } void visit_AssociateBlock(const ASR::AssociateBlock_t& x) {