[rtems-tools commit] rtems-tld: Add config options, fix void args, and SCore traces.
Chris Johns
chrisj at rtems.org
Sun Sep 21 04:17:20 UTC 2014
Module: rtems-tools
Branch: master
Commit: 5025439f9d8df419e5d9797d930f7490bfdf86c0
Changeset: http://git.rtems.org/rtems-tools/commit/?id=5025439f9d8df419e5d9797d930f7490bfdf86c0
Author: Chris Johns <chrisj at rtems.org>
Date: Sun Sep 21 14:24:37 2014 +1000
rtems-tld: Add config options, fix void args, and SCore traces.
---
linkers/rtems-api.ini | 20 ++++
linkers/rtems-score-coremutex.ini | 12 +++
linkers/rtems-score-heap.ini | 26 +++++
linkers/rtems-score-object.ini | 38 +++++++
linkers/rtems-score-thread.ini | 56 +++++++++++
linkers/rtems-score.ini | 29 ++++++
linkers/rtems-tld.cpp | 193 +++++++++++++++++++++++++++++--------
linkers/rtems.ini | 21 +----
linkers/rtld-base.ini | 90 +-----------------
linkers/rtld-print.ini | 94 ++++++++++++++++++
linkers/wscript | 10 ++-
rtemstoolkit/rld-config.cpp | 3 +
rtemstoolkit/rld-config.h | 2 +-
13 files changed, 447 insertions(+), 147 deletions(-)
diff --git a/linkers/rtems-api.ini b/linkers/rtems-api.ini
new file mode 100644
index 0000000..f2de480
--- /dev/null
+++ b/linkers/rtems-api.ini
@@ -0,0 +1,20 @@
+;
+; RTEMS API Trace Configurations
+;
+[rtems-api]
+headers = rtems-api-headers
+defines = rtems-api-defines
+signatures = rtems-api-signatures
+
+[rtems-api-headers]
+header = "#include <rtems.h>"
+
+[rtems-api-defines]
+; Currently empty
+
+[rtems-api-task]
+trace = rtems_task_create
+
+[rtems-api-signatures]
+rtems_task_create = rtems_status_code, rtems_name, rtems_task_priority, size_t, rtems_mode, rtems_attribute, rtems_id*
+
diff --git a/linkers/rtems-score-coremutex.ini b/linkers/rtems-score-coremutex.ini
new file mode 100644
index 0000000..2459d0c
--- /dev/null
+++ b/linkers/rtems-score-coremutex.ini
@@ -0,0 +1,12 @@
+;
+; RTEMS Supercore Core Mutex Trace Configurations
+;
+[rtems-score-coremutex-all]
+trace = _CORE_mutex_Initialize, _CORE_mutex_Seize_interrupt_blocking
+trace = _CORE_mutex_Surrender, _CORE_mutex_Flush
+
+[rtems-score-coremutex-signatures]
+_CORE_mutex_Initialize = CORE_mutex_Status, CORE_mutex_Control*, Thread_Control*, const CORE_mutex_Attributes*, bool
+_CORE_mutex_Seize_interrupt_blocking = void, CORE_mutex_Control*, Thread_Control*, Watchdog_Interval
+_CORE_mutex_Surrender = CORE_mutex_Status, CORE_mutex_Control*, Objects_Id, CORE_mutex_API_mp_support_callout
+_CORE_mutex_Flush = void, CORE_mutex_Control*, Thread_queue_Flush_callout, uint32_t
diff --git a/linkers/rtems-score-heap.ini b/linkers/rtems-score-heap.ini
new file mode 100644
index 0000000..7a3426d
--- /dev/null
+++ b/linkers/rtems-score-heap.ini
@@ -0,0 +1,26 @@
+;
+; RTEMS Supercore Heap Trace Configurations
+;
+[rtems-score-heap-all]
+trace = _Heap_Get_first_and_last_block, _Heap_Initialize, _Heap_Allocate_aligned_with_boundary
+trace = _Heap_Free, _Heap_Walk, _Heap_Iterate, _Heap_Greedy_allocate
+trace = _Heap_Greedy_allocate_all_except_largest, _Heap_Greedy_free, _Heap_Get_information
+trace = _Heap_Get_free_information, _Heap_Size_of_alloc_area, _Heap_Resize_block
+trace = _Heap_Block_allocate
+
+[rtems-score-heap-signatures]
+_Heap_Get_first_and_last_block = bool, uintptr_t, uintptr_t, uintptr_t, uintptr_t, Heap_Block**, Heap_Block**
+_Heap_Initialize = uintptr_t, Heap_Control*, void*, uintptr_t, uintptr_t
+_Heap_Allocate_aligned_with_boundary = void*, Heap_Control*, uintptr_t, uintptr_t, uintptr_t
+_Heap_Free = bool, Heap_Control*, void*
+_Heap_Walk = bool, Heap_Control*, int, bool
+_Heap_Iterate = void, Heap_Control*, Heap_Block_visitor, void*
+_Heap_Greedy_allocate = Heap_Block*, Heap_Control*, const uintptr_t*, size_t
+_Heap_Greedy_allocate_all_except_largest = Heap_Block*, Heap_Control*, uintptr_t*
+_Heap_Greedy_free = void, Heap_Control*, Heap_Block*
+_Heap_Get_information = void, Heap_Control*, Heap_Information_block*
+_Heap_Get_free_information = void, Heap_Control*, Heap_Information*
+_Heap_Size_of_alloc_area = bool, Heap_Control*, void*, uintptr_t*
+_Heap_Resize_block = Heap_Resize_status, Heap_Control*, void*, uintptr_t, uintptr_t*, uintptr_t*
+_Heap_Block_allocate = Heap_Block*, Heap_Control*, Heap_Block*, uintptr_t, uintptr_t
+
diff --git a/linkers/rtems-score-object.ini b/linkers/rtems-score-object.ini
new file mode 100644
index 0000000..34c2fd0
--- /dev/null
+++ b/linkers/rtems-score-object.ini
@@ -0,0 +1,38 @@
+;
+; RTEMS Supercore Objects Trace Configurations
+;
+[rtems-score-object-all]
+trace = _Objects_Initialize_information, _Objects_Extend_information
+trace = _Objects_Shrink_information, _Objects_Allocate_unprotected
+trace = _Objects_Allocate, _Objects_Free, _Objects_Get, _Objects_Get_isr_disable
+trace = _Objects_Get_no_protection, _Objects_Get_next, _Objects_Get_information
+trace = _Objects_Get_information_id, _Objects_Get_name_as_string, _Objects_Set_name
+trace = _Objects_Namespace_remove, _Objects_Close, _Objects_Active_count
+
+[rtems-score-object-alloc]
+trace = _Objects_Initialize_information, _Objects_Allocate_unprotected
+trace = _Objects_Allocate, _Objects_Free, _Objects_Close
+
+[rtems-score-object-get]
+trace = _Objects_Get, _Objects_Get_isr_disable, _Objects_Get_no_protection
+trace = _Objects_Get_next, _Objects_Get_information, _Objects_Get_information_id
+trace = _Objects_Get_name_as_string
+
+[rtems-score-object-signatures]
+_Objects_Initialize_information = void, Objects_Information*, Objects_APIs, uint16_t, uint32_t, uint16_t, bool, uint32_t
+_Objects_Extend_information = void, Objects_Information*
+_Objects_Shrink_information = void, Objects_Information*
+_Objects_Allocate_unprotected = Objects_Control*, Objects_Information*
+_Objects_Allocate = Objects_Control*, Objects_Information*
+_Objects_Free = void, Objects_Information*, Objects_Control*
+_Objects_Get = Objects_Control*, Objects_Information*, Objects_Id, Objects_Locations*
+_Objects_Get_isr_disable = Objects_Control*, Objects_Information*, Objects_Id, Objects_Locations*, ISR_Level*
+_Objects_Get_no_protection = Objects_Control*, Objects_Information*, Objects_Id, Objects_Locations*
+_Objects_Get_next = Objects_Control*, Objects_Information*, Objects_Id, Objects_Locations*, Objects_Id*
+_Objects_Get_information = Objects_Information*, Objects_APIs, uint16_t
+_Objects_Get_information_id = Objects_Information*, Objects_Id
+_Objects_Get_name_as_string = char*, Objects_Id, size_t, char*
+_Objects_Set_name = bool, Objects_Information*, Objects_Control*, const char*
+_Objects_Namespace_remove = void, Objects_Information*, Objects_Control*
+_Objects_Close = void, Objects_Information*, Objects_Control*
+_Objects_Active_count = Objects_Maximum, const Objects_Information*
diff --git a/linkers/rtems-score-thread.ini b/linkers/rtems-score-thread.ini
new file mode 100644
index 0000000..f1cbfe6
--- /dev/null
+++ b/linkers/rtems-score-thread.ini
@@ -0,0 +1,56 @@
+;
+; RTEMS Supercore Thread Trace Configurations
+;
+[rtems-score-thread-all]
+trace = _Thread_Handler_initialization, _Thread_Create_idle, _Thread_Start_multitasking
+trace = _Thread_Stack_Allocate, _Thread_Stack_Free, _Thread_Initialize, _Thread_Start
+trace = _Thread_Restart, _Thread_Yield, _Thread_Set_life_protection
+trace = _Thread_Life_action_handler, _Thread_Kill_zombies, _Thread_Close
+trace = _Thread_Ready, _Thread_Clear_state, _Thread_Set_state, _Thread_Load_environment
+trace = _Thread_Handler, _Thread_Delay_ended, _Thread_Change_priority, _Thread_Set_priority
+trace = _Thread_Get, _Thread_blocking_operation_Cancel, _Thread_blocking_operation_Finalize
+
+[rtems-score-thread-create-destory]
+traces = rtems-score-thread-create, rtems-score-thread-destroy
+
+[rtems-score-thread-create]
+trace = _Thread_Handler_initialization, _Thread_Create_idle
+trace = _Thread_Stack_Allocate, _Thread_Initialize, _Thread_Start
+trace = _Thread_Restart, _Thread_Handler
+
+[rtems-score-thread-destroy]
+trace = _Thread_Kill_zombies, _Thread_Close
+trace = , _Thread_blocking_operation_Cancel, _Thread_blocking_operation_Finalize
+
+[rtems-score-thread-activity]
+trace = _Thread_Restart, _Thread_Yield, _Thread_Set_life_protection
+trace = _Thread_Life_action_handler, _Thread_Ready, _Thread_Clear_state,
+trace = _Thread_Set_state, _Thread_Load_environment, _Thread_Delay_ended
+trace = _Thread_Change_priority, _Thread_Set_priority, _Thread_Get
+
+[rtems-score-thread-signatures]
+_Thread_Handler_initialization = void, void
+_Thread_Create_idle = void, void
+_Thread_Start_multitasking = void, void
+_Thread_Stack_Allocate = size_t, Thread_Control*, size_t
+_Thread_Stack_Free = void, Thread_Control*
+_Thread_Initialize = bool, Objects_Information *, Thread_Control*, const struct Scheduler_Control*, void*, size_t, bool, Priority_Control, bool, Thread_CPU_budget_algorithms, Thread_CPU_budget_algorithm_callout, uint32_t, Objects_Name
+_Thread_Start = bool, Thread_Control*, Thread_Start_types, void*, void*, Thread_Entry_numeric_type, Per_CPU_Control*
+_Thread_Restart = bool, Thread_Control*, Thread_Control*, void*, Thread_Entry_numeric_type
+_Thread_Yield = void, Thread_Control*
+_Thread_Set_life_protection = bool, bool
+_Thread_Life_action_handler = void, Thread_Control*, Thread_Action*, Per_CPU_Control*, ISR_Level
+_Thread_Kill_zombies = void, void
+_Thread_Close = void, Thread_Control*, Thread_Control*
+_Thread_Ready = void, Thread_Control*
+_Thread_Clear_state = void, Thread_Control*, States_Control
+_Thread_Set_state = void, Thread_Control*, States_Control
+_Thread_Load_environment = void, Thread_Control*
+_Thread_Handler = void, void
+_Thread_Delay_ended = void, Objects_Id, void*
+_Thread_Change_priority = void, Thread_Control*, Priority_Control, bool
+_Thread_Set_priority = void, Thread_Control*, Priority_Control
+_Thread_Get = Thread_Control*, Objects_Id, Objects_Locations*
+_Thread_blocking_operation_Cancel = void, Thread_blocking_operation_States, Thread_Control*, ISR_Level
+_Thread_blocking_operation_Finalize = void, Thread_Control*, ISR_Level
+
diff --git a/linkers/rtems-score.ini b/linkers/rtems-score.ini
new file mode 100644
index 0000000..edea712
--- /dev/null
+++ b/linkers/rtems-score.ini
@@ -0,0 +1,29 @@
+;
+; RTEMS Supercore Trace Configurations
+;
+[rtems-score]
+headers = rtems-score-headers
+defines = rtems-score-defines
+; Object
+include = rtems-score-object.ini
+signatures = rtems-score-object-signatures
+; Thread
+include = rtems-score-thread.ini
+signatures = rtems-score-thread-signatures
+; Heap
+include = rtems-score-heap.ini
+signatures = rtems-score-heap-signatures
+; Core Mutex
+include = rtems-score-coremutex.ini
+signatures = rtems-score-coremutex-signatures
+
+[rtems-score-headers]
+header = "#include <rtems.h>"
+header = "#include <rtems/score/heapimpl.h>"
+header = "#include <rtems/score/objectimpl.h>"
+header = "#include <rtems/score/threadimpl.h>"
+header = "#include <rtems/score/coremuteximpl.h>"
+header = "#include <rtems/score/scheduler.h>"
+
+[rtems-score-defines]
+; Currently empty
diff --git a/linkers/rtems-tld.cpp b/linkers/rtems-tld.cpp
index 70ab330..c2cc196 100644
--- a/linkers/rtems-tld.cpp
+++ b/linkers/rtems-tld.cpp
@@ -59,6 +59,11 @@ namespace rld
namespace trace
{
/**
+ * Dump on error user option.
+ */
+ bool dump_on_error;
+
+ /**
* A container of arguments.
*/
typedef std::vector < std::string > function_args;
@@ -88,6 +93,16 @@ namespace rld
signature (const rld::config::record& record);
/**
+ * Has the signature got a return value ?
+ */
+ bool has_ret () const;
+
+ /**
+ * Has the signature got any arguments ?
+ */
+ bool has_args () const;
+
+ /**
* Return the function's declaration.
*/
const std::string decl (const std::string& prefix = "") const;
@@ -173,6 +188,11 @@ namespace rld
const std::string& section);
/**
+ * Process any script based options.
+ */
+ void load_options (const rld::config::section& section);
+
+ /**
* The the functions for the trace.
*/
void load_functions (rld::config::config& config,
@@ -206,11 +226,10 @@ namespace rld
private:
- std::string name; /**< The name of the trace. */
- std::string bsp; /**< The BSP we are linking to. */
- rld::strings traces; /**< The functions to trace. */
- functions functions_; /**< The functions that can be traced. */
- generator generator_; /**< The tracer's generator. */
+ std::string name; /**< The name of the trace. */
+ rld::strings traces; /**< The functions to trace. */
+ functions functions_; /**< The functions that can be traced. */
+ generator generator_; /**< The tracer's generator. */
};
/**
@@ -317,28 +336,53 @@ namespace rld
rld::config::parse_items (record, si);
if (si.size () == 0)
- throw rld::error ("no return value", "signature: " + record.name);
+ throw rld::error ("no return value", "signature: " + name);
if (si.size () == 1)
- throw rld::error ("no arguments", "signature: " + record.name);
+ throw rld::error ("no arguments", "signature: " + name);
ret = si[0];
args.resize (si.size () - 1);
std::copy (si.begin () + 1, si.end (), args.begin ());
}
+ bool
+ signature::has_ret () const
+ {
+ /*
+ * @todo Need to define as part of the function signature if ret
+ * processing is required.
+ */
+ return ret != "void";
+ }
+
+ bool
+ signature::has_args () const
+ {
+ if (args.empty ())
+ return false;
+ return ((args.size() == 1) && (args[0] == "void")) ? false : true;
+ }
+
const std::string
signature::decl (const std::string& prefix) const
{
std::string ds = ret + ' ' + prefix + name + '(';
- int arg = 0;
- for (function_args::const_iterator ai = args.begin ();
- ai != args.end ();
- ++ai)
+ if (has_args ())
+ {
+ int arg = 0;
+ for (function_args::const_iterator ai = args.begin ();
+ ai != args.end ();
+ ++ai)
{
if (ai != args.begin ())
ds += ", ";
ds += (*ai) + " a" + rld::to_string (++arg);
}
+ }
+ else
+ {
+ ds += "void";
+ }
ds += ')';
return ds;
}
@@ -374,13 +418,21 @@ namespace rld
sli != sig_list.end ();
++sli)
{
- const rld::config::section& sig_sec = config.get_section (*sli);
- for (rld::config::records::const_iterator si = sig_sec.recs.begin ();
- si != sig_sec.recs.end ();
- ++si)
+ rld::strings sigs;
+ rld::split(sigs, *sli, ',');
+
+ for (rld::strings::const_iterator ssi = sigs.begin ();
+ ssi != sigs.end ();
+ ++ssi)
{
- signature sig (*si);
- signatures_[sig.name] = sig;
+ const rld::config::section& sig_sec = config.get_section (*ssi);
+ for (rld::config::records::const_iterator si = sig_sec.recs.begin ();
+ si != sig_sec.recs.end ();
+ ++si)
+ {
+ signature sig (*si);
+ signatures_[sig.name] = sig;
+ }
}
}
}
@@ -503,21 +555,77 @@ namespace rld
* The following records are required:
*
* # name
- * # bsp
- * # trace
+ * # traces
* # functions
*/
const rld::config::section& section = config.get_section (tname);
- config.includes (section);
-
name = section.get_record_item ("name");
-
+ load_options (section);
+ config.includes (section);
load_functions (config, section);
load_traces (config, section);
}
void
+ tracer::load_options (const rld::config::section& section)
+ {
+ rld::strings ol;
+ rld::config::parse_items (section, "options", ol, true);
+
+ for (rld::strings::const_iterator oli = ol.begin ();
+ oli != ol.end ();
+ ++oli)
+ {
+ rld::strings opts;
+ rld::split(opts, *oli, ',');
+ for (rld::strings::const_iterator oi = opts.begin ();
+ oi != opts.end ();
+ ++oi)
+ {
+ const std::string& opt = *oi;
+ if (opt == "dump-on-error")
+ dump_on_error = true;
+ else if (opt == "verbose")
+ rld::verbose_inc ();
+ else if (opt == "prefix")
+ {
+ rld::strings prefix;
+ rld::split (prefix, opt, '=');
+ if (prefix.size () != 2)
+ throw rld::error ("invalid option", "option: " + opt);
+ rld::cc::set_exec_prefix (prefix[1]);
+ }
+ else if (opt == "cc")
+ {
+ rld::strings cc;
+ rld::split (cc, opt, '=');
+ if (cc.size () != 2)
+ throw rld::error ("invalid option", "option: " + opt);
+ rld::cc::set_cc (cc[1]);
+ }
+ else if (opt == "ld")
+ {
+ rld::strings ld;
+ rld::split (ld, opt, '=');
+ if (ld.size () != 2)
+ throw rld::error ("invalid option", "option: " + opt);
+ rld::cc::set_ld (ld[1]);
+ }
+ else if (opt == "cflags")
+ {
+ rld::strings cflags;
+ rld::split (cflags, opt, '=');
+ if (cflags.size () < 2)
+ throw rld::error ("invalid option", "option: " + opt);
+ cflags.erase (cflags.begin ());
+ rld::cc::append_flags (rld::join (cflags, "="), rld::cc::ft_cflags);
+ }
+ }
+ }
+ }
+
+ void
tracer::load_functions (rld::config::config& config,
const rld::config::section& section)
{
@@ -543,12 +651,17 @@ namespace rld
parse (config, section, "traces", "generator", gens);
if (gens.size () > 1)
+ {
+ if (dump_on_error)
+ dump (std::cout);
throw rld::error ("duplicate generators", "tracer: " + section.name);
+ }
if (gens.size () == 0)
{
- gen =
- config.get_section ("default-generator").get_record_item ("generator");
+ const rld::config::section& dg_section = config.get_section ("default-generator");
+ gen = dg_section.get_record_item ("generator");
+ config.includes (dg_section);
}
else
{
@@ -587,6 +700,8 @@ namespace rld
catch (...)
{
c.close ();
+ if (dump_on_error)
+ dump (std::cout);
throw;
}
@@ -659,13 +774,7 @@ namespace rld
c.write_line(sig.decl ("__wrap_"));
c.write_line("{");
- /*
- * @todo Need to define as part of the function signature if ret
- * processing is required.
- */
- bool has_ret = sig.ret != "void";
-
- if (has_ret)
+ if (sig.has_ret ())
c.write_line(" " + sig.ret + " ret;");
std::string l;
@@ -678,7 +787,7 @@ namespace rld
c.write_line(l);
}
- if (!generator_.arg_trace.empty ())
+ if (sig.has_args ())
{
for (size_t a = 0; a < sig.args.size (); ++a)
{
@@ -694,15 +803,18 @@ namespace rld
l.clear ();
- if (has_ret)
+ if (sig.has_ret ())
l = " ret =";
l += " __real_" + sig.name + '(';
- for (size_t a = 0; a < sig.args.size (); ++a)
+ if (sig.has_args ())
{
- if (a)
- l += ", ";
- l += "a" + rld::to_string ((int) (a + 1));
+ for (size_t a = 0; a < sig.args.size (); ++a)
+ {
+ if (a)
+ l += ", ";
+ l += "a" + rld::to_string ((int) (a + 1));
+ }
}
l += ");";
c.write_line(l);
@@ -715,7 +827,7 @@ namespace rld
c.write_line(l);
}
- if (has_ret && !generator_.ret_trace.empty ())
+ if (sig.has_ret () && !generator_.ret_trace.empty ())
{
std::string l = ' ' + generator_.ret_trace;
l = rld::find_replace (l, "@RET_TYPE@", '"' + sig.ret + '"');
@@ -744,7 +856,6 @@ namespace rld
tracer::dump (std::ostream& out) const
{
out << " Tracer: " << name << std::endl
- << " BSP: " << bsp << std::endl
<< " Traces: " << traces.size () << std::endl;
for (rld::strings::const_iterator ti = traces.begin ();
ti != traces.end ();
@@ -824,6 +935,8 @@ namespace rld
(status.code != 0))
{
err.output (rld::cc::get_cc (), std::cout);
+ if (dump_on_error)
+ dump (std::cout);
throw rld::error ("Compiler error", "compiling wrapper");
}
}
@@ -920,7 +1033,7 @@ usage (int exit_code)
<< " -f cflags : C compiler flags (also --cflags)" << std::endl
<< " -r path : RTEMS path (also --rtems)" << std::endl
<< " -B bsp : RTEMS arch/bsp (also --rtems-bsp)" << std::endl
- << " -W wrappe r : wrapper file name without ext (also --wrapper)" << std::endl
+ << " -W wrapper : wrapper file name without ext (also --wrapper)" << std::endl
<< " -C ini : user configuration INI file (also --config)" << std::endl;
::exit (exit_code);
}
diff --git a/linkers/rtems.ini b/linkers/rtems.ini
index f2de480..f19bcfc 100644
--- a/linkers/rtems.ini
+++ b/linkers/rtems.ini
@@ -1,20 +1,7 @@
;
-; RTEMS API Trace Configurations
+; RTEMS Trace Configurations
;
-[rtems-api]
-headers = rtems-api-headers
-defines = rtems-api-defines
-signatures = rtems-api-signatures
-
-[rtems-api-headers]
-header = "#include <rtems.h>"
-
-[rtems-api-defines]
-; Currently empty
-
-[rtems-api-task]
-trace = rtems_task_create
-
-[rtems-api-signatures]
-rtems_task_create = rtems_status_code, rtems_name, rtems_task_priority, size_t, rtems_mode, rtems_attribute, rtems_id*
+[includes]
+include = rtems-api.ini
+include = rtems-score.ini
diff --git a/linkers/rtld-base.ini b/linkers/rtld-base.ini
index 1927dcc..39d5fb1 100644
--- a/linkers/rtld-base.ini
+++ b/linkers/rtld-base.ini
@@ -10,91 +10,5 @@
[default-generator]
generator = printf-generator
-;
-; A printf generator prints to stdout the trace functions.
-;
-[printf-generator]
-headers = printf-generator-headers
-entry-trace = "rtld_pg_printf_entry(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
-arg-trace = "rtld_pg_printf_arg(@ARG_NUM@, @ARG_TYPE@, @ARG_SIZE@, (void*) &@ARG_LABEL@);"
-exit-trace = "rtld_pg_printf_exit(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
-ret-trace = "rtld_pg_printf_ret(@RET_TYPE@, @RET_SIZE@, (void*) &@RET_LABEL@);"
-code = <<<CODE
-static inline void rtld_pg_printf_entry(const char* func_name,
- void* func_addr)
-{
- printf (" >> %s (0x%08x)\n", func_name, func_addr);
-}
-static inline void rtld_pg_printf_arg(int arg_num,
- const char* arg_type,
- int arg_size,
- void* arg)
-{
- const unsigned char* p = arg;
- int i;
- printf (" %2d] %s(%d) = ", arg_num, arg_type, arg_size);
- for (i = 0; i < arg_size; ++i, ++p) printf ("%02x", (unsigned int) *p);
- printf ("\n");
-}
-static inline void rtld_pg_printf_exit(const char* func_name,
- void* func_addr)
-{
- printf (" << %s (0x%08x)\n", func_name, func_addr);
-}
-static inline void rtld_pg_printf_ret(const char* ret_type,
- int ret_size,
- void* ret)
-{
- const unsigned char* p = ret;
- int i;
- printf (" rt] %s(%d) = ", ret_type, ret_size);
- for (i = 0; i < ret_size; ++i, ++p) printf ("%02x", (unsigned int) *p);
- printf ("\n");
-}
-CODE
-
-[printf-generator-headers]
-header = "#include <stdio.h>"
-
-[printk-generator]
-headers = printk-generator-headers
-entry-trace = "rtld_pg_printk_entry(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
-arg-trace = "rtld_pg_printk_arg(@ARG_NUM@, @ARG_TYPE@, @ARG_SIZE@, (void*) &@ARG_LABEL@);"
-exit-trace = "rtld_pg_printk_exit(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
-ret-trace = "rtld_pg_printk_ret(@RET_TYPE@, @RET_SIZE@, (void*) &@RET_LABEL@);"
-code = <<<CODE
-static inline void rtld_pg_printk_entry(const char* func_name,
- void* func_addr)
-{
- printk (" >> %s (0x%08x)\n", func_name, func_addr);
-}
-static inline void rtld_pg_printk_arg(int arg_num,
- const char* arg_type,
- int arg_size,
- void* arg)
-{
- const unsigned char* p = arg;
- int i;
- printk (" %2d] %s(%d) = ", arg_num, arg_type, arg_size);
- for (i = 0; i < arg_size; ++i, ++p) printk ("%02x", (unsigned int) *p);
- printk ("\n");
-}
-static inline void rtld_pg_printk_exit(const char* func_name,
- void* func_addr)
-{
- printk (" << %s (0x%08x)\n", func_name, func_addr);
-}
-static inline void rtld_pg_printk_ret(const char* ret_type,
- int ret_size,
- void* ret)
-{
- const unsigned char* p = ret;
- int i;
- printk (" rt] %s(%d) = ", ret_type, ret_size);
- for (i = 0; i < ret_size; ++i, ++p) printk ("%02x", (unsigned int) *p);
- printk ("\n");
-}
-CODE
-
-[printk-generator-headers]
-header = "#include <stdio.h>"
+[includes]
+include = rtld-print.ini
diff --git a/linkers/rtld-print.ini b/linkers/rtld-print.ini
new file mode 100644
index 0000000..b9b524f
--- /dev/null
+++ b/linkers/rtld-print.ini
@@ -0,0 +1,94 @@
+;
+; RTEMS Trace Linker Printf and Prink configuration.
+;
+; Copyright 2014 Chris Johns <chrisj at rtems.org>
+;
+
+;
+; A printf generator prints to stdout the trace functions.
+;
+[printf-generator]
+headers = printf-generator-headers
+entry-trace = "rtld_pg_printf_entry(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
+arg-trace = "rtld_pg_printf_arg(@ARG_NUM@, @ARG_TYPE@, @ARG_SIZE@, (void*) &@ARG_LABEL@);"
+exit-trace = "rtld_pg_printf_exit(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
+ret-trace = "rtld_pg_printf_ret(@RET_TYPE@, @RET_SIZE@, (void*) &@RET_LABEL@);"
+code = <<<CODE
+static inline void rtld_pg_printf_entry(const char* func_name,
+ void* func_addr)
+{
+ printf (">>> %s (0x%08x)\n", func_name, func_addr);
+}
+static inline void rtld_pg_printf_arg(int arg_num,
+ const char* arg_type,
+ int arg_size,
+ void* arg)
+{
+ const unsigned char* p = arg;
+ int i;
+ printf (" %2d] %s(%d) = ", arg_num, arg_type, arg_size);
+ for (i = 0; i < arg_size; ++i, ++p) printf ("%02x", (unsigned int) *p);
+ printf ("\n");
+}
+static inline void rtld_pg_printf_exit(const char* func_name,
+ void* func_addr)
+{
+ printf ("<<< %s (0x%08x)\n", func_name, func_addr);
+}
+static inline void rtld_pg_printf_ret(const char* ret_type,
+ int ret_size,
+ void* ret)
+{
+ const unsigned char* p = ret;
+ int i;
+ printf (" rt] %s(%d) = ", ret_type, ret_size);
+ for (i = 0; i < ret_size; ++i, ++p) printf ("%02x", (unsigned int) *p);
+ printf ("\n");
+}
+CODE
+
+[printf-generator-headers]
+header = "#include <stdio.h>"
+
+[printk-generator]
+headers = printk-generator-headers
+entry-trace = "rtld_pg_printk_entry(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
+arg-trace = "rtld_pg_printk_arg(@ARG_NUM@, @ARG_TYPE@, @ARG_SIZE@, (void*) &@ARG_LABEL@);"
+exit-trace = "rtld_pg_printk_exit(@FUNC_NAME@, (void*) &@FUNC_LABEL@);"
+ret-trace = "rtld_pg_printk_ret(@RET_TYPE@, @RET_SIZE@, (void*) &@RET_LABEL@);"
+code = <<<CODE
+static inline void rtld_pg_printk_entry(const char* func_name,
+ void* func_addr)
+{
+ printk (">>> %s (0x%08x)\n", func_name, func_addr);
+}
+static inline void rtld_pg_printk_arg(int arg_num,
+ const char* arg_type,
+ int arg_size,
+ void* arg)
+{
+ const unsigned char* p = arg;
+ int i;
+ printk (" %2d] %s(%d) = ", arg_num, arg_type, arg_size);
+ for (i = 0; i < arg_size; ++i, ++p) printk ("%02x", (unsigned int) *p);
+ printk ("\n");
+}
+static inline void rtld_pg_printk_exit(const char* func_name,
+ void* func_addr)
+{
+ printk ("<<< %s (0x%08x)\n", func_name, func_addr);
+}
+static inline void rtld_pg_printk_ret(const char* ret_type,
+ int ret_size,
+ void* ret)
+{
+ const unsigned char* p = ret;
+ int i;
+ printk (" rt] %s(%d) = ", ret_type, ret_size);
+ for (i = 0; i < ret_size; ++i, ++p) printk ("%02x", (unsigned int) *p);
+ printk ("\n");
+}
+CODE
+
+[printk-generator-headers]
+header = "#include <stdio.h>"
diff --git a/linkers/wscript b/linkers/wscript
index 99aa86a..3d11747 100644
--- a/linkers/wscript
+++ b/linkers/wscript
@@ -88,7 +88,15 @@ def build(bld):
linkflags = conf['linkflags'],
use = modules)
bld.install_files('${PREFIX}/share/rtems/trace-linker',
- ['rtems.ini', 'rtld-base.ini'])
+ ['rtems.ini',
+ 'rtems-api.ini',
+ 'rtems-score.ini',
+ 'rtems-score-object.ini',
+ 'rtems-score-thread.ini',
+ 'rtems-score-heap.ini',
+ 'rtems-score-coremutex.ini',
+ 'rtld-base.ini',
+ 'rtld-print.ini'])
#
# Build the symbols.
diff --git a/rtemstoolkit/rld-config.cpp b/rtemstoolkit/rld-config.cpp
index c106120..d11cbbe 100644
--- a/rtemstoolkit/rld-config.cpp
+++ b/rtemstoolkit/rld-config.cpp
@@ -190,6 +190,9 @@ namespace rld
}
secs.push_back (sec);
+
+ if (sec.name == "includes")
+ includes(sec);
}
}
diff --git a/rtemstoolkit/rld-config.h b/rtemstoolkit/rld-config.h
index 4bcb964..5afc7b1 100644
--- a/rtemstoolkit/rld-config.h
+++ b/rtemstoolkit/rld-config.h
@@ -154,7 +154,7 @@ namespace rld
* any records named 'include' split the items and include the
* configuration files.
*/
- void includes (const section& sec, bool must_exist = false);
+ void includes (const section& sec, bool must_exist = true);
/**
* Get the section and throw an error if not found.
More information about the vc
mailing list