logging: fix LOG_HEXDUMP_* in C++.

Previously, there were two issues when attempting to use LOG_HEXDUMP_*
from C++:

First, gcc and clang in C mode both allow implicit pointer conversion
by default, but require -fpermissive, which no one should ever use, in
C++ mode. Furthermore, -Wpointer-sign, the warning emitted in C for
convertion between pointers to types of different signedness (e.g. char*
vs u8_t*) is explicitly disabled in Zephyr. Switch the various hexdump
functions to void*, which is guaranteed to work in both languages.

Second, the soon-to-be-standardized C++20 version of designated
initializers requires that the designators appear in the same order as
they are declared in the type being initialized.

Signed-off-by: Josh Gao <josh@jmgao.dev>
This commit is contained in:
Josh Gao 2019-12-12 21:16:17 -08:00 committed by Carles Cufí
commit 9f2916b943
3 changed files with 22 additions and 21 deletions

View file

@ -223,7 +223,7 @@ extern "C" {
/******************************************************************************/ /******************************************************************************/
/****************** Defiinitions used by minimal logging **********************/ /****************** Defiinitions used by minimal logging **********************/
/******************************************************************************/ /******************************************************************************/
void log_minimal_hexdump_print(int level, const char *data, size_t size); void log_minimal_hexdump_print(int level, const void *data, size_t size);
#define Z_LOG_TO_PRINTK(_level, fmt, ...) do { \ #define Z_LOG_TO_PRINTK(_level, fmt, ...) do { \
printk("%c: " fmt "\n", z_log_minimal_level_to_char(_level), \ printk("%c: " fmt "\n", z_log_minimal_level_to_char(_level), \
@ -314,8 +314,8 @@ static inline char z_log_minimal_level_to_char(int level)
(_level <= LOG_RUNTIME_FILTER(_filter))) { \ (_level <= LOG_RUNTIME_FILTER(_filter))) { \
struct log_msg_ids src_level = { \ struct log_msg_ids src_level = { \
.level = _level, \ .level = _level, \
.domain_id = CONFIG_LOG_DOMAIN_ID, \
.source_id = _id, \ .source_id = _id, \
.domain_id = CONFIG_LOG_DOMAIN_ID \
}; \ }; \
\ \
if (is_user_context) { \ if (is_user_context) { \
@ -548,9 +548,7 @@ void log_n(const char *str,
* @param length Data length. * @param length Data length.
* @param src_level Log identification. * @param src_level Log identification.
*/ */
void log_hexdump(const char *str, void log_hexdump(const char *str, const void *data, u32_t length,
const u8_t *data,
u32_t length,
struct log_msg_ids src_level); struct log_msg_ids src_level);
/** @brief Process log message synchronously. /** @brief Process log message synchronously.
@ -569,7 +567,7 @@ void log_string_sync(struct log_msg_ids src_level, const char *fmt, ...);
* @param len Data length. * @param len Data length.
*/ */
void log_hexdump_sync(struct log_msg_ids src_level, const char *metadata, void log_hexdump_sync(struct log_msg_ids src_level, const char *metadata,
const u8_t *data, u32_t len); const void *data, u32_t len);
/** /**
* @brief Writes a generic log message to the log. * @brief Writes a generic log message to the log.
@ -647,7 +645,7 @@ __syscall void z_log_string_from_user(u32_t src_level_val, const char *str);
* @param len Data length. * @param len Data length.
*/ */
void log_hexdump_from_user(struct log_msg_ids src_level, const char *metadata, void log_hexdump_from_user(struct log_msg_ids src_level, const char *metadata,
const u8_t *data, u32_t len); const void *data, u32_t len);
/* Internal function used by log_hexdump_from_user(). */ /* Internal function used by log_hexdump_from_user(). */
__syscall void z_log_hexdump_from_user(u32_t src_level_val, __syscall void z_log_hexdump_from_user(u32_t src_level_val,

View file

@ -309,15 +309,15 @@ void log_n(const char *str,
} }
} }
void log_hexdump(const char *str, void log_hexdump(const char *str, const void *data, u32_t length,
const u8_t *data,
u32_t length,
struct log_msg_ids src_level) struct log_msg_ids src_level)
{ {
if (IS_ENABLED(CONFIG_LOG_FRONTEND)) { if (IS_ENABLED(CONFIG_LOG_FRONTEND)) {
log_frontend_hexdump(str, data, length, src_level); log_frontend_hexdump(str, (const u8_t *)data, length,
src_level);
} else { } else {
struct log_msg *msg = log_msg_hexdump_create(str, data, length); struct log_msg *msg =
log_msg_hexdump_create(str, (const u8_t *)data, length);
if (msg == NULL) { if (msg == NULL) {
return; return;
@ -429,10 +429,11 @@ void log_string_sync(struct log_msg_ids src_level, const char *fmt, ...)
} }
void log_hexdump_sync(struct log_msg_ids src_level, const char *metadata, void log_hexdump_sync(struct log_msg_ids src_level, const char *metadata,
const u8_t *data, u32_t len) const void *data, u32_t len)
{ {
if (IS_ENABLED(CONFIG_LOG_FRONTEND)) { if (IS_ENABLED(CONFIG_LOG_FRONTEND)) {
log_frontend_hexdump(metadata, data, len, src_level); log_frontend_hexdump(metadata, (const u8_t *)data, len,
src_level);
} else { } else {
struct log_backend const *backend; struct log_backend const *backend;
u32_t timestamp = timestamp_func(); u32_t timestamp = timestamp_func();
@ -441,9 +442,9 @@ void log_hexdump_sync(struct log_msg_ids src_level, const char *metadata,
backend = log_backend_get(i); backend = log_backend_get(i);
if (log_backend_is_active(backend)) { if (log_backend_is_active(backend)) {
log_backend_put_sync_hexdump(backend, src_level, log_backend_put_sync_hexdump(
timestamp, metadata, backend, src_level, timestamp, metadata,
data, len); (const u8_t *)data, len);
} }
} }
} }
@ -1089,7 +1090,7 @@ void z_vrfy_z_log_hexdump_from_user(u32_t src_level_val, const char *metadata,
#include <syscalls/z_log_hexdump_from_user_mrsh.c> #include <syscalls/z_log_hexdump_from_user_mrsh.c>
void log_hexdump_from_user(struct log_msg_ids src_level, const char *metadata, void log_hexdump_from_user(struct log_msg_ids src_level, const char *metadata,
const u8_t *data, u32_t len) const void *data, u32_t len)
{ {
union { union {
struct log_msg_ids structure; struct log_msg_ids structure;
@ -1098,7 +1099,8 @@ void log_hexdump_from_user(struct log_msg_ids src_level, const char *metadata,
__ASSERT_NO_MSG(sizeof(src_level) <= sizeof(u32_t)); __ASSERT_NO_MSG(sizeof(src_level) <= sizeof(u32_t));
src_level_union.structure = src_level; src_level_union.structure = src_level;
z_log_hexdump_from_user(src_level_union.value, metadata, data, len); z_log_hexdump_from_user(src_level_union.value, metadata,
(const u8_t *)data, len);
} }
#else #else
void z_impl_z_log_string_from_user(u32_t src_level_val, const char *str) void z_impl_z_log_string_from_user(u32_t src_level_val, const char *str)
@ -1139,7 +1141,7 @@ void log_generic_from_user(struct log_msg_ids src_level,
} }
void log_hexdump_from_user(struct log_msg_ids src_level, const char *metadata, void log_hexdump_from_user(struct log_msg_ids src_level, const char *metadata,
const u8_t *data, u32_t len) const void *data, u32_t len)
{ {
ARG_UNUSED(src_level); ARG_UNUSED(src_level);
ARG_UNUSED(metadata); ARG_UNUSED(metadata);

View file

@ -34,8 +34,9 @@ static void minimal_hexdump_line_print(const char *data, size_t length)
printk("\n"); printk("\n");
} }
void log_minimal_hexdump_print(int level, const char *data, size_t size) void log_minimal_hexdump_print(int level, const void *_data, size_t size)
{ {
const char *data = (const char *)_data;
while (size > 0) { while (size > 0) {
printk("%c: ", z_log_minimal_level_to_char(level)); printk("%c: ", z_log_minimal_level_to_char(level));
minimal_hexdump_line_print(data, size); minimal_hexdump_line_print(data, size);