From 5777ab75c7de30270d3f4e53c358c26a92c1fa3d Mon Sep 17 00:00:00 2001 From: Igor Zaworski <84542280+igorosky@users.noreply.github.com> Date: Tue, 8 Jul 2025 16:28:17 +0200 Subject: [PATCH] Fix crash with --dumpi-V3LinkDot without --debug (#6159) --- docs/CONTRIBUTORS | 1 + src/V3LinkDot.cpp | 26 +++++++++++++------------- test_regress/t/t_mod_empty.py | 16 ++++++++++++++++ test_regress/t/t_mod_empty.v | 8 ++++++++ 4 files changed, 38 insertions(+), 13 deletions(-) create mode 100755 test_regress/t/t_mod_empty.py create mode 100644 test_regress/t/t_mod_empty.v diff --git a/docs/CONTRIBUTORS b/docs/CONTRIBUTORS index 459fe8b03..8b3ccd0ed 100644 --- a/docs/CONTRIBUTORS +++ b/docs/CONTRIBUTORS @@ -83,6 +83,7 @@ Huang Rui Huanghuang Zhou HungMingWu HyungKi Jeong +Igor Zaworski Ilya Barkov Iru Cai Ivan Vnučec diff --git a/src/V3LinkDot.cpp b/src/V3LinkDot.cpp index e43da39fb..313307919 100644 --- a/src/V3LinkDot.cpp +++ b/src/V3LinkDot.cpp @@ -2762,7 +2762,7 @@ class LinkDotResolveVisitor final : public VNVisitor { if (nodep->name() == "__paramNumber1" && m_cellp && VN_IS(m_cellp->modp(), Primitive)) { // Primitive parameter is really a delay we can just ignore - VL_DO_DANGLING(nodep->unlinkFrBack()->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); return; } else { const string suggest @@ -3231,7 +3231,7 @@ class LinkDotResolveVisitor final : public VNVisitor { taskrefp = new AstFuncRef{nodep->fileline(), nodep->name(), nullptr}; } nodep->replaceWith(taskrefp); - VL_DO_DANGLING(nodep->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep), nodep); m_ds = lastStates; return; } else if (AstVar* const varp = foundToVarp(foundp, nodep, VAccess::READ)) { @@ -3665,7 +3665,7 @@ class LinkDotResolveVisitor final : public VNVisitor { AstVarRef* const newrefp = new AstVarRef{nodep->fileline(), nodep->varp(), nodep->access()}; nodep->replaceWith(newrefp); - VL_DO_DANGLING(nodep->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep), nodep); } } } @@ -3693,7 +3693,7 @@ class LinkDotResolveVisitor final : public VNVisitor { AstVarRef* const newvscp = new AstVarRef{nodep->fileline(), vscp, nodep->access()}; nodep->replaceWith(newvscp); - VL_DO_DANGLING(nodep->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep), nodep); UINFO(9, indent() << "new " << newvscp); // Also prints taskp } } @@ -3983,7 +3983,7 @@ class LinkDotResolveVisitor final : public VNVisitor { AstNode* addp = pinp; if (AstArg* const argp = VN_CAST(pinp, Arg)) { addp = argp->exprp()->unlinkFrBack(); - VL_DO_DANGLING(pinp->deleteTree(), pinp); + VL_DO_DANGLING(pushDeletep(pinp), pinp); } outp = AstNode::addNext(outp, addp); } @@ -3991,7 +3991,7 @@ class LinkDotResolveVisitor final : public VNVisitor { newp->dtypep(nodep->dtypep()); } nodep->replaceWith(newp); - VL_DO_DANGLING(nodep->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep), nodep); return; } else { VSpellCheck speller; @@ -4431,7 +4431,7 @@ class LinkDotResolveVisitor final : public VNVisitor { cpackagep->v3warn(E_UNSUPPORTED, "Unsupported: Multiple '::' package/class reference"); } - VL_DO_DANGLING(cpackagep->unlinkFrBack()->deleteTree(), cpackagep); + VL_DO_DANGLING(pushDeletep(cpackagep->unlinkFrBack()), cpackagep); } if (m_ds.m_dotp && (m_ds.m_dotPos == DP_PACKAGE || m_ds.m_dotPos == DP_SCOPE)) { UASSERT_OBJ(VN_IS(m_ds.m_dotp->lhsp(), ClassOrPackageRef), m_ds.m_dotp->lhsp(), @@ -4476,7 +4476,7 @@ class LinkDotResolveVisitor final : public VNVisitor { = new AstClassRefDType{nodep->fileline(), defp, paramsp}; newp->classOrPackagep(foundp->classOrPackagep()); nodep->replaceWith(newp); - VL_DO_DANGLING(nodep->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep), nodep); return; } else if (m_insideClassExtParam) { return; @@ -4508,25 +4508,25 @@ class LinkDotResolveVisitor final : public VNVisitor { taskp->dpiExport(true); if (nodep->cname() != "") taskp->cname(nodep->cname()); } - VL_DO_DANGLING(nodep->unlinkFrBack()->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); } void visit(AstPackageImport* nodep) override { // No longer needed LINKDOT_VISIT_START(); checkNoDot(nodep); - VL_DO_DANGLING(nodep->unlinkFrBack()->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); } void visit(AstPackageExport* nodep) override { // No longer needed LINKDOT_VISIT_START(); checkNoDot(nodep); - VL_DO_DANGLING(nodep->unlinkFrBack()->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); } void visit(AstPackageExportStarStar* nodep) override { // No longer needed LINKDOT_VISIT_START(); checkNoDot(nodep); - VL_DO_DANGLING(nodep->unlinkFrBack()->deleteTree(), nodep); + VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); } void visit(AstCellRef* nodep) override { LINKDOT_VISIT_START(); @@ -4648,7 +4648,7 @@ void V3LinkDot::linkDotGuts(AstNetlist* rootp, VLinkDotStep step) { state.computeIfaceVarSyms(); state.computeScopeAliases(); state.dumpSelf(); - { LinkDotResolveVisitor{rootp, &state}; } + LinkDotResolveVisitor visitor{rootp, &state}; state.dumpSelf(); } diff --git a/test_regress/t/t_mod_empty.py b/test_regress/t/t_mod_empty.py new file mode 100755 index 000000000..bf552cd4c --- /dev/null +++ b/test_regress/t/t_mod_empty.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2025 by Wilson Snyder. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +import vltest_bootstrap + +test.scenarios('simulator') + +test.compile(verilator_flags2=["--cc", "--dumpi-V3LinkDot", "6"]) + +test.passes() diff --git a/test_regress/t/t_mod_empty.v b/test_regress/t/t_mod_empty.v new file mode 100644 index 000000000..e79e0ec68 --- /dev/null +++ b/test_regress/t/t_mod_empty.v @@ -0,0 +1,8 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed under the Creative Commons Public Domain, for +// any use, without warranty, 2025 by Antmicro. +// SPDX-License-Identifier: CC0-1.0 + +module emptyModule; +endmodule