From 16008acdf146a8d8d4707e676ba3662906fc8c18 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 12 Aug 2023 10:51:35 -0400 Subject: [PATCH] Internals: Add disabled duplicate function check (#4418) --- src/V3Broken.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/V3Broken.cpp b/src/V3Broken.cpp index f8db359ba..961d243ec 100644 --- a/src/V3Broken.cpp +++ b/src/V3Broken.cpp @@ -162,6 +162,7 @@ class BrokenCheckVisitor final : public VNVisitorConst { // STATE - for current visit position (use VL_RESTORER) const AstCFunc* m_cfuncp = nullptr; // Current CFunc, if any bool m_inScope = false; // Under AstScope + std::set m_cFuncNames; // CFunc by name in current class/module private: // METHODS @@ -239,6 +240,18 @@ private: void visit(AstScope* nodep) override { VL_RESTORER(m_inScope); m_inScope = true; + VL_RESTORER(m_cFuncNames); + m_cFuncNames.clear(); + processAndIterate(nodep); + } + void visit(AstNodeModule* nodep) override { + VL_RESTORER(m_cFuncNames); + m_cFuncNames.clear(); + processAndIterate(nodep); + } + void visit(AstNodeUOrStructDType* nodep) override { + VL_RESTORER(m_cFuncNames); + m_cFuncNames.clear(); processAndIterate(nodep); } void visit(AstNodeVarRef* nodep) override { @@ -268,6 +281,14 @@ private: m_localsStack.clear(); pushLocalScope(); + // Check for duplicate names, otherwise linker might just ignore them + string nameArgs = nodep->name(); + if (!nodep->argTypes().empty()) nameArgs += "(" + nodep->argTypes() + ")"; + if (false) { // bug4418 + UASSERT_OBJ(m_cFuncNames.emplace(nameArgs).second, nodep, + "Duplicate cfunc name: '" << nameArgs << "'"); + } + processAndIterate(nodep); // Check suspect references are all to non-locals