Changeset 2950fd4 in rtems-tools


Ignore:
Timestamp:
Aug 6, 2018, 11:10:40 PM (10 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
d343f83
Parents:
317d85d
git-author:
Chris Johns <chrisj@…> (08/06/18 23:10:40)
git-committer:
Chris Johns <chrisj@…> (08/06/18 23:11:29)
Message:

linkers/exeinfo: Report who inlines which functions. Report not inline functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • linkers/rtems-exeinfo.cpp

    r317d85d r2950fd4  
    632632      size_t           total_size = 0;
    633633      size_t           inlined_size = 0;
    634       dwarf::functions funcs;
     634      dwarf::functions funcs_inlined;
     635      dwarf::functions funcs_not_inlined;
    635636      func_counts      counts;
    636637
     
    641642          if (f.size () > 0 && f.has_machine_code ())
    642643          {
     644            bool counted;
    643645            ++total;
    644646            total_size += f.size ();
    645             if (f.is_inlined ())
     647            switch (f.get_inlined ())
    646648            {
    647               inlined_size += f.size ();
    648               bool counted = false;
    649               for (auto& c : counts)
    650               {
    651                 if (c.name == f.name ())
     649              case dwarf::function::inl_inline:
     650              case dwarf::function::inl_declared_inlined:
     651                inlined_size += f.size ();
     652                counted = false;
     653                for (auto& c : counts)
    652654                {
    653                   ++c.count;
    654                   c.size += f.size ();
    655                   counted = true;
    656                   break;
     655                  if (c.name == f.name ())
     656                  {
     657                    ++c.count;
     658                    c.size += f.size ();
     659                    counted = true;
     660                    break;
     661                  }
    657662                }
    658               }
    659               if (!counted)
    660                 counts.push_back (func_count (f.name (), f.size ()));
    661               funcs.push_back (f);
     663                if (!counted)
     664                  counts.push_back (func_count (f.name (), f.size ()));
     665                funcs_inlined.push_back (f);
     666                break;
     667              case dwarf::function::inl_declared_not_inlined:
     668                funcs_not_inlined.push_back (f);
     669                break;
     670              default:
     671                break;
    662672            }
    663673          }
     
    665675      }
    666676
    667       std::cout << "inlined funcs   : " << funcs.size () << std::endl
     677      std::cout << "inlined funcs   : " << funcs_inlined.size () << std::endl
    668678                << "    total funcs : " << total << std::endl
    669                 << " % inline funcs : " << (funcs.size () * 100) / total << '%'
     679                << " % inline funcs : " << (funcs_inlined.size () * 100) / total << '%'
    670680                << std::endl
    671681                << "     total size : " << total_size << std::endl
     
    687697                    << c.name << std::endl;
    688698
     699      dwarf::function_compare compare (dwarf::function_compare::fc_by_size);
     700
     701      std::sort (funcs_inlined.begin (), funcs_inlined.end (), compare);
     702      std::reverse (funcs_inlined.begin (), funcs_inlined.end ());
     703
    689704      std::cout << std::endl << "inline funcs : " << std::endl;
    690       dwarf::function_compare compare (dwarf::function_compare::fc_by_size);
    691       std::sort (funcs.begin (), funcs.end (), compare);
    692       std::reverse (funcs.begin (), funcs.end ());
    693 
    694       for (auto& f : funcs)
    695       {
     705      for (auto& f : funcs_inlined)
     706      {
     707        std::string flags;
     708
    696709        std::cout << std::setw (6) << f.size () << ' '
    697710                  << (char) (f.is_external () ? 'E' : ' ')
     711                  << (char) (f.get_inlined () == dwarf::function::inl_inline ? 'C' : ' ')
    698712                  << std::hex << std::setfill ('0')
    699713                  << " 0x" << std::setw (8) << f.pc_low ()
     
    701715                  << ' ' << f.name ()
    702716                  << std::endl;
     717      }
     718
     719      if (funcs_not_inlined.size () > 0)
     720      {
     721        std::sort (funcs_not_inlined.begin (), funcs_not_inlined.end (), compare);
     722        std::reverse (funcs_not_inlined.begin (), funcs_not_inlined.end ());
     723
     724        std::cout << std::endl << "inline funcs not inlined: " << std::endl;
     725        for (auto& f : funcs_not_inlined)
     726        {
     727          std::cout << std::setw (6) << f.size () << ' '
     728                    << (char) (f.is_external () ? 'E' : ' ')
     729                    << (char) (f.get_inlined () == dwarf::function::inl_inline ? 'C' : ' ')
     730                    << std::hex << std::setfill ('0')
     731                    << " 0x" << std::setw (8) << f.pc_low ()
     732                    << std::dec << std::setfill (' ')
     733                    << ' ' << f.name ()
     734                    << std::endl;
     735        }
    703736      }
    704737    }
Note: See TracChangeset for help on using the changeset viewer.