From: Zachary Snow Date: Thu, 17 Jun 2021 19:59:59 +0000 (-0400) Subject: sv: fix a few struct and enum memory leaks X-Git-Tag: yosys-0.10~120 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4446cfa524cf06e84add450214f64b2de6e199c3;p=yosys.git sv: fix a few struct and enum memory leaks --- diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index f85306423..695fc429d 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -331,6 +331,8 @@ static int size_packed_struct(AstNode *snode, int base_offset) } } // range nodes are now redundant + for (AstNode *child : node->children) + delete child; node->children.clear(); } else if (node->children.size() == 1 && node->children[0]->type == AST_MULTIRANGE) { @@ -345,6 +347,8 @@ static int size_packed_struct(AstNode *snode, int base_offset) save_struct_array_width(node, width); width *= array_count; // range nodes are now redundant + for (AstNode *child : node->children) + delete child; node->children.clear(); } else if (node->range_left < 0) { @@ -5052,6 +5056,9 @@ finished: void AstNode::allocateDefaultEnumValues() { log_assert(type==AST_ENUM); + log_assert(children.size() > 0); + if (children.front()->attributes.count(ID::enum_base_type)) + return; // already elaborated int last_enum_int = -1; for (auto node : children) { log_assert(node->type==AST_ENUM_ITEM); diff --git a/frontends/verilog/verilog_parser.y b/frontends/verilog/verilog_parser.y index 120a8bca3..9558b0e87 100644 --- a/frontends/verilog/verilog_parser.y +++ b/frontends/verilog/verilog_parser.y @@ -1711,10 +1711,12 @@ member_type_token: delete astbuf1; astbuf1 = template_node; } - | struct_union { + | { + delete astbuf1; + } struct_union { // stash state on ast_stack ast_stack.push_back(astbuf2); - astbuf2 = $1; + astbuf2 = $2; } struct_body { astbuf1 = astbuf2; // recover state