Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/CodeTools/DeclStats.cc

    r1e6b350 reed5e48  
    6363                        std::map<unsigned, unsigned> p_poly;   ///< Count of decls with each percentage of polymorphic elements
    6464                        VectorMap<unsigned> n_types;           ///< Count of decls with each number of distinct types in the pack
    65                         /// Count of decls with each percentage of new types in lists.
    66                         /// Types used in the parameter list that recur in the return list are not considered to be new.
    67                         std::map<unsigned, unsigned> p_new;
    6865
    6966                        ArgPackStats& operator+= (const ArgPackStats& o) {
     
    7471                                sum(p_poly, o.p_poly);
    7572                                sum(n_types, o.n_types);
    76                                 sum(p_new, o.p_new);
    7773                               
    7874                                return *this;
     
    9086                        /// Count of uses of each non-basic type
    9187                        std::unordered_map<std::string, unsigned> compound_type_names;
    92                         /// Count of decls using each basic type
    93                         std::unordered_map<std::string, unsigned> basic_type_decls;
    94                         /// Count of decls using each compound type
    95                         std::unordered_map<std::string, unsigned> compound_type_decls;
    9688                        /// Stats for the parameter list
    9789                        ArgPackStats params;
     
    10698                        ArgPackStats assn_returns;
    10799                       
    108                         Stats() : n_decls(0), n_type_params(), by_name(), basic_type_names(), compound_type_names(), basic_type_decls(), compound_type_decls(), params(), returns(), n_assns(), assn_params(), assn_returns() {}
     100                        Stats() : n_decls(0), n_type_params(), by_name(), basic_type_names(), compound_type_names(), params(), returns(), n_assns(), assn_params(), assn_returns() {}
    109101
    110102                public:
     
    115107                                sum( basic_type_names, o.basic_type_names );
    116108                                sum( compound_type_names, o.compound_type_names );
    117                                 sum( basic_type_decls, o.basic_type_decls );
    118                                 sum( compound_type_decls, o.compound_type_decls );
    119109                                sum( params, o.params );
    120110                                sum( returns, o.returns );
     
    130120                std::unordered_set<std::string> seen_names;  ///< Stores manglenames already seen to avoid double-counting
    131121                Stats total;
    132                 /// Count of expressions with (depth, fanout)
    133                 std::map<std::pair<unsigned, unsigned>, unsigned> exprs_by_fanout_at_depth;
    134122
    135123                /// Update arg pack stats based on a declaration list
    136                 void analyze( Stats& stats, std::unordered_set<std::string>& seen, ArgPackStats& pstats, std::list<DeclarationWithType*>& decls ) {
     124                void analyze( Stats& stats, ArgPackStats& pstats, std::list<DeclarationWithType*>& decls ) {
    137125                        std::unordered_set<std::string> types;
    138                         unsigned n = 0;        ///< number of args/returns
    139                         unsigned n_basic = 0;  ///< number of basic types
    140                         unsigned n_poly = 0;   ///< number of polymorphic types
    141                         unsigned n_new = 0;    ///< number of new types
     126                        unsigned n = 0;
     127                        unsigned n_basic = 0;
     128                        unsigned n_poly = 0;
    142129                        for ( auto decl : decls ) {
    143130                                Type* dt = decl->get_type();
     
    148135                                dt->print( ss );
    149136                                types.insert( ss.str() );
    150                                 bool this_new = seen.insert( ss.str() ).second;
    151                                 if ( this_new ) { ++n_new; }
    152137
    153138                                if ( dynamic_cast<BasicType*>( dt ) ) {
    154139                                        ++n_basic;
    155140                                        ++stats.basic_type_names[ ss.str() ];
    156                                         if ( this_new ) {
    157                                                 ++stats.basic_type_decls[ ss.str() ];
    158                                         }
    159141                                } else if ( GenPoly::hasPolyBase( dt ) ) {
    160142                                        ++n_poly;
    161143                                } else {
    162144                                        ++stats.compound_type_names[ ss.str() ];
    163                                         if ( this_new ) {
    164                                                 ++stats.compound_type_decls[ ss.str() ];
    165                                         }
    166145                                }
    167146                        }
     
    172151                                ++pstats.p_basic[ n_basic*100/n ];
    173152                                ++pstats.p_poly[ n_poly*100/n ];
    174                                 ++pstats.p_new[ n_new*100/n ];
    175153                        }
    176154                        ++pstats.n_types.at( types.size() );
     
    178156               
    179157                void analyzeFunc( FunctionType* fnTy, Stats& stats, ArgPackStats& params, ArgPackStats& returns ) {
    180                         std::unordered_set<std::string> seen;
    181                         analyze( stats, seen, params, fnTy->get_parameters() );
    182                         analyze( stats, seen, returns, fnTy->get_returnVals() );
    183                 }
    184 
    185                 void analyzeExpr( UntypedExpr *expr, unsigned depth ) {
    186                         auto& args = expr->get_args();
    187                         unsigned fanout = args.size();
    188                         ++exprs_by_fanout_at_depth[ std::make_pair(depth, fanout) ];
    189                         for ( Expression* arg : args ) {
    190                                 if ( UntypedExpr *uearg = dynamic_cast<UntypedExpr*>(arg) ) {
    191                                         analyzeExpr( uearg, depth+1 );
    192                                 }
    193                         }
     158                        analyze( stats, params, fnTy->get_parameters() );
     159                        analyze( stats, returns, fnTy->get_returnVals() );
    194160                }
    195161
     
    200166                        // skip if already seen declaration for this function
    201167                        const std::string& mangleName = decl->get_mangleName().empty() ? decl->get_name() : decl->get_mangleName();
    202                         if ( ! seen_names.insert( mangleName ).second ) {
    203                                 maybeAccept( decl->get_statements(), *this );
    204                                 return;
    205                         }
     168                        if ( ! seen_names.insert( mangleName ).second ) return;
    206169                       
    207170                        Stats& stats = for_linkage[ decl->get_linkage() ];
     
    231194
    232195                        analyzeFunc( fnTy, stats, stats.params, stats.returns );
    233 
    234                         // analyze expressions in decl statements
    235                         maybeAccept( decl->get_statements(), *this );
    236                 }
    237 
    238                 virtual void visit( UntypedExpr *expr ) {
    239                         analyzeExpr( expr, 0 );
    240196                }
    241197
     
    319275                        printAllMap("%_poly_" + name, [&extract](const Stats& stats) { return extract(stats).p_poly; });
    320276                        printAllMap("n_distinct_types_" + name, [&extract](const Stats& stats) { return extract(stats).n_types; });
    321                         printAllMap("%_new_types_in_" + name, [&extract](const Stats& stats) { return extract(stats).p_new; });
    322                 }
    323 
    324                 void printPairMap( const std::string& name,
    325                                    const std::map<std::pair<unsigned, unsigned>, unsigned>& map ) {
    326                         for ( const auto& entry : map ) {
    327                                 const auto& key = entry.first;
    328                                 std::cout << "\"" << name << "\"," << key.first << "," << key.second << ","
    329                                           << entry.second << std::endl;
    330                         }
    331277                }
    332278               
     
    345291                        printAll("basic_type_names", [](const Stats& stats) { return stats.basic_type_names.size(); });
    346292                        printAllSparseHisto("basic_type_uses", [](const Stats& stats) { return stats.basic_type_names; });
    347                         printAllSparseHisto("decls_using_basic_type", [](const Stats& stats) { return stats.basic_type_decls; });
    348293                        printAll("compound_type_names", [](const Stats& stats) { return stats.compound_type_names.size(); });
    349294                        printAllSparseHisto("compound_type_uses", [](const Stats& stats) { return stats.compound_type_names; });
    350                         printAllSparseHisto("decls_using_compound_type", [](const Stats& stats) { return stats.compound_type_decls; });
    351295                        printAllPack("params", [](const Stats& stats) { return stats.params; });
    352296                        printAllPack("returns", [](const Stats& stats) { return stats.returns; });
     
    354298                        printAllPack("assn_params", [](const Stats& stats) { return stats.assn_params; });
    355299                        printAllPack("assn_returns", [](const Stats& stats) { return stats.assn_returns; });
    356                         std::cout << std::endl;
    357 
    358                         printPairMap("exprs_by_depth+fanout", exprs_by_fanout_at_depth);
    359300                }
    360301        };
Note: See TracChangeset for help on using the changeset viewer.