Compute struct/union/enum names from surrounding typedefs.

This commit is contained in:
Wilson Snyder 2018-10-07 18:07:42 -04:00
parent 57fbf38fb2
commit 8b738c0022
4 changed files with 42 additions and 7 deletions

View File

@ -1809,6 +1809,7 @@ private:
// TYPES
typedef std::map<string,AstMemberDType*> MemberNameMap;
// MEMBERS
string m_name; // Name from upper typedef, if any
bool m_packed;
bool m_isFourstate;
MemberNameMap m_members;
@ -1837,6 +1838,8 @@ public:
virtual bool similarDType(AstNodeDType* samep) const {
return this==samep; // We don't compare members, require exact equivalence
}
virtual string name() const { return m_name; }
void name(const string& flag) { m_name = flag; }
AstMemberDType* membersp() const { return VN_CAST(op1p(), MemberDType); } // op1 = AstMember list
void addMembersp(AstNode* nodep) { addNOp1p(nodep); }
bool packed() const { return m_packed; }

View File

@ -779,6 +779,7 @@ class AstEnumDType : public AstNodeDType {
// Parents: TYPEDEF/MODULE
// Children: ENUMVALUEs
private:
string m_name; // Name from upper typedef, if any
AstNodeDType* m_refDTypep; // Elements are of this type after V3Width
int m_uniqueNum;
public:
@ -809,6 +810,8 @@ public:
void refDTypep(AstNodeDType* nodep) { m_refDTypep = nodep; }
virtual AstNodeDType* virtRefDTypep() const { return m_refDTypep; }
virtual void virtRefDTypep(AstNodeDType* nodep) { refDTypep(nodep); }
virtual string name() const { return m_name; }
void name(const string& flag) { m_name = flag; }
AstEnumItem* itemsp() const { return VN_CAST(op2p(), EnumItem); } // op2 = AstEnumItem's
void addValuesp(AstNode* nodep) { addOp2p(nodep); }
// METHODS

View File

@ -82,6 +82,29 @@ private:
}
}
string nameFromTypedef(AstNode* nodep) {
// Try to find a name for a typedef'ed enum/struct
if (AstTypedef* typedefp = VN_CAST(nodep->backp(), Typedef)) {
// Create a name for the enum, to aid debug and tracing
// This name is not guaranteed to be globally unique (due to later parameterization)
string above;
if (m_modp && VN_IS(m_modp, Package)) above = m_modp->name()+"::";
else if (m_modp) above = m_modp->name()+".";
return above + typedefp->name();
}
return "";
}
void visitIterateNodeDType(AstNodeDType* nodep) {
if (!nodep->user1SetOnce()) { // Process only once.
cleanFileline(nodep);
AstNodeDType* upperDtypep = m_dtypep;
m_dtypep = nodep;
iterateChildren(nodep);
m_dtypep = upperDtypep;
}
}
// VISITs
virtual void visit(AstNodeFTask* nodep) {
if (!nodep->user1SetOnce()) { // Process only once.
@ -102,13 +125,19 @@ private:
}
}
virtual void visit(AstNodeDType* nodep) {
if (!nodep->user1SetOnce()) { // Process only once.
cleanFileline(nodep);
AstNodeDType* upperDtypep = m_dtypep;
m_dtypep = nodep;
iterateChildren(nodep);
m_dtypep = upperDtypep;
visitIterateNodeDType(nodep);
}
virtual void visit(AstEnumDType* nodep) {
if (nodep->name() == "") {
nodep->name(nameFromTypedef(nodep)); // Might still remain ""
}
visitIterateNodeDType(nodep);
}
virtual void visit(AstNodeClassDType* nodep) {
if (nodep->name() == "") {
nodep->name(nameFromTypedef(nodep)); // Might still remain ""
}
visitIterateNodeDType(nodep);
}
virtual void visit(AstEnumItem* nodep) {
// Expand ranges

View File

@ -20,7 +20,7 @@
<typetable fl="a0">
<basicdtype fl="f23" id="4" name="logic" left="31" right="0"/>
<basicdtype fl="f8" id="1" name="logic"/>
<structdtype fl="f14" id="2">
<structdtype fl="f14" id="2" name="m.my_struct">
<memberdtype fl="f15" id="5" name="clk" tag="this is clk" sub_dtype_id="6"/>
<memberdtype fl="f16" id="7" name="k" sub_dtype_id="8"/>
<memberdtype fl="f17" id="9" name="enable" tag="enable" sub_dtype_id="10"/>