Changeset 4638313 in rtems-tools


Ignore:
Timestamp:
Sep 15, 2020, 3:10:56 AM (2 weeks ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
9fcc207
Parents:
f86a0ce
Message:

linker/exeinfo: Optionally output full flags when listing object files

  • Start adding support to dump configuration tables
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • linkers/rtems-exeinfo.cpp

    rf86a0ce r4638313  
    154154       * Check the compiler and flags match.
    155155       */
    156       void output_compilation_unit (bool objects);
     156      void output_compilation_unit (bool objects, bool full_flags);
    157157
    158158      /*
     
    177177
    178178      /*
     179       * Output the configuration.
     180       */
     181      void output_config ();
     182
     183      /*
    179184       * Output the TLS data.
    180185       */
     
    190195       */
    191196      void output_dwarf ();
     197
     198    private:
     199
     200      void config (const std::string name);
    192201    };
    193202
     
    310319      debug.load_debug ();
    311320      debug.load_types ();
     321      debug.load_variables ();
    312322      debug.load_functions ();
    313323      symbols.globals (addresses);
     
    322332
    323333    void
    324     image::output_compilation_unit (bool objects)
     334    image::output_compilation_unit (bool objects, bool full_flags)
    325335    {
    326336      dwarf::compilation_units& cus = debug.get_cus ();
     
    475485              {
    476486                bool present = false;
    477                 for (auto& ff : filter_flags)
     487                if (!full_flags)
    478488                {
    479                   if (rld::starts_with(f, ff))
     489                  for (auto& ff : filter_flags)
    480490                  {
    481                     present = true;
    482                     break;
     491                    if (rld::starts_with(f, ff))
     492                    {
     493                      present = true;
     494                      break;
     495                    }
    483496                  }
    484497                }
     
    628641      symbols::symbol* tls_size = symbols.find_global("_TLS_Size");
    629642      symbols::symbol* tls_alignment = symbols.find_global("_TLS_Alignment");
     643      symbols::symbol* tls_max_size = symbols.find_global("_Thread_Maximum_TLS_size");
    630644
    631645      if (tls_data_begin == nullptr ||
     
    651665        }
    652666        std::cout << "TLS environment is INVALID (please report):" << std::endl
    653                   << " _TLS_Data_begin : "
     667                  << " _TLS_Data_begin          : "
    654668                  << (char*) (tls_data_begin == nullptr ? "not-found" : "found")
    655669                  << std::endl
    656                   << " _TLS_Data_end   : "
     670                  << " _TLS_Data_end            : "
    657671                  << (char*) (tls_data_end == nullptr ? "not-found" : "found")
    658672                  << std::endl
    659                   << " _TLS_Data_size  : "
     673                  << " _TLS_Data_size           : "
    660674                  << (char*) (tls_data_size == nullptr ? "not-found" : "found")
    661675                  << std::endl
    662                   << " _TLS_BSS_begin  : "
     676                  << " _TLS_BSS_begin           : "
    663677                  << (char*) (tls_bss_begin == nullptr ? "not-found" : "found")
    664678                  << std::endl
    665                   << " _TLS_BSS_end    : "
     679                  << " _TLS_BSS_end             : "
    666680                  << (char*) (tls_bss_end == nullptr ? "not-found" : "found")
    667681                  << std::endl
    668                   << " _TLS_BSS_Size   : "
     682                  << " _TLS_BSS_Size            : "
    669683                  << (char*) (tls_bss_size == nullptr ? "not-found" : "found")
    670684                  << std::endl
    671                   << " _TLS_Size       : "
     685                  << " _TLS_Size                : "
    672686                  << (char*) (tls_size == nullptr ? "not-found" : "found")
    673687                  << std::endl
    674                   << " _TLS_Alignment  : "
     688                  << " _TLS_Alignment           : "
    675689                  << (char*) (tls_alignment == nullptr ? "not-found" : "found")
     690                  << std::endl
     691                  << " _Thread_Maximum_TLS_size : "
     692                  << (char*) (tls_max_size == nullptr ? "not-found" : "found")
    676693                  << std::endl
    677694                  << std::endl;
     
    680697
    681698      std::cout << "TLS size      : " << tls_size->value () << std::endl
    682                 << "    data size : " << tls_data_size->value () << std::endl
     699                << "     max size : ";
     700      if (tls_max_size == nullptr)
     701          std::cout << "not found" << std::endl;
     702      else
     703          std::cout << tls_max_size->value () << std::endl;
     704      std::cout << "    data size : " << tls_data_size->value () << std::endl
    683705                << "     bss size : " << tls_bss_size->value () << std::endl
    684706                << "    alignment : " << tls_alignment->value () << std::endl
     
    688710                << std::dec << std::setfill (' ')
    689711                << std::endl;
     712    }
     713
     714    void image::config(const std::string name)
     715    {
     716      std::string table_name = "_" + name + "_Information";
     717      symbols::symbol* table = symbols.find_global(table_name);
     718
     719      if (table != nullptr)
     720        std::cout << " " << name << std::endl;
     721    }
     722
     723    void image::output_config()
     724    {
     725      std::cout << "Configurations:" << std::endl;
     726      config("Thread");
     727      config("Barrier");
     728      config("Extension");
     729      config("Message_queue");
     730      config("Partition");
     731      config("Rate_monotonic");
     732      config("Dual_ported_memory");
     733      config("Region");
     734      config("Semaphore");
     735      config("Timer");
     736      config("RTEMS_tasks");
    690737    }
    691738
     
    836883  { "fini",        no_argument,            NULL,           'F' },
    837884  { "objects",     no_argument,            NULL,           'O' },
     885  { "full-flags",  no_argument,            NULL,           'A' },
     886  { "config",      no_argument,            NULL,           'C' },
    838887  { "tls",         no_argument,            NULL,           'T' },
    839888  { "inlined",     no_argument,            NULL,           'i' },
     
    857906            << " -F        : show fini section tables (also --fini)" << std::endl
    858907            << " -O        : show object files (also --objects)" << std::endl
     908            << "           :  add --full-flags for compiler options" << std::endl
     909            << " -C        : show configuration (also --config)" << std::endl
    859910            << " -T        : show thread local storage data (also --tls)" << std::endl
    860911            << " -i        : show inlined code (also --inlined)" << std::endl
     
    922973    bool        fini = false;
    923974    bool        objects = false;
     975    bool        full_flags = false;
     976    bool        config = false;
    924977    bool        tls = false;
    925978    bool        inlined = false;
     
    930983    while (true)
    931984    {
    932       int opt = ::getopt_long (argc, argv, "hvVMaSIFOTiD", rld_opts, NULL);
     985      int opt = ::getopt_long (argc, argv, "hvVMaSIFOCTiD", rld_opts, NULL);
    933986      if (opt < 0)
    934987        break;
     
    9711024          break;
    9721025
     1026        case 'A':
     1027          full_flags = true;
     1028          break;
     1029
     1030        case 'C':
     1031          config = true;
     1032          break;
     1033
    9731034        case 'T':
    9741035          tls = true;
     
    10131074      fini = true;
    10141075      objects = true;
     1076      config = true;
    10151077      tls = true;
    10161078      inlined = true;
     
    10441106     * Generate the output.
    10451107     */
    1046     exe.output_compilation_unit (objects);
     1108    exe.output_compilation_unit (objects, full_flags);
    10471109    if (sections)
    10481110      exe.output_sections ();
     
    10511113    if (fini)
    10521114      exe.output_fini ();
     1115    if (config)
     1116      exe.output_config ();
    10531117    if (tls)
    10541118      exe.output_tls ();
  • rtemstoolkit/rld-dwarf.cpp

    rf86a0ce r4638313  
    574574      }
    575575      return *this;
     576    }
     577
     578    variable::variable (file& debug, debug_info_entry& die)
     579      : debug (debug),
     580        external_ (false),
     581        declaration_ (false)
     582    {
     583      dwarf_bool db;
     584
     585      if (die.attribute (DW_AT_external, db, false))
     586        external_ = db ? true : false;
     587
     588      if (die.attribute (DW_AT_declaration, db, false))
     589        declaration_ = db ? true : false;
     590
     591      /*
     592       * Get the name attribute. (if present)
     593       */
     594      die.attribute (DW_AT_name, name_);
     595      die.attribute (DW_AT_decl_file, decl_file_);
     596      die.attribute (DW_AT_decl_line, decl_line_);
     597
     598      if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     599      {
     600        std::cout << "dwarf::variable: ";
     601        dump (std::cout);
     602        std::cout << std::endl;
     603      }
     604    }
     605
     606    variable::variable (const variable& orig)
     607      : debug (orig.debug),
     608        external_ (orig.external_),
     609        declaration_ (orig.declaration_),
     610        name_ (orig.name_),
     611        decl_file_ (orig.decl_file_),
     612        decl_line_ (orig. decl_line_)
     613    {
     614    }
     615
     616    variable::~variable ()
     617    {
     618    }
     619
     620    std::string
     621    variable::name () const
     622    {
     623      return name_;
     624    }
     625
     626    bool
     627    variable::is_external () const
     628    {
     629      return external_;
     630    }
     631
     632    bool
     633    variable::is_declaration () const
     634    {
     635      return declaration_;
     636    }
     637
     638    size_t
     639    variable::size () const
     640    {
     641      size_t s = 0;
     642      return s;
     643    }
     644
     645    variable&
     646    variable::operator = (const variable& rhs)
     647    {
     648      if (this != &rhs)
     649      {
     650        debug = rhs.debug;
     651        external_ = rhs.external_;
     652        declaration_ = rhs.declaration_;
     653        name_ = rhs.name_;
     654        decl_file_ = rhs.decl_file_;
     655        decl_line_ = rhs.decl_line_;
     656      }
     657      return *this;
     658    }
     659
     660    void
     661    variable::dump (std::ostream& out) const
     662    {
     663      if (name_.empty ())
     664        out << "NO-NAME";
     665      else
     666        out << name_;
     667      out << " ["
     668          << (char) (external_ ? 'E' : '-')
     669          << (char) (declaration_ ? 'D' : '-')
     670          << "] size=" << size ()
     671          << std::hex << std::setfill ('0')
     672          << " (0x" << size () << ')'
     673          << std::dec << std::setfill (' ');
    576674    }
    577675
     
    15141612    {
    15151613      die.attribute (DW_AT_name, name_);
    1516       name_ = name_;
    15171614
    15181615      die.attribute (DW_AT_producer, producer_);
     
    16751772
    16761773    void
     1774    compilation_unit::load_variables ()
     1775    {
     1776      debug_info_entry die (debug, die_offset);
     1777      debug_info_entry child (debug);
     1778      if (die.get_child (child))
     1779        load_variables (child);
     1780    }
     1781
     1782    void
     1783    compilation_unit::load_variables (debug_info_entry& die)
     1784    {
     1785      while (true)
     1786      {
     1787        if (die.tag () == DW_TAG_variable)
     1788        {
     1789          function func (debug, die);
     1790          functions_.push_back (func);
     1791        }
     1792
     1793        debug_info_entry next (die.get_debug ());
     1794
     1795        if (die.get_child (next))
     1796          load_functions (next);
     1797
     1798        if (!die.get_sibling (next))
     1799          break;
     1800
     1801        die = next;
     1802      }
     1803    }
     1804
     1805    void
    16771806    compilation_unit::load_functions ()
    16781807    {
     
    19942123
    19952124    void
     2125    file::load_variables ()
     2126    {
     2127      for (auto& cu : cus)
     2128        cu.load_variables ();
     2129    }
     2130
     2131    void
    19962132    file::load_functions ()
    19972133    {
  • rtemstoolkit/rld-dwarf.h

    rf86a0ce r4638313  
    278278
    279279    /**
     280     * Variable.
     281     */
     282    class variable
     283    {
     284    public:
     285
     286      variable (file& debug, debug_info_entry& die);
     287      variable (const variable& orig);
     288      ~variable ();
     289
     290      /**
     291       * Get the name of the variable.
     292       */
     293      std::string name () const;
     294
     295      /**
     296       * Is the variable external?
     297       */
     298      bool is_external () const;
     299
     300      /**
     301       * Is this just a declaration?
     302       */
     303      bool is_declaration () const;
     304
     305      /**
     306       * Size of the variable.
     307       */
     308      size_t size () const;
     309
     310      /**
     311       * Assigment operator.
     312       */
     313      variable& operator = (const variable& rhs);
     314
     315      /**
     316       * Dump the variable.
     317       */
     318      void dump (std::ostream& out) const;
     319
     320    private:
     321
     322      file&          debug;
     323      bool           external_;
     324      bool           declaration_;
     325      std::string    name_;
     326      std::string    decl_file_;
     327      dwarf_unsigned decl_line_;
     328    };
     329
     330    typedef std::vector < variable > variables;
     331
     332    /**
    280333     * Function.
    281334     */
     
    621674
    622675      /**
     676       * Load the variables.
     677       */
     678      void load_variables ();
     679
     680      /**
    623681       * Load the functions.
    624682       */
     
    678736    private:
    679737
     738      void load_variables (debug_info_entry& die);
    680739      void load_functions (debug_info_entry& die);
    681740
     
    782841
    783842      /**
     843       * Load the DWARF variables information.
     844       */
     845      void load_variables ();
     846
     847      /**
    784848       * Get the source location given an address.
    785849       */
     
    794858
    795859      /**
     860       * Get the variable given a name. Raises an exception if not found.
     861       */
     862      variable& get_variable (std::string& name);
     863
     864      /**
    796865       * Does the function exist.
    797866       */
Note: See TracChangeset for help on using the changeset viewer.