Changeset fa2de95 for src/CodeTools/DeclStats.cc
- Timestamp:
- Feb 2, 2017, 4:06:21 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 7a560c1
- Parents:
- 41a7137
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeTools/DeclStats.cc
r41a7137 rfa2de95 17 17 18 18 #include <iostream> 19 #include <string> 20 #include <unordered_map> 21 #include <unordered_set> 22 23 #include "Common/VectorMap.h" 24 #include "Parser/LinkageSpec.h" 25 #include "SynTree/Declaration.h" 26 #include "SynTree/Visitor.h" 19 27 20 28 namespace CodeTools { 29 30 class DeclStats : public Visitor { 31 struct Stats { 32 unsigned n_decls; ///< Total number of declarations 33 unsigned mono_decls; ///< Monomorphic declarations 34 unsigned poly_decls; ///< Polymorphic declarations 35 /// Count of declarations with each name 36 std::unordered_map<std::string, unsigned> by_name; 37 /// Count of declarations with each number of parameters 38 VectorMap<unsigned> by_params; 39 /// Count of declarations with each number of return types 40 VectorMap<unsigned> by_returns; 41 42 Stats() : n_decls(0), mono_decls(0), poly_decls(0), by_name() {} 43 44 Stats& operator+= (const Stats& o) { 45 n_decls += o.n_decls; 46 mono_decls += o.mono_decls; 47 poly_decls += o.poly_decls; 48 49 for ( auto& entry : o.by_name ) { 50 by_name[ entry.first ] += entry.second; 51 } 52 53 by_params.reserve( o.by_params.size() ); 54 for ( unsigned i = 0; i < o.by_params.size(); ++i ) { 55 by_params[i] += o.by_params[i]; 56 } 57 58 by_returns.reserve( o.by_returns.size() ); 59 for ( unsigned i = 0; i < o.by_returns.size(); ++i ) { 60 by_returns[i] += o.by_returns[i]; 61 } 62 63 return *this; 64 } 65 }; 66 67 Stats for_linkage[LinkageSpec::NoOfSpecs]; ///< Stores separate stats per linkage 68 std::unordered_set<std::string> seen_names; ///< Stores manglenames already seen to avoid double-counting 69 Stats total; 70 71 public: 72 using Visitor::visit; 73 74 virtual void visit( FunctionDecl *decl ) { 75 // skip if already seen declaration for this function 76 const std::string& mangleName = decl->get_mangleName().empty() ? decl->get_name() : decl->get_mangleName(); 77 if ( ! seen_names.insert( mangleName ).second ) return; 78 79 Stats& stats = for_linkage[ decl->get_linkage() ]; 80 81 ++stats.n_decls; 82 FunctionType* fnTy = decl->get_functionType(); 83 if ( fnTy->get_forall().empty() ) ++stats.mono_decls; else ++stats.poly_decls; 84 85 ++stats.by_name[ decl->get_name() ]; 86 87 unsigned n_params = 0; 88 for ( auto pdecl : fnTy->get_parameters() ) { n_params += pdecl->get_type()->size(); } 89 ++stats.by_params.at( n_params ); 90 91 unsigned n_returns = 0; 92 for ( auto rdecl : fnTy->get_returnVals() ) { n_returns += rdecl->get_type()->size(); } 93 ++stats.by_returns.at( n_returns ); 94 } 95 96 private: 97 template<typename F> 98 void printAll( const char* name, F extract ) { 99 std::cout << "\"" << name << "\","; 100 for ( const auto& stats : for_linkage ) { 101 std::cout << "," << extract(stats); 102 } 103 std::cout << "," << extract(total) << std::endl; 104 } 105 106 template<typename F> 107 void printAllMap( const char* name, F extract ) { 108 for ( const auto& entry : extract(total) ) { 109 const auto& key = entry.first; 110 std::cout << "\"" << name << "\"," << key; 111 for ( const auto& stats : for_linkage ) { 112 const auto& map = extract(stats); 113 auto it = map.find( key ); 114 if ( it == map.end() ) std::cout << ",0"; 115 else std::cout << "," << it->second; 116 } 117 std::cout << "," << entry.second << std::endl; 118 } 119 } 120 121 template<typename F> 122 void printAllHisto( const char* name, F extract ) { 123 VectorMap<unsigned> histos[LinkageSpec::NoOfSpecs]; 124 VectorMap<unsigned> thisto; 125 126 for ( const auto& entry : extract(total) ) { ++thisto.at( entry.second ); } 127 128 for ( unsigned i = 0; i < LinkageSpec::NoOfSpecs; ++i ) { 129 // can't be a higher count in one of the sub-histograms than the total 130 histos[i].reserve( thisto.size() ); 131 132 for ( const auto& entry : extract(for_linkage[i]) ) { ++histos[i][entry.second]; } 133 } 134 135 for ( unsigned i = 0; i < thisto.size(); ++i ) { 136 std::cout << "\"" << name << "\"," << i; 137 for ( const auto& histo : histos ) { 138 std::cout << "," << histo[i]; 139 } 140 std::cout << "," << thisto[i] << std::endl; 141 } 142 } 143 144 public: 145 void print() { 146 for ( auto& stats : for_linkage ) { 147 total += stats; 148 } 149 150 std::cout << ",,\"intrinsic\",\"Cforall\",\"C\",\"autogen\",\"builtin\",\"TOTAL\"" << std::endl; 151 152 printAll("mono_decls", [](const Stats& stats) { return stats.mono_decls; }); 153 printAll("poly_decls", [](const Stats& stats) { return stats.poly_decls; }); 154 printAll("n_decls", [](const Stats& stats) { return stats.n_decls; }); 155 printAll("unique_names", [](const Stats& stats) { return stats.by_name.size(); }); 156 157 printAllHisto("overloads", [](const Stats& stats) { return stats.by_name; }); 158 printAllMap("n_params", [](const Stats& stats) { return stats.by_params; }); 159 printAllMap("n_returns", [](const Stats& stats) { return stats.by_returns; }); 160 } 161 }; 21 162 22 163 void printDeclStats( std::list< Declaration * > &translationUnit ) { 23 std::cout << "DeclStats not yet implemented." << std::endl; 164 DeclStats stats; 165 acceptAll( translationUnit, stats ); 166 stats.print(); 24 167 } 25 168
Note: See TracChangeset
for help on using the changeset viewer.