aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2023-03-04 23:56:35 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2023-03-18 21:57:27 +0000
commite8f376e3c1874ccd14e148164d9695a93c575def (patch)
tree9fdfba47a1719d66e8535d5361670a5d659d8300 /src
parent904d58c208ab03f09f8d8e7184d49f42f6e16533 (diff)
downloadriscv-openocd-e8f376e3c1874ccd14e148164d9695a93c575def.zip
riscv-openocd-e8f376e3c1874ccd14e148164d9695a93c575def.tar.gz
riscv-openocd-e8f376e3c1874ccd14e148164d9695a93c575def.tar.bz2
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 <borneo.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/7519 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Diffstat (limited to 'src')
-rw-r--r--src/helper/Makefile.am3
-rw-r--r--src/helper/compiler.h44
-rw-r--r--src/helper/nvp.h6
3 files changed, 50 insertions, 3 deletions
diff --git a/src/helper/Makefile.am b/src/helper/Makefile.am
index e9c05cf..e0fa331 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 0000000..8f6c099
--- /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 125164e..14bd9b0 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 <helper/compiler.h>
+
/** 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);