From b46f2e5c0103d4b7407b69195995388f893ffc42 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Mon, 12 Feb 2024 22:37:30 +0000 Subject: [PATCH] Fix crash with external name and component declarations --- src/elab.c | 14 +++++++-- src/jit/jit-irgen.c | 2 +- src/lower.c | 13 +++++--- test/regress/ename7.vhd | 62 +++++++++++++++++++++++++++++++++++++++ test/regress/testlist.txt | 1 + 5 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 test/regress/ename7.vhd diff --git a/src/elab.c b/src/elab.c index 72400984..a2504613 100644 --- a/src/elab.c +++ b/src/elab.c @@ -2036,6 +2036,17 @@ tree_t elab_external_name(tree_t name, tree_t root, ident_t *path) return NULL; } + tree_t hier = tree_decl(where, 0); + assert(tree_kind(hier) == T_HIER); + + if (tree_subkind(hier) == T_COMPONENT) { + // Skip over implicit block for component declaration + where = tree_stmt(where, 0); + assert(tree_kind(where) == T_BLOCK); + hier = tree_decl(where, 0); + *path = ident_prefix(*path, tree_ident(where), '.'); + } + const int nstmts = tree_stmts(where); for (int i = 0; i < nstmts; i++) { tree_t s = tree_stmt(where, i); @@ -2056,9 +2067,6 @@ tree_t elab_external_name(tree_t name, tree_t root, ident_t *path) istr(tree_ident(where))); if (tree_kind(where) == T_BLOCK) { - tree_t hier = tree_decl(where, 0); - assert(tree_kind(hier) == T_HIER); - tree_t unit = tree_ref(hier); const int nstmts = tree_stmts(unit); for (int i = 0; i < nstmts; i++) { diff --git a/src/jit/jit-irgen.c b/src/jit/jit-irgen.c index aad0f8e2..bc12358d 100644 --- a/src/jit/jit-irgen.c +++ b/src/jit/jit-irgen.c @@ -2567,7 +2567,7 @@ static void irgen_op_link_var(jit_irgen_t *g, int op) break; } - if (tab == NULL) + if (tab == f->linktab + f->nvars) fatal_trace("variable %s not found in unit %s", istr(var_name), istr(unit_name)); diff --git a/src/lower.c b/src/lower.c index b0865efb..86a944c8 100644 --- a/src/lower.c +++ b/src/lower.c @@ -3145,10 +3145,15 @@ static vcode_reg_t lower_external_name(lower_unit_t *lu, tree_t ref) } for (lower_unit_t *it = lu; it; it = it->parent) { - if (is_concurrent_block(it->container) && caret-- == 0) { - root = it->container; - path = it->name; - break; + if (is_concurrent_block(it->container)) { + tree_t hier = tree_decl(it->container, 0); + if (tree_subkind(hier) == T_COMPONENT) + continue; // Skip over implicit block for component + else if (caret-- == 0) { + root = it->container; + path = it->name; + break; + } } } } diff --git a/test/regress/ename7.vhd b/test/regress/ename7.vhd new file mode 100644 index 00000000..cc8fa3ab --- /dev/null +++ b/test/regress/ename7.vhd @@ -0,0 +1,62 @@ +entity sub1 is +end entity; + +architecture test of sub1 is + signal t : natural; +begin + + p1: process is + alias s is <>; + begin + s <= 5; + wait for 0 ns; + assert t = 42; + wait; + end process; + +end architecture; + +------------------------------------------------------------------------------- + +entity sub2 is +end entity; + +architecture test of sub2 is +begin + + p2: process is + alias t is <>; + begin + t <= 42; + wait; + end process; + +end architecture; + +------------------------------------------------------------------------------- + +entity ename7 is +end entity; + +architecture test of ename7 is + signal s : natural; + + component sub1 is + end component; + + component sub2 is + end component; +begin + + u1: component sub1; + u2: component sub2; + + p3: process is + begin + assert s = 0; + wait for 0 ns; + assert s = 5; + wait; + end process; + +end architecture; diff --git a/test/regress/testlist.txt b/test/regress/testlist.txt index 1a7c1d79..58b14291 100644 --- a/test/regress/testlist.txt +++ b/test/regress/testlist.txt @@ -938,3 +938,4 @@ wave9 wave wave10 wave driver20 normal driver21 fail,gold +ename7 normal,2008 -- 2.39.2