summaryrefslogtreecommitdiff
path: root/linkers/rtems-tld.cpp
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2014-09-09 08:20:41 +1000
committerChris Johns <chrisj@rtems.org>2014-09-09 08:20:41 +1000
commit6fb14092151645e40a207161f1b0a89b5a848a97 (patch)
treed1a076c8eedd29f7d79e76221acfc7ef38c51cbe /linkers/rtems-tld.cpp
parent2126ea7ff045df25fe6588e8820e02504744549d (diff)
rtems-tld: Add entry and exit trace support.
Diffstat (limited to 'linkers/rtems-tld.cpp')
-rw-r--r--linkers/rtems-tld.cpp49
1 files changed, 39 insertions, 10 deletions
diff --git a/linkers/rtems-tld.cpp b/linkers/rtems-tld.cpp
index 8e3d7c7..ea9518c 100644
--- a/linkers/rtems-tld.cpp
+++ b/linkers/rtems-tld.cpp
@@ -135,7 +135,9 @@ namespace rld
std::string name; /**< The name of this wrapper. */
rld::strings headers; /**< Include statements. */
rld::strings defines; /**< Define statements. */
+ std::string entry_trace; /**< Code template to trace the function entry. */
std::string arg_trace; /**< Code template to trace an argument. */
+ std::string exit_trace; /**< Code template to trace the function exit. */
std::string ret_trace; /**< Code template to trace the return value. */
rld::strings code; /**< Code block inserted before the trace code. */
@@ -440,8 +442,14 @@ namespace rld
parse (config, section, "defines", "define", defines);
parse (config, section, "code-blocks", "code", code, false);
- arg_trace = rld::dequote (section.get_record_item ("arg-trace"));
- ret_trace = rld::dequote (section.get_record_item ("ret-trace"));
+ if (section.has_record ("entry-trace"))
+ entry_trace = rld::dequote (section.get_record_item ("entry-trace"));
+ if (section.has_record ("arg-trace"))
+ arg_trace = rld::dequote (section.get_record_item ("arg-trace"));
+ if (section.has_record ("exit-trace"))
+ exit_trace = rld::dequote (section.get_record_item ("exit-trace"));
+ if (section.has_record ("ret-trace"))
+ ret_trace = rld::dequote (section.get_record_item ("ret-trace"));
}
void
@@ -639,6 +647,8 @@ namespace rld
const signature& sig = (*si).second;
+ c.write_line(sig.decl () + ";");
+
c.write_line("");
c.write_line(sig.decl ("__wrap_"));
c.write_line("{");
@@ -654,17 +664,28 @@ namespace rld
std::string l;
- for (size_t a = 0; a < sig.args.size (); ++a)
+ if (!generator_.entry_trace.empty ())
{
- std::string l = ' ' + generator_.arg_trace;
- std::string n = rld::to_string ((int) (a + 1));
- l = rld::find_replace (l, "@ARG_NUM@", n);
- l = rld::find_replace (l, "@ARG_TYPE@", '"' + sig.args[0] + '"');
- l = rld::find_replace (l, "@ARG_SIZE@", "sizeof(" + sig.args[0] + ')');
- l = rld::find_replace (l, "@ARG_LABEL@", "a" + n);
+ std::string l = ' ' + generator_.entry_trace;
+ l = rld::find_replace (l, "@FUNC_NAME@", '"' + sig.name + '"');
+ l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
c.write_line(l);
}
+ if (!generator_.arg_trace.empty ())
+ {
+ for (size_t a = 0; a < sig.args.size (); ++a)
+ {
+ std::string l = ' ' + generator_.arg_trace;
+ std::string n = rld::to_string ((int) (a + 1));
+ l = rld::find_replace (l, "@ARG_NUM@", n);
+ l = rld::find_replace (l, "@ARG_TYPE@", '"' + sig.args[0] + '"');
+ l = rld::find_replace (l, "@ARG_SIZE@", "sizeof(" + sig.args[0] + ')');
+ l = rld::find_replace (l, "@ARG_LABEL@", "a" + n);
+ c.write_line(l);
+ }
+ }
+
l.clear ();
if (has_ret)
@@ -680,7 +701,15 @@ namespace rld
l += ");";
c.write_line(l);
- if (has_ret)
+ if (!generator_.exit_trace.empty ())
+ {
+ std::string l = ' ' + generator_.exit_trace;
+ l = rld::find_replace (l, "@FUNC_NAME@", '"' + sig.name + '"');
+ l = rld::find_replace (l, "@FUNC_LABEL@", sig.name);
+ c.write_line(l);
+ }
+
+ if (has_ret && !generator_.ret_trace.empty ())
{
std::string l = ' ' + generator_.ret_trace;
l = rld::find_replace (l, "@RET_TYPE@", '"' + sig.ret + '"');