diff options
Diffstat (limited to 'hifi/xaf/host-apf/include/xf-debug.h')
-rw-r--r-- | hifi/xaf/host-apf/include/xf-debug.h | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/hifi/xaf/host-apf/include/xf-debug.h b/hifi/xaf/host-apf/include/xf-debug.h new file mode 100644 index 00000000..83172302 --- /dev/null +++ b/hifi/xaf/host-apf/include/xf-debug.h @@ -0,0 +1,194 @@ +/******************************************************************************* +* Copyright (C) 2018 Cadence Design Systems, Inc. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to use this Software with Cadence processor cores only and +* not with any other processors and platforms, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +******************************************************************************/ + +#ifndef __XF_H +#error "xf-debug.h mustn't be included directly" +#endif + +/******************************************************************************* + * Auxiliary macros (put into "xf-types.h"?) + ******************************************************************************/ + +#ifndef offset_of +#define offset_of(type, member) \ + ((int)(intptr_t)&(((const type *)(0))->member)) +#endif + +#ifndef container_of +#define container_of(ptr, type, member) \ + ((type *)((void *)(ptr) - offset_of(type, member))) +#endif + +/******************************************************************************* + * Bug check for constant conditions (file scope) + ******************************************************************************/ + +#define __C_BUG(n) __C_BUG2(n) +#define __C_BUG2(n) __c_bug_##n +#define C_BUG(expr) typedef char __C_BUG(__LINE__)[(expr) ? -1 : 1] + +/******************************************************************************* + * Compilation-time types control + ******************************************************************************/ + +#if XF_DEBUG +#define __C_TYPE_CONTROL(d, type) ((void) ((d) != (type*) 0)) +#else +#define __C_TYPE_CONTROL(d, type) ((void) 0) +#endif + +/******************************************************************************* + * Unused variable + ******************************************************************************/ + +#define C_UNUSED(v) (void)(0 ? (v) = (v), 1 : 0) + +/******************************************************************************* + * Auxiliary macros + ******************************************************************************/ + +/* ...define a stub for unused declarator */ +#define __xf_stub(tag, line) __xf_stub2(tag, line) +#define __xf_stub2(tag, line) typedef int __xf_##tag##_##line + +/* ...convert anything into string */ +#define __xf_string(x) __xf_string2(x) +#define __xf_string2(x) #x + +/******************************************************************************* + * Tracing facility + ******************************************************************************/ + +#if XF_TRACE + +/* ...tracing to communication processor */ +extern int xf_trace(const char *format, ...); + +/* ...tracing facility initialization */ +extern void xf_trace_init(const char *banner); + +/* ...initialize tracing facility */ +#define TRACE_INIT(banner) (xf_trace_init(banner)) + +/* ...trace tag definition */ +#define TRACE_TAG(tag, on) enum { __xf_trace_##tag = on } + +/* ...check if the trace tag is enabled */ +#define TRACE_CFG(tag) (__xf_trace_##tag) + +/* ...tagged tracing primitive */ +#define TRACE(tag, fmt, ...) (void)(__xf_trace_##tag ? __xf_trace(tag, __xf_format##fmt, ## __VA_ARGS__), 1 : 0) + +/******************************************************************************* + * Tagged tracing formats + ******************************************************************************/ + +/* ...tracing primitive */ +#define __xf_trace(tag, fmt, ...) \ + ({ __attribute__((unused)) const char *__xf_tag = #tag; xf_trace(fmt, ## __VA_ARGS__); }) + +/* ...just a format string */ +#define __xf_format_n(fmt) fmt + +/* ...module tag and trace tag shown */ +#define __xf_format_b(fmt) "[%s.%s] " fmt, __xf_string(MODULE_TAG), __xf_tag + +/* ...module tag, trace tag, file name and line shown */ +#define __xf_format_x(fmt) "[%s.%s] - %s@%d - " fmt, __xf_string(MODULE_TAG), __xf_tag, __FILE__, __LINE__ + +/******************************************************************************* + * Globally defined tags + ******************************************************************************/ + +/* ...unconditionally OFF */ +TRACE_TAG(0, 0); + +/* ...unconditionally ON */ +TRACE_TAG(1, 1); + +/* ...error output - on by default */ +TRACE_TAG(ERROR, 1); + +#else + +#define TRACE_INIT(banner) (void)0 +#define TRACE_TAG(tag, on) __xf_stub(trace_##tag, __LINE__) +#define TRACE(tag, fmt, ...) (void)0 +#define __xf_trace(tag, fmt, ...) (void)0 + +#endif /* XF_TRACE */ + +/******************************************************************************* + * Bugchecks + ******************************************************************************/ + +#if XF_DEBUG + +/* ...run-time bugcheck */ +#define BUG(cond, fmt, ...) \ +do \ +{ \ + if (cond) \ + { \ + /* ...output message */ \ + __xf_trace(BUG, __xf_format##fmt, ## __VA_ARGS__); \ + \ + /* ...and die */ \ + abort(); \ + } \ +} \ +while (0) + +#else +#define BUG(cond, fmt, ...) (void)0 +#endif /* XF_DEBUG */ + +/******************************************************************************* + * Run-time error processing + ******************************************************************************/ + +/* ...check the API call succeeds */ +#define XF_CHK_API(cond) \ +({ \ + int __ret; \ + \ + if ((__ret = (int)(cond)) < 0) \ + { \ + TRACE(ERROR, _x("API error: %d"), __ret); \ + return __ret; \ + } \ + __ret; \ +}) + +/* ...check the condition is true */ +#define XF_CHK_ERR(cond, error) \ +({ \ + intptr_t __ret; \ + \ + if (!(__ret = (intptr_t)(cond))) \ + { \ + TRACE(ERROR, _x("check failed")); \ + return (error); \ + } \ + (int)__ret; \ +}) + |