mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-19 04:13:39 +00:00
ast: fix new memory safety bugs from rebase
This commit is contained in:
parent
20225d19ae
commit
5af4e05125
3 changed files with 12 additions and 3 deletions
|
@ -1612,7 +1612,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
|
||||||
if (left_at_zero_ast->type != AST_CONSTANT || right_at_zero_ast->type != AST_CONSTANT)
|
if (left_at_zero_ast->type != AST_CONSTANT || right_at_zero_ast->type != AST_CONSTANT)
|
||||||
input_error("Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str());
|
input_error("Unsupported expression on dynamic range select on signal `%s'!\n", str.c_str());
|
||||||
int width = abs(int(left_at_zero_ast->integer - right_at_zero_ast->integer)) + 1;
|
int width = abs(int(left_at_zero_ast->integer - right_at_zero_ast->integer)) + 1;
|
||||||
auto fake_ast = new AstNode(AST_NONE, clone(), children[0]->children.size() >= 2 ?
|
auto fake_ast = std::make_unique<AstNode>(AST_NONE, clone(), children[0]->children.size() >= 2 ?
|
||||||
children[0]->children[1]->clone() : children[0]->children[0]->clone());
|
children[0]->children[1]->clone() : children[0]->children[0]->clone());
|
||||||
fake_ast->children[0]->delete_children();
|
fake_ast->children[0]->delete_children();
|
||||||
if (member_node)
|
if (member_node)
|
||||||
|
@ -1633,7 +1633,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
|
||||||
}
|
}
|
||||||
if (GetSize(shift_val) >= 32)
|
if (GetSize(shift_val) >= 32)
|
||||||
fake_ast->children[1]->is_signed = true;
|
fake_ast->children[1]->is_signed = true;
|
||||||
RTLIL::SigSpec sig = binop2rtlil(fake_ast, ID($shiftx), width, fake_ast->children[0]->genRTLIL(), shift_val);
|
RTLIL::SigSpec sig = binop2rtlil(fake_ast.get(), ID($shiftx), width, fake_ast->children[0]->genRTLIL(), shift_val);
|
||||||
return sig;
|
return sig;
|
||||||
} else {
|
} else {
|
||||||
chunk.width = children[0]->range_left - children[0]->range_right + 1;
|
chunk.width = children[0]->range_left - children[0]->range_right + 1;
|
||||||
|
|
|
@ -1505,7 +1505,7 @@ bool AstNode::simplify(bool const_fold, int stage, int width_hint, bool sign_hin
|
||||||
if (children[0]->type == AST_WIRE) {
|
if (children[0]->type == AST_WIRE) {
|
||||||
int width = 1;
|
int width = 1;
|
||||||
std::unique_ptr<AstNode> node;
|
std::unique_ptr<AstNode> node;
|
||||||
AstNode* child = children[0].release();
|
AstNode* child = children[0].get();
|
||||||
if (child->children.size() == 0) {
|
if (child->children.size() == 0) {
|
||||||
// Base type (e.g., int)
|
// Base type (e.g., int)
|
||||||
width = child->range_left - child->range_right +1;
|
width = child->range_left - child->range_right +1;
|
||||||
|
|
|
@ -2844,6 +2844,7 @@ behavioral_stmt:
|
||||||
std::unique_ptr<AstNode> node_owned;
|
std::unique_ptr<AstNode> node_owned;
|
||||||
AstNode* node = nullptr;
|
AstNode* node = nullptr;
|
||||||
AstNode *context = extra->ast_stack.back();
|
AstNode *context = extra->ast_stack.back();
|
||||||
|
bool patch_block_on_stack = false;
|
||||||
if (context && context->type == AST_BLOCK && context->get_bool_attribute(ID::promoted_if)) {
|
if (context && context->type == AST_BLOCK && context->get_bool_attribute(ID::promoted_if)) {
|
||||||
AstNode *outer = extra->ast_stack[extra->ast_stack.size() - 2];
|
AstNode *outer = extra->ast_stack[extra->ast_stack.size() - 2];
|
||||||
log_assert (outer && outer->type == AST_CASE);
|
log_assert (outer && outer->type == AST_CASE);
|
||||||
|
@ -2852,6 +2853,9 @@ behavioral_stmt:
|
||||||
node = outer;
|
node = outer;
|
||||||
log_assert (node->children.size());
|
log_assert (node->children.size());
|
||||||
node->children.pop_back();
|
node->children.pop_back();
|
||||||
|
// `context` has been killed as a grandchild of `outer`
|
||||||
|
// we have to undangle it from the stack
|
||||||
|
patch_block_on_stack = true;
|
||||||
} else if (outer->get_bool_attribute(ID::full_case))
|
} else if (outer->get_bool_attribute(ID::full_case))
|
||||||
(*$1)[ID::full_case] = AstNode::mkconst_int(1, false);
|
(*$1)[ID::full_case] = AstNode::mkconst_int(1, false);
|
||||||
}
|
}
|
||||||
|
@ -2863,12 +2867,17 @@ behavioral_stmt:
|
||||||
append_attr(node, $1);
|
append_attr(node, $1);
|
||||||
node->children.push_back(node->get_bool_attribute(ID::parallel_case) ? AstNode::mkconst_int(1, false, 1) : expr->clone());
|
node->children.push_back(node->get_bool_attribute(ID::parallel_case) ? AstNode::mkconst_int(1, false, 1) : expr->clone());
|
||||||
extra->ast_stack.back()->children.push_back(std::move(node_owned));
|
extra->ast_stack.back()->children.push_back(std::move(node_owned));
|
||||||
|
} else {
|
||||||
|
free_attr($1);
|
||||||
}
|
}
|
||||||
auto block_owned = std::make_unique<AstNode>(AST_BLOCK);
|
auto block_owned = std::make_unique<AstNode>(AST_BLOCK);
|
||||||
auto* block = block_owned.get();
|
auto* block = block_owned.get();
|
||||||
auto cond_owned = std::make_unique<AstNode>(AST_COND, node->get_bool_attribute(ID::parallel_case) ? std::move(expr) : AstNode::mkconst_int(1, false, 1), std::move(block_owned));
|
auto cond_owned = std::make_unique<AstNode>(AST_COND, node->get_bool_attribute(ID::parallel_case) ? std::move(expr) : AstNode::mkconst_int(1, false, 1), std::move(block_owned));
|
||||||
SET_AST_NODE_LOC(cond_owned.get(), @4, @4);
|
SET_AST_NODE_LOC(cond_owned.get(), @4, @4);
|
||||||
node->children.push_back(std::move(cond_owned));
|
node->children.push_back(std::move(cond_owned));
|
||||||
|
// Double it and give it to the next person
|
||||||
|
if (patch_block_on_stack)
|
||||||
|
extra->ast_stack.back() = block;
|
||||||
extra->ast_stack.push_back(node);
|
extra->ast_stack.push_back(node);
|
||||||
extra->ast_stack.push_back(block);
|
extra->ast_stack.push_back(block);
|
||||||
} behavioral_stmt {
|
} behavioral_stmt {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue