This is an automated email from Gerrit.

"Antonio Borneo <borneo.anto...@gmail.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/7519

-- gerrit

commit 289e0c538176fd8ce27931fe28d5e75bdc82d43f
Author: Antonio Borneo <borneo.anto...@gmail.com>
Date:   Sat Mar 4 23:56:35 2023 +0100

    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.anto...@gmail.com>

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..08d50384f1
--- /dev/null
+++ b/src/helper/compiler.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+/*
+ * This file contains compiler specific workarounds to handle different
+ * compilers and different compiler versions.
+ * Most is already present in libc's sys/cdefs.h, so use it if available.
+ * Other is inspired by Linux's include/linux/compiler_attributes.h
+ */
+
+#ifndef OPENOCD_HELPER_COMPILER_H
+#define OPENOCD_HELPER_COMPILER_H
+
+/* to include sys/cdefs.h */
+#include <features.h>
+
+/*
+ * __has_attribute is supported on gcc >= 5, clang >= 2.9 and icc >= 17.
+ * In the meantime, to support gcc < 5, we implement __has_attribute
+ * by hand.
+ */
+#ifndef __has_attribute
+# define __has_attribute(x) __gcc4_has_attribute_##x
+# define __gcc4_has_attribute___returns_nonnull__              0
+# define __gcc4_has_attribute___nonnull__                              1
+#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 <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);

-- 

Reply via email to