aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/include/odp_debug_internal.h
blob: c5c1890c3156e0c627a652453d3a78f5b168217b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* Copyright (c) 2014-2018, Linaro Limited
 * Copyright (c) 2020, Nokia
 * All rights reserved.
 *
 * SPDX-License-Identifier:     BSD-3-Clause
 */
/**
 * @file
 *
 * ODP Debug internal
 * This file contains implementer support functions for Debug capabilities.
 *
 * @warning These definitions are not part of ODP API, they are for
 * internal use by implementers and should not be called from any other scope.
 */

#ifndef ODP_DEBUG_INTERNAL_H_
#define ODP_DEBUG_INTERNAL_H_

#include <odp/autoheader_external.h>
#include <odp/api/debug.h>
#include <odp_global_data.h>
#include <odp/api/plat/thread_inlines.h>

#include <stdio.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Avoid "ISO C99 requires at least one argument for the "..."  in a variadic
 * macro" errors when building with 'pedantic' option. */
#pragma GCC system_header

/* Debug level configure option. Zero is the highest level. Value of N prints debug messages from
 * level 0 to N. */
#define CONFIG_DEBUG_LEVEL 0

ODP_PRINTF_FORMAT(1, 2)
static inline void check_printf_format(const char *fmt, ...)
{
	(void)fmt;
}

#define _ODP_LOG_FN(level, fmt, ...) \
	do { \
		check_printf_format(fmt, ##__VA_ARGS__); \
		if (_odp_this_thread && _odp_this_thread->log_fn) \
			_odp_this_thread->log_fn(level, fmt, ##__VA_ARGS__); \
		else \
			odp_global_ro.log_fn(level, fmt, ##__VA_ARGS__); \
	} while (0)

/**
 * Runtime assertion-macro - aborts if 'cond' is false.
 */
#define ODP_ASSERT(cond) \
	do { if ((ODP_DEBUG == 1) && (!(cond))) { \
		ODP_ERR("%s\n", #cond); \
		odp_global_ro.abort_fn(); } \
	} while (0)

/**
 * This macro is used to indicate when a given function is not implemented
 */
#define ODP_UNIMPLEMENTED() \
		_ODP_LOG_FN(ODP_LOG_UNIMPLEMENTED, \
			"%s:%d:The function %s() is not implemented\n", \
			__FILE__, __LINE__, __func__)
/*
 * Print debug message to log, if ODP_DEBUG_PRINT flag is set (ignores CONFIG_DEBUG_LEVEL).
 */
#define ODP_DBG(fmt, ...) \
	do { \
		if (ODP_DEBUG_PRINT == 1) \
			ODP_LOG(ODP_LOG_DBG, fmt, ##__VA_ARGS__);\
	} while (0)

/*
 * Print debug message to log, if ODP_DEBUG_PRINT flag is set and CONFIG_DEBUG_LEVEL is high enough.
 */
#define ODP_DBG_LVL(level, fmt, ...) \
	do { \
		if (ODP_DEBUG_PRINT == 1 && CONFIG_DEBUG_LEVEL >= (level)) \
			ODP_LOG(ODP_LOG_DBG, fmt, ##__VA_ARGS__);\
	} while (0)

/*
 * Same as ODP_DBG_LVL() but does not add file/line/function name prefix
 */
#define ODP_DBG_RAW(level, fmt, ...) \
	do { \
		if (ODP_DEBUG_PRINT == 1 && CONFIG_DEBUG_LEVEL >= (level)) \
			_ODP_LOG_FN(ODP_LOG_DBG, fmt, ##__VA_ARGS__);\
	} while (0)

/**
 * Log error message.
 */
#define ODP_ERR(fmt, ...) \
		ODP_LOG(ODP_LOG_ERR, fmt, ##__VA_ARGS__)

/**
 * Log abort message and then stop execution (by default call abort()).
 * This function should not return.
 */
#define ODP_ABORT(fmt, ...) \
	do { \
		ODP_LOG(ODP_LOG_ABORT, fmt, ##__VA_ARGS__); \
		odp_global_ro.abort_fn(); \
	} while (0)

/**
 * ODP LOG macro.
 */
#define ODP_LOG(level, fmt, ...) \
	_ODP_LOG_FN(level, "%s:%d:%s():" fmt, __FILE__, \
	__LINE__, __func__, ##__VA_ARGS__)

/**
 * Log print message when the application calls one of the ODP APIs
 * specifically for dumping internal data.
 */
#define ODP_PRINT(fmt, ...) \
	_ODP_LOG_FN(ODP_LOG_PRINT, fmt, ##__VA_ARGS__)

#ifdef __cplusplus
}
#endif

#endif