Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:16

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup rtems_rtld
0007  *
0008  * @brief RTEMS Run-Time Link Editor Trace
0009  *
0010  * A configurable tracer for the RTL. See the header file for the enable and
0011  * disable.
0012  */
0013 
0014 /*
0015  *  COPYRIGHT (c) 2012 Chris Johns <chrisj@rtems.org>
0016  *
0017  * Redistribution and use in source and binary forms, with or without
0018  * modification, are permitted provided that the following conditions
0019  * are met:
0020  * 1. Redistributions of source code must retain the above copyright
0021  *    notice, this list of conditions and the following disclaimer.
0022  * 2. Redistributions in binary form must reproduce the above copyright
0023  *    notice, this list of conditions and the following disclaimer in the
0024  *    documentation and/or other materials provided with the distribution.
0025  *
0026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0027  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0028  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0029  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0030  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0031  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0032  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0033  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0034  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0035  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0036  * POSSIBILITY OF SUCH DAMAGE.
0037  */
0038 
0039 #ifdef HAVE_CONFIG_H
0040 #include "config.h"
0041 #endif
0042 
0043 #include <stdio.h>
0044 #include <string.h>
0045 
0046 #include <rtems/rtl/rtl-trace.h>
0047 
0048 #if RTEMS_RTL_TRACE
0049 static rtems_rtl_trace_mask rtems_rtl_trace_flags;
0050 
0051 bool
0052 rtems_rtl_trace (rtems_rtl_trace_mask mask)
0053 {
0054   bool result = false;
0055   if (mask & rtems_rtl_trace_flags)
0056     result = true;
0057   return result;
0058 }
0059 
0060 rtems_rtl_trace_mask
0061 rtems_rtl_trace_set_mask (rtems_rtl_trace_mask mask)
0062 {
0063   rtems_rtl_trace_mask state = rtems_rtl_trace_flags;
0064   rtems_rtl_trace_flags |= mask;
0065   return state;
0066 }
0067 
0068 rtems_rtl_trace_mask
0069 rtems_rtl_trace_clear_mask (rtems_rtl_trace_mask mask)
0070 {
0071   rtems_rtl_trace_mask state = rtems_rtl_trace_flags;
0072   rtems_rtl_trace_flags &= ~mask;
0073   return state;
0074 }
0075 
0076 int
0077 rtems_rtl_trace_shell_command (const rtems_printer* printer,
0078                                int                  argc,
0079                                char*                argv[])
0080 {
0081   const char* table[] =
0082   {
0083     "detail",
0084     "warning",
0085     "load",
0086     "unload",
0087     "section",
0088     "symbol",
0089     "reloc",
0090     "global-sym",
0091     "load-sect",
0092     "allocator",
0093     "unresolved",
0094     "cache",
0095     "archives",
0096     "archive-syms",
0097     "dependency",
0098     "bit-alloc"
0099   };
0100 
0101   rtems_rtl_trace_mask set_value = 0;
0102   rtems_rtl_trace_mask clear_value = 0;
0103   bool                 set = true;
0104   int                  arg;
0105   int                  t;
0106 
0107   for (arg = 1; arg < argc; arg++)
0108   {
0109     if (argv[arg][0] == '-')
0110     {
0111       switch (argv[arg][1])
0112       {
0113         case 'h':
0114           rtems_printf (printer, "usage: %s [-hl] [set/clear] [flags]\n", argv[0]);
0115           return 0;
0116         case 'l':
0117           rtems_printf (printer, "%s: valid flags to set or clear are:\n", argv[0]);
0118           for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++)
0119             rtems_printf (printer, "  %s\n", table[t]);
0120           return 0;
0121         default:
0122           rtems_printf (printer, "error: unknown option\n");
0123           return 1;
0124       }
0125     }
0126     else
0127     {
0128       if (strcmp (argv[arg], "set") == 0)
0129         set = true;
0130       if (strcmp (argv[arg], "clear") == 0)
0131         set = false;
0132       else if (strcmp (argv[arg], "all") == 0)
0133       {
0134         if (set)
0135           set_value = RTEMS_RTL_TRACE_ALL;
0136         else
0137           clear_value = RTEMS_RTL_TRACE_ALL;
0138       }
0139       else
0140       {
0141         for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++)
0142         {
0143           if (strcmp (argv[arg], table[t]) == 0)
0144           {
0145             if (set)
0146               set_value = 1 << t;
0147             else
0148               clear_value = 1 << t;
0149             break;
0150           }
0151         }
0152       }
0153 
0154       rtems_rtl_trace_flags |= set_value;
0155       rtems_rtl_trace_flags &= ~clear_value;
0156     }
0157   }
0158 
0159   return 0;
0160 }
0161 
0162 #endif