From: Antonio Borneo Date: Sat, 4 Mar 2023 22:56:35 +0000 (+0100) Subject: helper: add compiler.h to handle compiler specific workarounds X-Git-Url: https://review.openocd.org/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F19%2F7519%2F3;p=openocd.git helper: add compiler.h to handle compiler specific workarounds Not all compilers nor compiler versions supports the attributes used in OpenOCD code. Collect in a single file the workaround to handle them. Change-Id: I92d871337281169134ce8e40b2064591518be71f Signed-off-by: Antonio Borneo Reviewed-on: https://review.openocd.org/c/openocd/+/7519 Tested-by: jenkins Reviewed-by: Tomas Vanek --- diff --git a/src/helper/Makefile.am b/src/helper/Makefile.am index e9c05cfc5d..e0fa331ea2 100644 --- a/src/helper/Makefile.am +++ b/src/helper/Makefile.am @@ -34,7 +34,8 @@ noinst_LTLIBRARIES += %D%/libhelper.la %D%/jep106.h \ %D%/jep106.inc \ %D%/jim-nvp.h \ - %D%/nvp.h + %D%/nvp.h \ + %D%/compiler.h STARTUP_TCL_SRCS += %D%/startup.tcl EXTRA_DIST += \ diff --git a/src/helper/compiler.h b/src/helper/compiler.h new file mode 100644 index 0000000000..8f6c09950b --- /dev/null +++ b/src/helper/compiler.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/* + * This file contains compiler specific workarounds to handle different + * compilers and different compiler versions. + * Inspired by Linux's include/linux/compiler_attributes.h + * and file sys/cdefs.h in libc and newlib. + */ + +#ifndef OPENOCD_HELPER_COMPILER_H +#define OPENOCD_HELPER_COMPILER_H + +/* + * __has_attribute is supported on gcc >= 5, clang >= 2.9 and icc >= 17. + */ +#ifndef __has_attribute +# define __has_attribute(x) 0 +#endif + +/* + * The __returns_nonnull function attribute marks the return type of the function + * as always being non-null. + */ +#ifndef __returns_nonnull +# if __has_attribute(__returns_nonnull__) +# define __returns_nonnull __attribute__((__returns_nonnull__)) +# else +# define __returns_nonnull +# endif +#endif + +/* + * The __nonnull function attribute marks pointer parameters that + * must not be NULL. + */ +#ifndef __nonnull +# if __has_attribute(__nonnull__) +# define __nonnull(params) __attribute__ ((__nonnull__ params)) +# else +# define __nonnull(params) +# endif +#endif + +#endif /* OPENOCD_HELPER_COMPILER_H */ diff --git a/src/helper/nvp.h b/src/helper/nvp.h index 125164e4ed..14bd9b028c 100644 --- a/src/helper/nvp.h +++ b/src/helper/nvp.h @@ -20,6 +20,8 @@ #ifndef OPENOCD_HELPER_NVP_H #define OPENOCD_HELPER_NVP_H +#include + /** Name Value Pairs, aka: NVP * - Given a string - return the associated int. * - Given a number - return the associated string. @@ -65,9 +67,9 @@ struct command_invocation; /* Name Value Pairs Operations */ const struct nvp *nvp_name2value(const struct nvp *nvp_table, const char *name) - __attribute__((returns_nonnull, nonnull(1))); + __returns_nonnull __nonnull((1)); const struct nvp *nvp_value2name(const struct nvp *nvp_table, int v) - __attribute__((returns_nonnull, nonnull(1))); + __returns_nonnull __nonnull((1)); void nvp_unknown_command_print(struct command_invocation *cmd, const struct nvp *nvp, const char *param_name, const char *param_value);