Changeset 058d502 in rtems-tools


Ignore:
Timestamp:
Aug 4, 2014, 5:09:39 AM (5 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
a136346
Parents:
0a21024
Message:

rtems-tld: Add generator loading support.

Location:
linkers
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • linkers/rld-config.cpp

    r0a21024 r058d502  
    5757    }
    5858
     59    std::string
     60    section::get_record_item (const std::string& rec_name) const
     61    {
     62      const record& rec = get_record (rec_name);
     63      if (rec.items.size () != 1)
     64        throw rld::error ("duplicate", "record item: " + name + '/' + rec_name);
     65      return rec.items[0].text;
     66    }
     67
     68    void
     69    section::get_record_items (const std::string& rec_name, rld::strings& items) const
     70    {
     71      const record& rec = get_record (rec_name);
     72      items.clear ();
     73      for (rld::config::items::const_iterator ii = rec.items.begin ();
     74           ii != rec.items.end ();
     75           ++ii)
     76      {
     77        items.push_back ((*ii).text);
     78      }
     79    }
     80
    5981    config::config()
    6082    {
     
    135157      try
    136158      {
    137         const rld::config::record& rec = sec.get_record ("include");
     159        rld::strings is;
     160        parse_items (sec, "include", is);
    138161
    139162        have_includes = true;
     
    148171         */
    149172
    150         for (rld::config::items::const_iterator ri = rec.items.begin ();
    151              ri != rec.items.end ();
    152              ++ri)
     173        for (rld::strings::const_iterator isi = is.begin ();
     174             isi != is.end ();
     175             ++isi)
    153176        {
    154           load ((*ri).text);
     177          load (*isi);
    155178        }
    156179      }
  • linkers/rld-config.h

    r0a21024 r058d502  
    9191       */
    9292      const record& get_record (const std::string& name) const;
     93
     94      /**
     95       * Return the single item in a record. If the record is duplicated an
     96       * error is thrown.
     97       */
     98      std::string get_record_item (const std::string& name) const;
     99
     100      /**
     101       * Return the list of items in a record in a strings container.
     102       */
     103      void get_record_items (const std::string& name, rld::strings& items) const;
    93104    };
    94105
  • linkers/rld.h

    r0a21024 r058d502  
    151151
    152152  /**
     153   * Dequote a string.
     154   */
     155  inline std::string dequote (const std::string& s)
     156  {
     157    if ((s.front () == '"') || (s.front () == '\''))
     158    {
     159      if (s.front () != s.back ())
     160        throw rld::error ("invalid quoting", "string: " + s);
     161      return s.substr (1, s.length () - (1 + 1));
     162    }
     163    return s;
     164  }
     165
     166  /**
     167   * Find and replace.
     168   */
     169  inline std::string find_replace(const std::string& sin,
     170                                  const std::string& out,
     171                                  const std::string& in)
     172  {
     173    std::string s = sin;
     174    size_t      pos = 0;
     175    while ((pos = s.find (out, pos)) != std::string::npos)
     176    {
     177      s.replace (pos, out.length (), in);
     178      pos += in.length ();
     179    }
     180    return s;
     181  }
     182
     183  /**
    153184   * Split the string in a contain of strings based on the the
    154185   * delimiter. Optionally trim any white space or include empty string.
     
    171202        trim (e);
    172203      if (strip_quotes)
    173       {
    174         if ((e.front () == '"') || (e.front () == '\''))
    175         {
    176           if (e.front () != e.back ())
    177             throw rld::error ("invalid quoting", "string: " + s);
    178           e = e.substr (1, e.length () - (1 + 1));
    179         }
    180       }
     204        e = dequote (e);
    181205      if (empty || !e.empty ())
    182206      {
     
    190214   * Join the strings together with the separator.
    191215   */
    192   inline std::string& join (const strings&     ss,
    193                             const std::string& separator,
    194                             std::string&       s)
    195   {
     216  inline std::string join (const strings&     ss,
     217                           const std::string& separator)
     218  {
     219    std::string s;
    196220    for (strings::const_iterator ssi = ss.begin ();
    197221         ssi != ss.end ();
  • linkers/rtems-tld.cpp

    r0a21024 r058d502  
    110110    struct wrapper
    111111    {
    112       std::string   name;     /**< The name of this wrapper. */
    113       rld::strings  headers;  /**< Include statements. */
    114       rld::strings  defines;  /**< Define statements. */
    115       function_sigs sigs;     /**< The functions this wrapper wraps. */
     112      std::string   name;            /**< The name of this wrapper. */
     113      rld::strings  headers;         /**< Include statements. */
     114      rld::strings  defines;         /**< Define statements. */
     115      std::string   map_sym_prefix;  /**< Mapping symbol prefix. */
     116      std::string   arg_trace;       /**< Code template to trace an argument. */
     117      std::string   ret_trace;       /**< Code template to trace the return value. */
     118      std::string   code;            /**< Code block inserted before the trace code. */
     119      function_sigs sigs;            /**< The functions this wrapper wraps. */
    116120
    117121      /**
     
    120124      wrapper (const std::string&   name,
    121125               rld::config::config& config);
     126
     127      /**
     128       * Parse the generator.
     129       */
     130      void parse_generator (rld::config::config& config,
     131                            const rld::config::section& section);
    122132
    123133      /**
     
    163173    private:
    164174
    165       std::string  name;     /**< The name of the trace. */
    166       std::string  bsp;      /**< The BSP we are linking to. */
    167       rld::strings trace;    /**< The functions to trace. */
    168       wrappers     wrappers; /**< Wrappers wrap trace functions. */
     175      std::string  name;            /**< The name of the trace. */
     176      std::string  bsp;             /**< The BSP we are linking to. */
     177      rld::strings trace;           /**< The functions to trace. */
     178      wrappers     wrappers;        /**< Wrappers wrap trace functions. */
    169179    };
    170180
     
    263273       * A wrapper section optionally contain one or more records of:
    264274       *
    265        * # header    A list of include string that are single or double quoted.
    266        * # define    A list of define string that are single or double quoted.
    267        * # signature A list of section names of function signatures.
     275       * # trace      A list of functions to trace.
     276       * # generator  The name of the generator section. Defaults if not present.
     277       * # headers    A list of sections containing headers or header records.
     278       * # header     A list of include string that are single or double quoted.
     279       * # defines    A list of sections containing defines or define record.
     280       * # defines    A list of define string that are single or double quoted.
     281       * # signatures A list of section names of function signatures.
    268282       *
    269283       * @note The quoting and list spliting is a little weak because a delimiter
     
    274288      parse (config, section, "headers", "header", headers);
    275289      parse (config, section, "defines", "define", defines);
     290
     291      parse_generator (config, section);
    276292
    277293      rld::strings sig_list;
     
    295311
    296312    void
     313    wrapper::parse_generator (rld::config::config& config,
     314                              const rld::config::section& section)
     315    {
     316      const rld::config::record* rec = 0;
     317      try
     318      {
     319        const rld::config::record& record = section.get_record ("generator");
     320        rec = &record;
     321      }
     322      catch (rld::error re)
     323      {
     324        /*
     325         * No error, continue.
     326         */
     327      }
     328
     329      std::string gen_section;
     330
     331      if (rec)
     332      {
     333        if (!rec->single ())
     334          throw rld::error ("duplicate", "generator: " + section.name + "/generator");
     335        gen_section = rec->items[0].text;
     336      }
     337      else
     338      {
     339        gen_section = config.get_section ("default-generator").get_record_item ("generator");
     340      }
     341
     342      const rld::config::section& sec = config.get_section (gen_section);
     343
     344      map_sym_prefix = sec.get_record_item ("map-sym-prefix");
     345      arg_trace = rld::dequote (sec.get_record_item ("arg-trace"));
     346      ret_trace = rld::dequote (sec.get_record_item ("ret-trace"));
     347      code = rld::dequote (sec.get_record_item ("code"));
     348    }
     349
     350    void
    297351    wrapper::parse (rld::config::config&        config,
    298352                    const rld::config::section& section,
     
    338392        out << "    " << (*di) << std::endl;
    339393      }
    340       out << "   Function Signatures: " << sigs.size () << std::endl;
     394      out << "   Mapping Symbol Prefix: " << map_sym_prefix << std::endl
     395          << "   Arg Trace Code: " << arg_trace << std::endl
     396          << "   Return Trace Code: " << ret_trace << std::endl
     397          << "   Code: | "
     398          << rld::find_replace (code, "\n", "\n         | ") << std::endl
     399          << "   Function Signatures: " << sigs.size () << std::endl;
    341400      for (function_sigs::const_iterator si = sigs.begin ();
    342401           si != sigs.end ();
  • linkers/test-trace.ini

    r0a21024 r058d502  
    2424; Include RTEMS Trace support.
    2525;
    26 include = rtems.ini
     26include = rtems.ini, rtld-base.ini
    2727
    2828;
     
    3737define = "#define TEST_TRACE 1"
    3838signatures = test-signatures
     39generator = printf-generator
    3940
    4041[test-headers]
Note: See TracChangeset for help on using the changeset viewer.