Changeset b988768 in rtems-tools


Ignore:
Timestamp:
Mar 26, 2015, 6:08:18 AM (4 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
b69cd3f
Parents:
1703041
Message:

trace-linker: Add Trace Buffering support.

Trace buffering traces into a static buffer complete with timestamp
and the executing context.

A shell command provides access to the data.

Location:
linkers
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • linkers/rtems-tld.cpp

    r1703041 rb988768  
    176176      std::string  lock_release;    /**< The lock release if provided. */
    177177      std::string  buffer_local;    /**< Code template to declare a local buffer variable. */
    178       std::string  buffer_alloc;    /**< Code template to perform a buffer allocation. */
    179178      rld::strings headers;         /**< Include statements. */
    180179      rld::strings defines;         /**< Define statements. */
    181180      std::string  entry_trace;     /**< Code template to trace the function entry. */
     181      std::string  entry_alloc;     /**< Code template to perform a buffer allocation. */
    182182      std::string  arg_trace;       /**< Code template to trace an argument. */
    183183      std::string  exit_trace;      /**< Code template to trace the function exit. */
     184      std::string  exit_alloc;      /**< Code template to perform a buffer allocation. */
    184185      std::string  ret_trace;       /**< Code template to trace the return value. */
    185186      rld::strings code;            /**< Code block inserted before the trace code. */
     
    646647      if (section.has_record ("buffer-local"))
    647648        buffer_local = rld::dequote (section.get_record_item ("buffer-local"));
    648       if (section.has_record ("buffer-local"))
    649         buffer_alloc = rld::dequote (section.get_record_item ("buffer-alloc"));
    650649      if (section.has_record ("entry-trace"))
    651650        entry_trace = rld::dequote (section.get_record_item ("entry-trace"));
     651      if (section.has_record ("entry-alloc"))
     652        entry_alloc = rld::dequote (section.get_record_item ("entry-alloc"));
    652653      if (section.has_record ("arg-trace"))
    653654        arg_trace = rld::dequote (section.get_record_item ("arg-trace"));
    654655      if (section.has_record ("exit-trace"))
    655656        exit_trace = rld::dequote (section.get_record_item ("exit-trace"));
     657      if (section.has_record ("exit-alloc"))
     658        exit_alloc = rld::dequote (section.get_record_item ("exit-alloc"));
    656659      if (section.has_record ("ret-trace"))
    657660        ret_trace = rld::dequote (section.get_record_item ("ret-trace"));
     
    955958
    956959      std::stringstream sss;
    957       sss << "const char const* __rld_trace_names[" << traces.size() << "] = " << std::endl
     960      sss << "uint32_t __rtld_trace_names_size = " << traces.size() << ";" << std::endl
     961          << "const char const* __rtld_trace_names[" << traces.size() << "] = " << std::endl
    958962          << "{";
    959963      c.write_line (sss.str ());
     
    10761080            lss << count;
    10771081
    1078             std::string l;
    1079 
    10801082            c.write_line("");
    10811083
    10821084            if (sig.has_args () || (sig.has_ret () && !generator_.ret_trace.empty ()))
    10831085            {
    1084               bool added = false;
    1085               l = "#define FUNC_DATA_SIZE_" + sig.name + " (";
     1086              std::string ds;
     1087              std::string des;
     1088              std::string drs;
     1089              bool        ds_added = false;
     1090              bool        des_added = false;
     1091              bool        drs_added = false;
     1092              ds  = "#define FUNC_DATA_SIZE_" + sig.name + " (";
     1093              des = "#define FUNC_DATA_ENTRY_SIZE_" + sig.name + " (";
     1094              drs = "#define FUNC_DATA_RET_SIZE_" + sig.name + " (";
    10861095              if (sig.has_args ())
    10871096              {
    10881097                for (size_t a = 0; a < sig.args.size (); ++a)
    10891098                {
    1090                   if (added)
    1091                     l += " + ";
     1099                  if (ds_added)
     1100                    ds += " + ";
    10921101                  else
    1093                     added = true;
    1094                   l += "sizeof(" + sig.args[a] + ')';
     1102                    ds_added = true;
     1103                  if (des_added)
     1104                    des += " + ";
     1105                  else
     1106                    des_added = true;
     1107                  ds += "sizeof(" + sig.args[a] + ')';
     1108                  des += "sizeof(" + sig.args[a] + ')';
    10951109                }
    10961110              }
    10971111              if (sig.has_ret () && !generator_.ret_trace.empty ())
    10981112              {
    1099                 if (added)
    1100                   l += " + ";
     1113                if (ds_added)
     1114                  ds += " + ";
    11011115                else
    1102                   added = true;
    1103                 l += "sizeof(" + sig.ret + ')';
     1116                  ds_added = true;
     1117                if (drs_added)
     1118                  drs += " + ";
     1119                else
     1120                  drs_added = true;
     1121                ds += "sizeof(" + sig.ret + ')';
     1122                drs += "sizeof(" + sig.ret + ')';
    11041123              }
    1105               if (!added)
    1106                 l += '0';
    1107               l += ')';
    1108               c.write_line(l);
     1124              if (!ds_added)
     1125                ds += '0';
     1126              ds += ')';
     1127              if (!des_added)
     1128                des += '0';
     1129              des += ')';
     1130              if (!drs_added)
     1131                drs += '0';
     1132              drs += ')';
     1133              c.write_line(ds);
     1134              c.write_line(des);
     1135              c.write_line(drs);
    11091136            }
    11101137
     
    11231150              c.write_line(" " + sig.ret + " ret;");
    11241151
     1152            std::string l;
     1153
    11251154            if (!generator_.lock_acquire.empty ())
    11261155              c.write_line(generator_.lock_acquire);
    11271156
    1128             if (!generator_.buffer_alloc.empty ())
     1157            if (!generator_.entry_alloc.empty ())
    11291158            {
    1130               l = " " + generator_.buffer_alloc;
     1159              l = " " + generator_.entry_alloc;
    11311160              l = rld::find_replace (l, "@FUNC_NAME@", '"' + sig.name + '"');
    11321161              l = rld::find_replace (l, "@FUNC_INDEX@", lss.str ());
    11331162              l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
    11341163              l = rld::find_replace (l, "@FUNC_DATA_SIZE@", "FUNC_DATA_SIZE_" + sig.name);
     1164              l = rld::find_replace (l, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
     1165              l = rld::find_replace (l, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
    11351166              c.write_line(l);
    11361167            }
     
    11461177              l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
    11471178              l = rld::find_replace (l, "@FUNC_DATA_SIZE@", "FUNC_DATA_SIZE_" + sig.name);
     1179              l = rld::find_replace (l, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
     1180              l = rld::find_replace (l, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
    11481181              c.write_line(l);
    11491182            }
     
    11811214            c.write_line(l);
    11821215
     1216            if (!generator_.lock_acquire.empty ())
     1217              c.write_line(generator_.lock_acquire);
     1218
     1219            if (!generator_.exit_alloc.empty ())
     1220            {
     1221              l = " " + generator_.exit_alloc;
     1222              l = rld::find_replace (l, "@FUNC_NAME@", '"' + sig.name + '"');
     1223              l = rld::find_replace (l, "@FUNC_INDEX@", lss.str ());
     1224              l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
     1225              l = rld::find_replace (l, "@FUNC_DATA_SIZE@", "FUNC_DATA_SIZE_" + sig.name);
     1226              l = rld::find_replace (l, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
     1227              l = rld::find_replace (l, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
     1228              c.write_line(l);
     1229            }
     1230
     1231            if (!generator_.lock_release.empty ())
     1232              c.write_line(generator_.lock_release);
     1233
    11831234            if (!generator_.exit_trace.empty ())
    11841235            {
     
    11871238              l = rld::find_replace (l, "@FUNC_INDEX@", lss.str ());
    11881239              l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
     1240              l = rld::find_replace (l, "@FUNC_DATA_ENTRY_SIZE@", "FUNC_DATA_ENTRY_SIZE_" + sig.name);
     1241              l = rld::find_replace (l, "@FUNC_DATA_RET_SIZE@", "FUNC_DATA_RET_SIZE_" + sig.name);
    11891242              c.write_line(l);
    11901243            }
     
    12211274      std::stringstream ss;
    12221275
    1223       ss << "const uint32_t __rtld_trace_" << label << "[" << bitmap_size << "] = " << std::endl
     1276      ss << "uint32_t __rtld_trace_" << label << "_size = " << traces.size() << ";" << std::endl
     1277         << "const uint32_t __rtld_trace_" << label << "[" << bitmap_size << "] = " << std::endl
    12241278         << "{" << std::endl;
    12251279
  • linkers/wscript

    r1703041 rb988768  
    101101                       'rtems-score-coremutex.ini',
    102102                       'rtld-base.ini',
     103                       'rtld-trace-buffer.ini',
    103104                       'rtld-print.ini'])
    104105
Note: See TracChangeset for help on using the changeset viewer.