bool FindMethodLocalVariables::VisitDeclRefExpr(DeclRefExpr* e) { switch(_state) { case LHS: { // _os << "#######: DeclRefExpr: " << getVariableName(e) << ", lvalue: " << e->getDecl()->getDeclKindName() << "\n"; // e->dumpAll(); ValueDecl* vd = e->getDecl(); if (vd == NULL) break; QualType q = vd->getType(); const Type* t = q.getTypePtr(); Decl* d = e->getDecl(); if (d == NULL) break; string declKind(d->getDeclKindName()); if ((getDataMembertype(e) == "enum sc_core::sc_time_unit") || (declKind == "CXXMethod")) { break; } string name = getVariableName(e); if ((_inMethodVariables.find(name)) != _inMethodVariables.end()) { // Found entry. break; } // _os << "=> @@@@@@@@@@@@@@@@@@@@@@@@@@@ Insert\n"; /// Prepare variable information. VariableTypeInfo v(_os); v._name = getVariableName(e); v._expr = e; v._isArray = t->isConstantArrayType(); v._type = getDataMembertype(e); if (v._isArray) { if (const ConstantArrayType* ca = dyn_cast<ConstantArrayType>(t)) { v._arraySize = ca->getSize(); } } /// Freed in the destructor of VariableTypeInfo. FindTemplateTypes te; te.Enumerate(t); v._tempArgs = te; // v.print(); _inMethodVariables.insert(kvType(v._name, v)); break; } case RHS: { //_os << "\n=> DeclRefExpr\n"; break; } }; return true; }
bool FindSignals::VisitFieldDecl (FieldDecl * fd) { // _os << "####################### FindSignals::VisitFieldDecl\n "; QualType q = fd->getType (); if (IdentifierInfo * info = fd->getIdentifier ()) { // fname = info->getNameStart(); // _os << "\n+ Name: " << info->getNameStart(); // _os << "\n+ Type: " << q.getAsString(); // _os << "\n+ also name: " << fd->getNameAsString(); /// We are going to store these. So use pointers. const Type * tp = q.getTypePtr (); FindTemplateTypes * te = new FindTemplateTypes (); te->Enumerate (tp); // te->printTemplateArguments(_os); string tt = te->getTemplateType (); // _os << "OUTPUT ============ " << tt << "\n"; if ((signed) tt.find ("sc_signal") == -1) { delete te; return true; } SignalContainer * sc = new SignalContainer (fd->getNameAsString (), te, fd); _signals->insert (FindSignals:: signalPairType (fd->getNameAsString (), sc)); } return true; }