diff --git a/src/V3LinkCells.cpp b/src/V3LinkCells.cpp index ac2528986..fbed9a1de 100644 --- a/src/V3LinkCells.cpp +++ b/src/V3LinkCells.cpp @@ -122,8 +122,14 @@ private: return (nodep->user1p()->castGraphVertex()); } + AstNodeModule* findModuleSym(const string& modName) { + VSymEnt* foundp = m_mods.rootp()->findIdFallback(modName); + if (!foundp) return NULL; + else return foundp->nodep()->castNodeModule(); + } + AstNodeModule* resolveModule(AstNode* nodep, const string& modName) { - AstNodeModule* modp = m_mods.rootp()->findIdFallback(modName)->nodep()->castNodeModule(); + AstNodeModule* modp = findModuleSym(modName); if (!modp) { // Read-subfile // If file not found, make AstNotFoundModule, rather than error out. @@ -135,7 +141,7 @@ private: // We've read new modules, grab new pointers to their names readModNames(); // Check again - modp = m_mods.rootp()->findIdFallback(modName)->nodep()->castNodeModule(); + modp = findModuleSym(modName); if (!modp) { // This shouldn't throw a message as parseFile will create a AstNotFoundModule for us nodep->v3error("Can't resolve module reference: "<modulesp(); nodep; nodep=nextp) { nextp = nodep->nextp()->castNodeModule(); - AstNode* foundp = m_mods.rootp()->findIdFallback(nodep->name())->nodep(); + AstNodeModule* foundp = findModuleSym(nodep->name()); if (foundp && foundp != nodep) { if (!(foundp->fileline()->warnIsOff(V3ErrorCode::MODDUP) || nodep->fileline()->warnIsOff(V3ErrorCode::MODDUP))) { nodep->v3warn(MODDUP,"Duplicate declaration of module: "<prettyName()<findIdFlat(name); - AstNode* fnodep = foundp->nodep(); + AstNode* fnodep = foundp ? foundp->nodep() : NULL; if (!fnodep) { // Not found, will add in a moment. } else if (nodep==fnodep) { // Already inserted. @@ -378,7 +378,7 @@ public: void computeIfaceVarSyms() { for (IfaceVarSyms::iterator it = m_ifaceVarSyms.begin(); it != m_ifaceVarSyms.end(); ++it) { VSymEnt* varSymp = *it; - AstVar* varp = varSymp->nodep()->castVar(); + AstVar* varp = varSymp ? varSymp->nodep()->castVar() : NULL; UINFO(9, " insAllIface se"<<(void*)varSymp<<" "<subDTypep()); if (!ifacerefp) varp->v3fatalSrc("Non-ifacerefs on list!"); @@ -489,8 +489,8 @@ public: // then look up (inst name or modname) if (firstId) { // Check this module - subcellnames - AstCell* cellp = lookupSymp->nodep()->castCell(); // Replicated below - AstCellInline* inlinep = lookupSymp->nodep()->castCellInline(); // Replicated below + AstCell* cellp = lookupSymp ? lookupSymp->nodep()->castCell() : NULL; // Replicated below + AstCellInline* inlinep = lookupSymp ? lookupSymp->nodep()->castCellInline() : NULL; // Replicated below if (VSymEnt* findSymp = findWithAltFallback(lookupSymp, ident, altIdent)) { lookupSymp = findSymp; } @@ -501,8 +501,8 @@ public: else { while (lookupSymp) { lookupSymp = lookupSymp->parentp(); - cellp = lookupSymp->nodep()->castCell(); // Replicated above - inlinep = lookupSymp->nodep()->castCellInline(); // Replicated above + cellp = lookupSymp ? lookupSymp->nodep()->castCell() : NULL; // Replicated above + inlinep = lookupSymp ? lookupSymp->nodep()->castCellInline() : NULL; // Replicated above if (lookupSymp) { UINFO(9,"\t\tUp to "<modp()->origName() == ident) @@ -1033,7 +1033,7 @@ private: nodep->iterateChildren(*this); nodep->v3warn(DEFPARAM,"Suggest replace defparam with Verilog 2001 #(."<prettyName()<<"(...etc...))"); VSymEnt* foundp = m_statep->getNodeSym(nodep)->findIdFallback(nodep->path()); - AstCell* cellp = foundp->nodep()->castCell(); + AstCell* cellp = foundp ? foundp->nodep()->castCell() : NULL; if (!cellp) { nodep->v3error("In defparam, cell "<path()<<" never declared"); } else { @@ -1055,7 +1055,7 @@ private: // Need to set pin numbers after varnames are created // But before we do the final resolution based on names VSymEnt* foundp = m_statep->getNodeSym(m_modp)->findIdFlat(nodep->name()); - AstVar* refp = foundp->nodep()->castVar(); + AstVar* refp = foundp ? foundp->nodep()->castVar() : NULL; if (!refp) { nodep->v3error("Input/output/inout declaration not found for port: "<prettyName()); } else if (!refp->isIO() && !refp->isIfaceRef()) { @@ -1513,7 +1513,7 @@ private: if (!nodep->modVarp()) { if (!m_pinSymp) nodep->v3fatalSrc("Pin not under cell?\n"); VSymEnt* foundp = m_pinSymp->findIdFlat(nodep->name()); - AstVar* refp = foundp->nodep()->castVar(); + AstVar* refp = foundp ? foundp->nodep()->castVar() : NULL; const char* whatp = nodep->param() ? "parameter pin" : "pin"; if (!refp) { if (nodep->name() == "__paramNumber1" && m_cellp->modp()->castPrimitive()) { @@ -1661,8 +1661,10 @@ private: <<" n="<nodep()<nodep()->castCell() || foundp->nodep()->castBegin() - || foundp->nodep()->castModule()) { // if top + if (!foundp) { + } else if (foundp->nodep()->castCell() + || foundp->nodep()->castBegin() + || foundp->nodep()->castModule()) { // if top if (allowScope) { ok = true; if (m_ds.m_dotText!="") m_ds.m_dotText += "."; @@ -1679,7 +1681,8 @@ private: VSymEnt* cellEntp = m_statep->getNodeSym(cellp); if (!cellEntp) nodep->v3fatalSrc("No interface sym entry"); VSymEnt* parentEntp = cellEntp->parentp(); // Container of the var; probably a module or generate begin string findName = nodep->name()+"__Viftop"; - AstVar* ifaceRefVarp = parentEntp->findIdFallback(findName)->nodep()->castVar(); + VSymEnt* ifaceSymp = parentEntp->findIdFallback(findName); + AstVar* ifaceRefVarp = ifaceSymp ? ifaceSymp->nodep()->castVar() : NULL; if (!ifaceRefVarp) nodep->v3fatalSrc("Can't find interface var ref: "<findIdFallback(nodep->name()); - if (AstVar* varp = foundp->nodep()->castVar()) { + if (AstVar* varp = foundp ? foundp->nodep()->castVar() : NULL) { nodep->varp(varp); nodep->packagep(foundp->packagep()); // Generally set by parse, but might be an import } @@ -1845,7 +1848,7 @@ private: dotSymp = m_statep->findDotted(dotSymp, nodep->dotted(), baddot, okSymp); // Maybe NULL if (!m_statep->forScopeCreation()) { VSymEnt* foundp = m_statep->findSymPrefixed(dotSymp, nodep->name(), baddot); - AstVar* varp = foundp->nodep()->castVar(); // maybe NULL + AstVar* varp = foundp ? foundp->nodep()->castVar() : NULL; nodep->varp(varp); UINFO(7," Resolved "<varp()) { @@ -1864,7 +1867,7 @@ private: } else { string baddot; VSymEnt* foundp = m_statep->findSymPrefixed(dotSymp, nodep->name(), baddot); - AstVarScope* vscp = foundp->nodep()->castVarScope(); // maybe NULL + AstVarScope* vscp = foundp ? foundp->nodep()->castVarScope() : NULL; if (!vscp) { nodep->v3error("Can't find varpin scope of '"<dotted()+"."+nodep->prettyName()); okSymp->cellErrorScopes(nodep); @@ -2085,7 +2088,7 @@ private: } else { foundp = m_curSymp->findIdFallback(nodep->name()); } - if (AstTypedef* defp = foundp->nodep()->castTypedef()) { + if (AstTypedef* defp = foundp ? foundp->nodep()->castTypedef() : NULL) { nodep->refDTypep(defp->subDTypep()); nodep->packagep(foundp->packagep()); } else { @@ -2099,7 +2102,7 @@ private: nodep->iterateChildren(*this); checkNoDot(nodep); VSymEnt* foundp = m_curSymp->findIdFallback(nodep->name()); - AstNodeFTask* taskp = foundp->nodep()->castNodeFTask(); + AstNodeFTask* taskp = foundp ? foundp->nodep()->castNodeFTask() : NULL; if (!taskp) { nodep->v3error("Can't find definition of exported task/function: "<prettyName()); } else if (taskp->dpiExport()) { nodep->v3error("Function was already DPI Exported, duplicate not allowed: "<prettyName()); diff --git a/src/V3ParseSym.h b/src/V3ParseSym.h index 143bd4dd1..c566ce322 100644 --- a/src/V3ParseSym.h +++ b/src/V3ParseSym.h @@ -118,7 +118,9 @@ public: } AstNode* findEntUpward (const string& name) { // Lookup the given string as an identifier, return type of the id, scanning upward - return symCurrentp()->findIdFallback(name)->nodep(); + VSymEnt* foundp = symCurrentp()->findIdFallback(name); + if (foundp) return foundp->nodep(); + else return NULL; } void import(AstNode* packagep, const string& id_or_star) { // Import from package::id_or_star to this diff --git a/src/V3SymTable.h b/src/V3SymTable.h index 1139d4e58..133280f18 100644 --- a/src/V3SymTable.h +++ b/src/V3SymTable.h @@ -107,7 +107,7 @@ public: VSymEnt* parentp() const { return m_parentp; } void packagep(AstPackage* entp) { m_packagep = entp; } AstPackage* packagep() const { return m_packagep; } - AstNode* nodep() const { if (!this) return NULL; else return m_nodep; } // null check so can call .findId(...)->nodep() + AstNode* nodep() const { return m_nodep; } string symPrefix() const { return m_symPrefix; } void symPrefix(const string& name) { m_symPrefix = name; } bool exported() const { return m_exported; } @@ -284,7 +284,7 @@ inline VSymEnt::VSymEnt(VSymGraph* graphp, AstNode* nodep) } inline VSymEnt::VSymEnt(VSymGraph* graphp, const VSymEnt* symp) - : m_nodep(symp->nodep()) { + : m_nodep(symp->m_nodep) { m_fallbackp = symp->m_fallbackp; m_parentp = symp->m_parentp; m_packagep = symp->m_packagep; diff --git a/src/V3Width.cpp b/src/V3Width.cpp index b0058ee5f..08f8a792b 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -137,9 +137,7 @@ public: bool prelim() const { return m_stage & PRELIM; } bool final() const { return m_stage & FINAL; } void dump(ostream& str) const { - if (!this) { - str<<" VUP(NULL)"; - } else if (!m_dtypep) { + if (!m_dtypep) { str<<" VUP(s="<dump(str); + if (vup) vup->dump(str); return str; } diff --git a/src/verilog.l b/src/verilog.l index 7cd64f033..0b128aa50 100644 --- a/src/verilog.l +++ b/src/verilog.l @@ -1030,19 +1030,20 @@ int V3ParseImp::lexToken() { // If an id, change the type based on symbol table // Note above sometimes converts yGLOBAL to a yaID__LEX if (token == yaID__LEX) { - AstNode* scp; + VSymEnt* foundp; if (VSymEnt* look_underp = SYMP->nextId()) { if (debugFlex()) { cout<<" lexToken: next id lookup forced under "<findIdFallback(*(yylval.strp))->nodep(); + foundp = look_underp->findIdFallback(*(yylval.strp)); // "consume" it. Must set again if want another token under temp scope SYMP->nextId(NULL); } else { UINFO(7," lexToken: find upward "<symCurrentp()<<" for '"<<*(yylval.strp)<<"'"<=9) SYMP->symCurrentp()->dump(cout," -findtree: ",true); - scp = SYMP->symCurrentp()->findIdFallback(*(yylval.strp))->nodep(); + foundp = SYMP->symCurrentp()->findIdFallback(*(yylval.strp)); } - yylval.scp = scp; - if (scp) { + if (foundp) { + AstNode* scp = foundp->nodep(); + yylval.scp = scp; UINFO(7," lexToken: Found "<castTypedef()) token = yaID__aTYPE; else if (scp->castTypedefFwd()) token = yaID__aTYPE; @@ -1051,6 +1052,7 @@ int V3ParseImp::lexToken() { //UNSUP else if (scp->castCoverGroup()) token = yaID__aCOVERGROUP; else token = yaID__ETC; } else { // Not found + yylval.scp = NULL; token = yaID__ETC; } } diff --git a/src/verilog.y b/src/verilog.y index 7115bb6c8..a446874a4 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -121,10 +121,13 @@ public: } AstPackage* unitPackage(FileLine* fl) { // Find one made earlier? - AstPackage* pkgp = SYMP->symRootp()->findIdFlat(AstPackage::dollarUnitName())->nodep()->castPackage(); - if (!pkgp) { + VSymEnt* symp = SYMP->symRootp()->findIdFlat(AstPackage::dollarUnitName()); + AstPackage* pkgp; + if (!symp) { pkgp = PARSEP->rootp()->dollarUnitPkgAddp(); SYMP->reinsert(pkgp, SYMP->symRootp()); // Don't push/pop scope as they're global + } else { + pkgp = symp->nodep()->castPackage(); } return pkgp; }