mirror of
https://github.com/verilator/verilator.git
synced 2026-10-07 10:33:13 +02:00
Internals: Move iterators to AstNVisitor to avoid null this.
This commit is contained in:
+30
-30
@@ -64,9 +64,9 @@ private:
|
||||
virtual void visit(AstNodeAssign* nodep) {
|
||||
//AstNode::user4ClearTree(); // Implied by AstUser4InUse
|
||||
// LHS first as fewer varrefs
|
||||
nodep->lhsp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->lhsp());
|
||||
// Now find vars marked as lhs
|
||||
nodep->rhsp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->rhsp());
|
||||
}
|
||||
virtual void visit(AstVarRef* nodep) {
|
||||
// it's LHS var is used so need a deep temporary
|
||||
@@ -80,7 +80,7 @@ private:
|
||||
}
|
||||
}
|
||||
virtual void visit(AstNode* nodep) {
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
}
|
||||
|
||||
public:
|
||||
@@ -88,7 +88,7 @@ public:
|
||||
explicit PremitAssignVisitor(AstNodeAssign* nodep) {
|
||||
UINFO(4," PremitAssignVisitor on "<<nodep<<endl);
|
||||
m_noopt = false;
|
||||
nodep->accept(*this);
|
||||
iterate(nodep);
|
||||
}
|
||||
virtual ~PremitAssignVisitor() {}
|
||||
bool noOpt() const { return m_noopt; }
|
||||
@@ -209,12 +209,12 @@ private:
|
||||
UINFO(4," MOD "<<nodep<<endl);
|
||||
m_modp = nodep;
|
||||
m_funcp = NULL;
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
m_modp = NULL;
|
||||
}
|
||||
virtual void visit(AstCFunc* nodep) {
|
||||
m_funcp = nodep;
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
m_funcp = NULL;
|
||||
}
|
||||
void startStatement(AstNode* nodep) {
|
||||
@@ -224,14 +224,14 @@ private:
|
||||
virtual void visit(AstWhile* nodep) {
|
||||
UINFO(4," WHILE "<<nodep<<endl);
|
||||
startStatement(nodep);
|
||||
nodep->precondsp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->precondsp());
|
||||
startStatement(nodep);
|
||||
m_inWhilep = nodep;
|
||||
nodep->condp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->condp());
|
||||
m_inWhilep = NULL;
|
||||
startStatement(nodep);
|
||||
nodep->bodysp()->iterateAndNext(*this);
|
||||
nodep->incsp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->bodysp());
|
||||
iterateAndNextNull(nodep->incsp());
|
||||
m_stmtp = NULL;
|
||||
}
|
||||
virtual void visit(AstNodeAssign* nodep) {
|
||||
@@ -244,22 +244,22 @@ private:
|
||||
createDeepTemp(nodep->rhsp(), false);
|
||||
}
|
||||
}
|
||||
nodep->rhsp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->rhsp());
|
||||
m_assignLhs = true;
|
||||
nodep->lhsp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->lhsp());
|
||||
m_assignLhs = false;
|
||||
m_stmtp = NULL;
|
||||
}
|
||||
virtual void visit(AstNodeStmt* nodep) {
|
||||
UINFO(4," STMT "<<nodep<<endl);
|
||||
startStatement(nodep);
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
m_stmtp = NULL;
|
||||
}
|
||||
virtual void visit(AstTraceInc* nodep) {
|
||||
startStatement(nodep);
|
||||
m_inTracep = nodep;
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
m_inTracep = NULL;
|
||||
m_stmtp = NULL;
|
||||
}
|
||||
@@ -308,7 +308,7 @@ private:
|
||||
replaceHandle.relink(newp);
|
||||
}
|
||||
}
|
||||
nodep->iterateChildren(*this); checkNode(nodep);
|
||||
iterateChildren(nodep); checkNode(nodep);
|
||||
}
|
||||
virtual void visit(AstShiftL* nodep) {
|
||||
visitShift(nodep);
|
||||
@@ -321,43 +321,43 @@ private:
|
||||
}
|
||||
// Operators
|
||||
virtual void visit(AstNodeTermop* nodep) {
|
||||
nodep->iterateChildren(*this); checkNode(nodep);
|
||||
iterateChildren(nodep); checkNode(nodep);
|
||||
}
|
||||
virtual void visit(AstNodeUniop* nodep) {
|
||||
nodep->iterateChildren(*this); checkNode(nodep);
|
||||
iterateChildren(nodep); checkNode(nodep);
|
||||
}
|
||||
virtual void visit(AstNodeBiop* nodep) {
|
||||
nodep->iterateChildren(*this); checkNode(nodep);
|
||||
iterateChildren(nodep); checkNode(nodep);
|
||||
}
|
||||
virtual void visit(AstUCFunc* nodep) {
|
||||
nodep->iterateChildren(*this); checkNode(nodep);
|
||||
iterateChildren(nodep); checkNode(nodep);
|
||||
}
|
||||
virtual void visit(AstSel* nodep) {
|
||||
nodep->fromp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->fromp());
|
||||
{ // Only the 'from' is part of the assignment LHS
|
||||
bool prevAssign = m_assignLhs;
|
||||
m_assignLhs = false;
|
||||
nodep->lsbp()->iterateAndNext(*this);
|
||||
nodep->widthp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->lsbp());
|
||||
iterateAndNextNull(nodep->widthp());
|
||||
m_assignLhs = prevAssign;
|
||||
}
|
||||
checkNode(nodep);
|
||||
}
|
||||
virtual void visit(AstArraySel* nodep) {
|
||||
nodep->fromp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->fromp());
|
||||
{ // Only the 'from' is part of the assignment LHS
|
||||
bool prevAssign = m_assignLhs;
|
||||
m_assignLhs = false;
|
||||
nodep->bitp()->iterateAndNext(*this);
|
||||
iterateAndNextNull(nodep->bitp());
|
||||
m_assignLhs = prevAssign;
|
||||
}
|
||||
checkNode(nodep);
|
||||
}
|
||||
virtual void visit(AstConst* nodep) {
|
||||
nodep->iterateChildren(*this); checkNode(nodep);
|
||||
iterateChildren(nodep); checkNode(nodep);
|
||||
}
|
||||
virtual void visit(AstNodeCond* nodep) {
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
if (nodep->expr1p()->isWide()
|
||||
&& !VN_IS(nodep->condp(), Const)
|
||||
&& !VN_IS(nodep->condp(), VarRef)) {
|
||||
@@ -371,7 +371,7 @@ private:
|
||||
// Autoflush
|
||||
virtual void visit(AstDisplay* nodep) {
|
||||
startStatement(nodep);
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
m_stmtp = NULL;
|
||||
if (v3Global.opt.autoflush()) {
|
||||
AstNode* searchp = nodep->nextp();
|
||||
@@ -388,7 +388,7 @@ private:
|
||||
}
|
||||
}
|
||||
virtual void visit(AstSFormatF* nodep) {
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
// Any strings sent to a display must be var of string data type,
|
||||
// to avoid passing a pointer to a temporary.
|
||||
for (AstNode* expp=nodep->exprsp(); expp; expp = expp->nextp()) {
|
||||
@@ -403,7 +403,7 @@ private:
|
||||
// Default: Just iterate
|
||||
virtual void visit(AstVar* nodep) {} // Don't hit varrefs under vars
|
||||
virtual void visit(AstNode* nodep) {
|
||||
nodep->iterateChildren(*this);
|
||||
iterateChildren(nodep);
|
||||
}
|
||||
|
||||
public:
|
||||
@@ -414,7 +414,7 @@ public:
|
||||
m_stmtp = NULL;
|
||||
m_inWhilep = NULL;
|
||||
m_inTracep = NULL;
|
||||
nodep->accept(*this);
|
||||
iterate(nodep);
|
||||
}
|
||||
virtual ~PremitVisitor() {}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user