Home | History | Annotate | Download | only in include
      1 /*******************************************************************************
      2 * Copyright (C) 2018 Cadence Design Systems, Inc.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining
      5 * a copy of this software and associated documentation files (the
      6 * "Software"), to use this Software with Cadence processor cores only and
      7 * not with any other processors and platforms, subject to
      8 * the following conditions:
      9 *
     10 * The above copyright notice and this permission notice shall be included
     11 * in all copies or substantial portions of the Software.
     12 *
     13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     15 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     16 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     17 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     18 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     19 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     20 
     21 ******************************************************************************/
     22 
     23 #ifndef __XF_H
     24 #error  "xf-debug.h mustn't be included directly"
     25 #endif
     26 
     27 /*******************************************************************************
     28  * Auxiliary macros (put into "xf-types.h"?)
     29  ******************************************************************************/
     30 
     31 #ifndef offset_of
     32 #define offset_of(type, member)         \
     33     ((int)(intptr_t)&(((const type *)(0))->member))
     34 #endif
     35 
     36 #ifndef container_of
     37 #define container_of(ptr, type, member) \
     38     ((type *)((void *)(ptr) - offset_of(type, member)))
     39 #endif
     40 
     41 /*******************************************************************************
     42  * Bug check for constant conditions (file scope)
     43  ******************************************************************************/
     44 
     45 #define __C_BUG(n)      __C_BUG2(n)
     46 #define __C_BUG2(n)     __c_bug_##n
     47 #define C_BUG(expr)     typedef char __C_BUG(__LINE__)[(expr) ? -1 : 1]
     48 
     49 /*******************************************************************************
     50  * Compilation-time types control
     51  ******************************************************************************/
     52 
     53 #if XF_DEBUG
     54 #define __C_TYPE_CONTROL(d, type)       ((void) ((d) != (type*) 0))
     55 #else
     56 #define __C_TYPE_CONTROL(d, type)       ((void) 0)
     57 #endif
     58 
     59 /*******************************************************************************
     60  * Unused variable
     61  ******************************************************************************/
     62 
     63 #define C_UNUSED(v)                     (void)(0 ? (v) = (v), 1 : 0)
     64 
     65 /*******************************************************************************
     66  * Auxiliary macros
     67  ******************************************************************************/
     68 
     69 /* ...define a stub for unused declarator */
     70 #define __xf_stub(tag, line)            __xf_stub2(tag, line)
     71 #define __xf_stub2(tag, line)           typedef int __xf_##tag##_##line
     72 
     73 /* ...convert anything into string */
     74 #define __xf_string(x)                  __xf_string2(x)
     75 #define __xf_string2(x)                 #x
     76 
     77 /*******************************************************************************
     78  * Tracing facility
     79  ******************************************************************************/
     80 
     81 #if XF_TRACE
     82 
     83 /* ...tracing to communication processor */
     84 extern int  xf_trace(const char *format, ...);
     85 
     86 /* ...tracing facility initialization */
     87 extern void xf_trace_init(const char *banner);
     88 
     89 /* ...initialize tracing facility */
     90 #define TRACE_INIT(banner)              (xf_trace_init(banner))
     91 
     92 /* ...trace tag definition */
     93 #define TRACE_TAG(tag, on)              enum { __xf_trace_##tag = on }
     94 
     95 /* ...check if the trace tag is enabled */
     96 #define TRACE_CFG(tag)                  (__xf_trace_##tag)
     97 
     98 /* ...tagged tracing primitive */
     99 #define TRACE(tag, fmt, ...)            (void)(__xf_trace_##tag ? __xf_trace(tag, __xf_format##fmt, ## __VA_ARGS__), 1 : 0)
    100 
    101 /*******************************************************************************
    102  * Tagged tracing formats
    103  ******************************************************************************/
    104 
    105 /* ...tracing primitive */
    106 #define __xf_trace(tag, fmt, ...)       \
    107     ({ __attribute__((unused)) const char *__xf_tag = #tag; xf_trace(fmt, ## __VA_ARGS__); })
    108 
    109 /* ...just a format string */
    110 #define __xf_format_n(fmt)              fmt
    111 
    112 /* ...module tag and trace tag shown */
    113 #define __xf_format_b(fmt)              "[%s.%s] " fmt, __xf_string(MODULE_TAG), __xf_tag
    114 
    115 /* ...module tag, trace tag, file name and line shown */
    116 #define __xf_format_x(fmt)              "[%s.%s] - %s@%d - " fmt,  __xf_string(MODULE_TAG), __xf_tag, __FILE__, __LINE__
    117 
    118 /*******************************************************************************
    119  * Globally defined tags
    120  ******************************************************************************/
    121 
    122 /* ...unconditionally OFF */
    123 TRACE_TAG(0, 0);
    124 
    125 /* ...unconditionally ON */
    126 TRACE_TAG(1, 1);
    127 
    128 /* ...error output - on by default */
    129 TRACE_TAG(ERROR, 1);
    130 
    131 #else
    132 
    133 #define TRACE_INIT(banner)              (void)0
    134 #define TRACE_TAG(tag, on)              __xf_stub(trace_##tag, __LINE__)
    135 #define TRACE(tag, fmt, ...)            (void)0
    136 #define __xf_trace(tag, fmt, ...)       (void)0
    137 
    138 #endif  /* XF_TRACE */
    139 
    140 /*******************************************************************************
    141  * Bugchecks
    142  ******************************************************************************/
    143 
    144 #if XF_DEBUG
    145 
    146 /* ...run-time bugcheck */
    147 #define BUG(cond, fmt, ...)                                     \
    148 do                                                              \
    149 {                                                               \
    150     if (cond)                                                   \
    151     {                                                           \
    152         /* ...output message */                                 \
    153         __xf_trace(BUG, __xf_format##fmt, ## __VA_ARGS__);      \
    154                                                                 \
    155         /* ...and die  */                                       \
    156         abort();                                                \
    157     }                                                           \
    158 }                                                               \
    159 while (0)
    160 
    161 #else
    162 #define BUG(cond, fmt, ...)             (void)0
    163 #endif  /* XF_DEBUG */
    164 
    165 /*******************************************************************************
    166  * Run-time error processing
    167  ******************************************************************************/
    168 
    169 /* ...check the API call succeeds */
    170 #define XF_CHK_API(cond)                                \
    171 ({                                                      \
    172     int __ret;                                          \
    173                                                         \
    174     if ((__ret = (int)(cond)) < 0)                      \
    175     {                                                   \
    176         TRACE(ERROR, _x("API error: %d"), __ret);       \
    177         return __ret;                                   \
    178     }                                                   \
    179     __ret;                                              \
    180 })
    181 
    182 /* ...check the condition is true */
    183 #define XF_CHK_ERR(cond, error)                 \
    184 ({                                              \
    185     intptr_t __ret;                             \
    186                                                 \
    187     if (!(__ret = (intptr_t)(cond)))            \
    188     {                                           \
    189         TRACE(ERROR, _x("check failed"));       \
    190         return (error);                         \
    191     }                                           \
    192     (int)__ret;                                 \
    193 })
    194 
    195