Add debug dumps of V3Hash state
This commit is contained in:
parent
d2105ba390
commit
5f70c1aa68
|
|
@ -422,6 +422,7 @@ public:
|
||||||
uint32_t hshval() const { return m_both & M24; }
|
uint32_t hshval() const { return m_both & M24; }
|
||||||
// OPERATORS
|
// OPERATORS
|
||||||
inline bool operator== (const V3Hash& rh) const { return m_both==rh.m_both; };
|
inline bool operator== (const V3Hash& rh) const { return m_both==rh.m_both; };
|
||||||
|
inline bool operator!= (const V3Hash& rh) const { return m_both!=rh.m_both; };
|
||||||
inline bool operator< (const V3Hash& rh) const { return m_both<rh.m_both; };
|
inline bool operator< (const V3Hash& rh) const { return m_both<rh.m_both; };
|
||||||
// CREATORS
|
// CREATORS
|
||||||
class Illegal {}; // for creator type-overload selection
|
class Illegal {}; // for creator type-overload selection
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,7 @@ private:
|
||||||
int m_modNFuncs; // Number of functions made
|
int m_modNFuncs; // Number of functions made
|
||||||
AstNode* m_walkLast1p; // Final node that is the same in duplicate list
|
AstNode* m_walkLast1p; // Final node that is the same in duplicate list
|
||||||
AstNode* m_walkLast2p; // Final node that is the same in duplicate list
|
AstNode* m_walkLast2p; // Final node that is the same in duplicate list
|
||||||
V3Hashed m_hashed; // Hash for every node
|
V3Hashed m_hashed; // Hash for every node in module
|
||||||
|
|
||||||
// METHODS
|
// METHODS
|
||||||
void hashStatement(AstNode* nodep) {
|
void hashStatement(AstNode* nodep) {
|
||||||
|
|
@ -393,6 +393,9 @@ private:
|
||||||
m_state = STATE_HASH;
|
m_state = STATE_HASH;
|
||||||
nodep->iterateChildren(*this);
|
nodep->iterateChildren(*this);
|
||||||
m_state = STATE_IDLE;
|
m_state = STATE_IDLE;
|
||||||
|
if (debug()>=9) {
|
||||||
|
m_hashed.dumpFilePrefixed("combine");
|
||||||
|
}
|
||||||
// Walk the hashes removing empty functions
|
// Walk the hashes removing empty functions
|
||||||
if (emptyFunctionDeletion()) {
|
if (emptyFunctionDeletion()) {
|
||||||
walkEmptyFuncs();
|
walkEmptyFuncs();
|
||||||
|
|
|
||||||
|
|
@ -31,10 +31,13 @@
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#include "V3Global.h"
|
#include "V3Global.h"
|
||||||
#include "V3Hashed.h"
|
#include "V3Hashed.h"
|
||||||
#include "V3Ast.h"
|
#include "V3Ast.h"
|
||||||
|
#include "V3File.h"
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
// Hashed state, as a visitor of each AstNode
|
// Hashed state, as a visitor of each AstNode
|
||||||
|
|
@ -122,6 +125,54 @@ void V3Hashed::erase(iterator it) {
|
||||||
nodep->user4p(NULL); // So we don't allow removeNode again
|
nodep->user4p(NULL); // So we don't allow removeNode again
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void V3Hashed::dumpFilePrefixed(const string& nameComment, bool tree) {
|
||||||
|
if (v3Global.opt.dumpTree()) {
|
||||||
|
dumpFile(v3Global.debugFilename(nameComment)+".hash", tree);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void V3Hashed::dumpFile(const string& filename, bool tree) {
|
||||||
|
const auto_ptr<ofstream> logp (V3File::new_ofstream(filename));
|
||||||
|
if (logp->fail()) v3fatalSrc("Can't write "<<filename);
|
||||||
|
|
||||||
|
map<int,int> dist;
|
||||||
|
|
||||||
|
V3Hash lasthash;
|
||||||
|
int num_in_bucket = 0;
|
||||||
|
for (HashMmap::iterator it=begin(); 1; ++it) {
|
||||||
|
if (lasthash != it->first || it==end()) {
|
||||||
|
if (it!=end()) lasthash = it->first;
|
||||||
|
if (num_in_bucket) {
|
||||||
|
if (dist.find(num_in_bucket)==dist.end()) {
|
||||||
|
dist.insert(make_pair(num_in_bucket,1));
|
||||||
|
} else {
|
||||||
|
++dist[num_in_bucket];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num_in_bucket = 0;
|
||||||
|
}
|
||||||
|
if (it==end()) break;
|
||||||
|
num_in_bucket++;
|
||||||
|
}
|
||||||
|
*logp <<"\n*** STATS:\n"<<endl;
|
||||||
|
*logp<<" #InBucket Occurrences\n";
|
||||||
|
for (map<int,int>::iterator it=dist.begin(); it!=dist.end(); ++it) {
|
||||||
|
*logp<<" "<<setw(9)<<it->first<<" "<<setw(12)<<it->second<<endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
*logp <<"\n*** Dump:\n"<<endl;
|
||||||
|
for (HashMmap::iterator it=begin(); it!=end(); ++it) {
|
||||||
|
if (lasthash != it->first) {
|
||||||
|
lasthash = it->first;
|
||||||
|
*logp <<" "<<it->first<<endl;
|
||||||
|
}
|
||||||
|
*logp <<"\t"<<it->second<<endl;
|
||||||
|
// Dumping the entire tree may make nearly N^2 sized dumps,
|
||||||
|
// because the nodes under this one may also be in the hash table!
|
||||||
|
if (tree) it->second->dumpTree(*logp,"\t\t");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
V3Hashed::iterator V3Hashed::findDuplicate(AstNode* nodep) {
|
V3Hashed::iterator V3Hashed::findDuplicate(AstNode* nodep) {
|
||||||
UINFO(8," findD "<<nodep<<endl);
|
UINFO(8," findD "<<nodep<<endl);
|
||||||
if (!nodep->user4p()) nodep->v3fatalSrc("Called findDuplicate on non-hashed node");
|
if (!nodep->user4p()) nodep->v3fatalSrc("Called findDuplicate on non-hashed node");
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,8 @@ public:
|
||||||
void erase(iterator it); // Remove node from structures
|
void erase(iterator it); // Remove node from structures
|
||||||
iterator findDuplicate(AstNode* nodep); // Return duplicate in hash, if any
|
iterator findDuplicate(AstNode* nodep); // Return duplicate in hash, if any
|
||||||
AstNode* iteratorNodep(iterator it) { return it->second; }
|
AstNode* iteratorNodep(iterator it) { return it->second; }
|
||||||
|
void dumpFile(const string& filename, bool tree);
|
||||||
|
void dumpFilePrefixed(const string& nameComment, bool tree=false);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // Guard
|
#endif // Guard
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue