Changeset 2126ea7 in rtems-tools


Ignore:
Timestamp:
Sep 8, 2014, 9:29:41 AM (5 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
6fb1409
Parents:
17c8364
Message:

rtems-tld: Generate arg and ret code in the wrapper.

Location:
linkers
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • linkers/rtems-tld.cpp

    r17c8364 r2126ea7  
    136136      rld::strings headers;         /**< Include statements. */
    137137      rld::strings defines;         /**< Define statements. */
    138       std::string  map_sym_prefix;  /**< Mapping symbol prefix. */
    139138      std::string  arg_trace;       /**< Code template to trace an argument. */
    140139      std::string  ret_trace;       /**< Code template to trace the return value. */
     
    442441      parse (config, section, "code-blocks", "code",   code, false);
    443442
    444       map_sym_prefix = section.get_record_item ("map-sym-prefix");
    445443      arg_trace = rld::dequote (section.get_record_item ("arg-trace"));
    446444      ret_trace = rld::dequote (section.get_record_item ("ret-trace"));
     
    465463        out << "    " << (*di) << std::endl;
    466464      }
    467       out << "   Mapping Symbol Prefix: " << map_sym_prefix << std::endl
    468           << "   Arg Trace Code: " << arg_trace << std::endl
     465      out << "   Arg Trace Code: " << arg_trace << std::endl
    469466          << "   Return Trace Code: " << ret_trace << std::endl
    470467          << "   Code blocks: " << std::endl;
     
    647644            c.write_line("{");
    648645
    649             std::string l;
    650 
    651646            /*
    652647             * @todo Need to define as part of the function signature if ret
    653648             *       processing is required.
    654649             */
    655             if (sig.ret != "void")
     650            bool has_ret = sig.ret != "void";
     651
     652            if (has_ret)
     653              c.write_line(" " + sig.ret + " ret;");
     654
     655            std::string l;
     656
     657            for (size_t a = 0; a < sig.args.size (); ++a)
    656658            {
    657               c.write_line(" " + sig.ret + " ret;");
     659              std::string l = ' ' + generator_.arg_trace;
     660              std::string n = rld::to_string ((int) (a + 1));
     661              l = rld::find_replace (l, "@ARG_NUM@", n);
     662              l = rld::find_replace (l, "@ARG_TYPE@", '"' + sig.args[0] + '"');
     663              l = rld::find_replace (l, "@ARG_SIZE@", "sizeof(" + sig.args[0] + ')');
     664              l = rld::find_replace (l, "@ARG_LABEL@", "a" + n);
     665              c.write_line(l);
     666            }
     667
     668            l.clear ();
     669
     670            if (has_ret)
    658671              l = " ret =";
    659             }
    660672
    661673            l += " __real_" + sig.name + '(';
     
    669681            c.write_line(l);
    670682
    671             if (sig.ret != "void")
     683            if (has_ret)
    672684            {
     685              std::string l = ' ' + generator_.ret_trace;
     686              l = rld::find_replace (l, "@RET_TYPE@", '"' + sig.ret + '"');
     687              l = rld::find_replace (l, "@RET_SIZE@", "sizeof(" + sig.ret + ')');
     688              l = rld::find_replace (l, "@RET_LABEL@", "ret");
     689              c.write_line(l);
    673690              c.write_line(" return ret;");
    674691            }
     
    786803        std::cout << "linking: " << o.name () << std::endl;
    787804
    788       std::string wrap = " -Wl,--wrap -Wl,";
     805      std::string wrap = " -Wl,--wrap=";
    789806
    790807      rld::cc::make_ld_command (args);
    791808
    792       args.push_back (o.name ());
    793 
    794       rld::process::args_append (args, ld_cmd);
    795809      rld::process::args_append (args,
    796810                                 wrap + rld::join (tracer_.get_traces (), wrap));
     811      args.push_back (o.name ());
     812      rld::process::args_append (args, ld_cmd);
    797813
    798814      rld::process::tempfile out;
     
    808824          (status.code != 0))
    809825      {
    810         err.output (rld::cc::get_cc (), std::cout);
     826        err.output (rld::cc::get_ld (), std::cout);
    811827        throw rld::error ("Linker error", "linking");
    812828      }
     829      err.output (rld::cc::get_ld (), std::cout);
    813830    }
    814831
  • linkers/rtld-base.ini

    r17c8364 r2126ea7  
    1515;
    1616[printf-generator]
    17 map-sym-prefix = rtld_pg__
    1817headers = printf-generator-headers
    19 arg-trace = "rtld_pg_print_arg(@ARG_NUM@, @ARG_TYPE@, @ARG_SIZE@, &@ARG_LABEL@);"
    20 ret-trace = "rtld_pg_print_ret(@RET_TYPE@, @RETG_SIZE@, &@RET_LABEL@);"
     18arg-trace = "rtld_pg_print_arg(@ARG_NUM@, @ARG_TYPE@, @ARG_SIZE@, (void*) &@ARG_LABEL@);"
     19ret-trace = "rtld_pg_print_ret(@RET_TYPE@, @RET_SIZE@, (void*) &@RET_LABEL@);"
    2120code = <<<CODE
    22 static inline void rtld_pg_print_arg(int    arg_num,
    23                                      const  char* arg_type,
    24                                      int    arg_size,
    25                                      void*  arg)
     21static inline void rtld_pg_print_arg(int         arg_num,
     22                                     const char* arg_type,
     23                                     int         arg_size,
     24                                     void*       arg)
    2625{
    2726  const char* p = arg;
     
    3130  printf ("\n");
    3231}
     32static inline void rtld_pg_print_ret(const char* ret_type,
     33                                     int         ret_size,
     34                                     void*       ret)
     35{
     36  const char* p = ret;
     37  int   i;
     38  printf (" rt] %s(%d) = ", ret_type, ret_size);
     39  for (i = 0; i < ret_size; ++i, ++p) printf ("%02x", (unsigned int) *p);
     40  printf ("\n");
     41}
    3342CODE
    3443
Note: See TracChangeset for help on using the changeset viewer.