[PATCH v1] libiberty: add visibility attribute parameter to doubly linked list macros

Matthieu Longo matthieu.longo@arm.com
Wed Jan 14 17:49:08 GMT 2026


The prototype declaration macros currently do not allow functions to be
excluded from the dynamic symbol table. There is an on-going effort in
the bfd library in binutils to reduce the size of the dynamic symbol
table by applying a visibility attribute to non-public symbols declared
in headers.

The doubly linked list utilities are used in the bfd library, and
therefore need to support passing such a visibility attribute to their
function prototypes. This patch extends the existing DECL macros with
a new ATTRIBUTE parameter.
---
 include/doubly-linked-list.h                  | 89 ++++++++++---------
 libiberty/testsuite/test-doubly-linked-list.c |  4 +-
 2 files changed, 50 insertions(+), 43 deletions(-)

diff --git a/include/doubly-linked-list.h b/include/doubly-linked-list.h
index 0108af73f96..c9db5220240 100644
--- a/include/doubly-linked-list.h
+++ b/include/doubly-linked-list.h
@@ -30,9 +30,11 @@
 
    Each function (### is a placeholder for method name) has a macro for:
    (1) its invocation LINKED_LIST_###(LTYPE).
-   (2) its prototype LINKED_LIST_DECL_###(A, A2, scope). To add in a header
-       file, or a source file for forward declaration. 'scope' should be set
-       respectively to 'extern', or 'static'.
+   (2) its prototype LINKED_LIST_DECL_###(A, A2, scope, visibility attribute).
+       To add in a header file, or a source file for forward declaration.
+       'scope' should be set respectively to 'extern', or 'static'.
+       'visibility attribute' can be used to set a visibility attribute to
+       remove the symbol from the dynamic symbol table.
    (3) its definition LINKED_LIST_DEFN_###(A, A2, scope). To add in a source
        file with the 'scope' set respectively to nothing, or 'static' depending
        on (2).
@@ -68,9 +70,9 @@
    Precondition: prev and next of new_ must be NULL.  */
 #define LINKED_LIST_APPEND(LTYPE)		LTYPE##_append
 
-#define LINKED_LIST_DECL_APPEND(LWRAPPERTYPE, LTYPE, EXPORT)		\
+#define LINKED_LIST_DECL_APPEND(LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE)	\
   EXPORT void								\
-  LTYPE##_append (LWRAPPERTYPE *wrapper, LTYPE *new_)
+  LTYPE##_append (LWRAPPERTYPE *wrapper, LTYPE *new_) ATTRIBUTE
 
 #define LINKED_LIST_DEFN_APPEND(LWRAPPERTYPE, LTYPE, EXPORT)		\
 EXPORT void								\
@@ -91,9 +93,9 @@ LTYPE##_append (LWRAPPERTYPE *wrapper, LTYPE *new_)			\
    Precondition: prev and next of new_ must be NULL.  */
 #define LINKED_LIST_PREPEND(LTYPE)		LTYPE##_prepend
 
-#define LINKED_LIST_DECL_PREPEND(LWRAPPERTYPE, LTYPE, EXPORT)		\
+#define LINKED_LIST_DECL_PREPEND(LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE)\
   EXPORT void								\
-  LTYPE##_prepend (LWRAPPERTYPE *wrapper, LTYPE *new_)
+  LTYPE##_prepend (LWRAPPERTYPE *wrapper, LTYPE *new_) ATTRIBUTE
 
 #define LINKED_LIST_DEFN_PREPEND(LWRAPPERTYPE, LTYPE, EXPORT)		\
 EXPORT void								\
@@ -115,11 +117,12 @@ LTYPE##_prepend (LWRAPPERTYPE *wrapper, LTYPE *new_)			\
    If where == first, the insertion is equivalent to a prepend.  */
 #define LINKED_LIST_INSERT_BEFORE(LTYPE)	LTYPE##_insert_before
 
-#define LINKED_LIST_DECL_INSERT_BEFORE(LWRAPPERTYPE, LTYPE, EXPORT)	\
+#define LINKED_LIST_DECL_INSERT_BEFORE(LWRAPPERTYPE, LTYPE, EXPORT,	\
+				       ATTRIBUTE)			\
   EXPORT void								\
   LTYPE##_insert_before (LWRAPPERTYPE *wrapper,				\
 			 LTYPE *new_,					\
-			 LTYPE *where)
+			 LTYPE *where) ATTRIBUTE
 
 #define LINKED_LIST_DEFN_INSERT_BEFORE(LWRAPPERTYPE, LTYPE, EXPORT)	\
 EXPORT void								\
@@ -144,9 +147,10 @@ LTYPE##_insert_before (LWRAPPERTYPE *wrapper,				\
 /* Pop the first node of the list.  */
 #define LINKED_LIST_POP_FRONT(LTYPE)		LTYPE##_pop_front
 
-#define LINKED_LIST_DECL_POP_FRONT(LWRAPPERTYPE, LTYPE, EXPORT)		\
+#define LINKED_LIST_DECL_POP_FRONT(LWRAPPERTYPE, LTYPE, EXPORT,		\
+				   ATTRIBUTE)				\
   EXPORT LTYPE *							\
-  LTYPE##_pop_front (LWRAPPERTYPE *wrapper)
+  LTYPE##_pop_front (LWRAPPERTYPE *wrapper) ATTRIBUTE
 
 #define LINKED_LIST_DEFN_POP_FRONT(LWRAPPERTYPE, LTYPE, EXPORT)		\
 EXPORT LTYPE *								\
@@ -172,9 +176,10 @@ LTYPE##_pop_front (LWRAPPERTYPE *wrapper)				\
 /* Pop the last node of the list.  */
 #define LINKED_LIST_POP_BACK(LTYPE)		LTYPE##_pop_back
 
-#define LINKED_LIST_DECL_POP_BACK(LWRAPPERTYPE, LTYPE, EXPORT)		\
+#define LINKED_LIST_DECL_POP_BACK(LWRAPPERTYPE, LTYPE, EXPORT,		\
+				  ATTRIBUTE)				\
   EXPORT LTYPE *							\
-  LTYPE##_pop_back (LWRAPPERTYPE *wrapper)
+  LTYPE##_pop_back (LWRAPPERTYPE *wrapper) ATTRIBUTE
 
 #define LINKED_LIST_DEFN_POP_BACK(LWRAPPERTYPE, LTYPE, EXPORT)		\
 EXPORT LTYPE *								\
@@ -201,9 +206,9 @@ LTYPE##_pop_back (LWRAPPERTYPE *wrapper)				\
    node.  */
 #define LINKED_LIST_REMOVE(LTYPE)		LTYPE##_remove
 
-#define LINKED_LIST_DECL_REMOVE(LWRAPPERTYPE, LTYPE, EXPORT)		\
+#define LINKED_LIST_DECL_REMOVE(LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE)	\
   EXPORT LTYPE *							\
-  LTYPE##_remove (LWRAPPERTYPE *wrapper, LTYPE *node)
+  LTYPE##_remove (LWRAPPERTYPE *wrapper, LTYPE *node) ATTRIBUTE
 
 #define LINKED_LIST_DEFN_REMOVE(LWRAPPERTYPE, LTYPE, EXPORT)		\
 EXPORT LTYPE *								\
@@ -232,9 +237,9 @@ LTYPE##_remove (LWRAPPERTYPE *wrapper, LTYPE *node)			\
 /* Generic swap.  */
 #define LINKED_LIST_SWAP(LTYPE)			LTYPE##_swap
 
-#define LINKED_LIST_DECL_SWAP(LWRAPPERTYPE, LTYPE, EXPORT)		\
+#define LINKED_LIST_DECL_SWAP(LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE)	\
   EXPORT void								\
-  LTYPE##_swap (LWRAPPERTYPE *wrapper, LTYPE *node1, LTYPE *node2)
+  LTYPE##_swap (LWRAPPERTYPE *wrapper, LTYPE *node1, LTYPE *node2) ATTRIBUTE
 
 /* Swap two nodes in a list.  */
 #define LINKED_LIST_DEFN_SWAP(LWRAPPERTYPE, LTYPE, EXPORT)		\
@@ -278,23 +283,24 @@ LTYPE##_swap (LWRAPPERTYPE *wrapper, LTYPE *node1, LTYPE *node2)	\
 
 /* Note: all the mutative operations below also update the data in the wrapper,
    i.e. first, last and size.  */
-#define LINKED_LIST_MUTATIVE_OPS_PROTOTYPE(LWRAPPERTYPE, LTYPE, EXPORT)	\
-  LINKED_LIST_DECL_APPEND(LWRAPPERTYPE, LTYPE, EXPORT);			\
-  LINKED_LIST_DECL_PREPEND(LWRAPPERTYPE, LTYPE, EXPORT);		\
-  LINKED_LIST_DECL_INSERT_BEFORE(LWRAPPERTYPE, LTYPE, EXPORT);		\
-  LINKED_LIST_DECL_POP_FRONT(LWRAPPERTYPE, LTYPE, EXPORT);		\
-  LINKED_LIST_DECL_POP_BACK(LWRAPPERTYPE, LTYPE, EXPORT);		\
-  LINKED_LIST_DECL_REMOVE(LWRAPPERTYPE, LTYPE, EXPORT);			\
-  LINKED_LIST_DECL_SWAP(LWRAPPERTYPE, LTYPE, EXPORT)
+#define LINKED_LIST_MUTATIVE_OPS_PROTOTYPE(LWRAPPERTYPE, LTYPE,		\
+					   EXPORT, ATTRIBUTE)		\
+  LINKED_LIST_DECL_APPEND (LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE);	\
+  LINKED_LIST_DECL_PREPEND (LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE);	\
+  LINKED_LIST_DECL_INSERT_BEFORE (LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE);\
+  LINKED_LIST_DECL_POP_FRONT (LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE);	\
+  LINKED_LIST_DECL_POP_BACK (LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE);	\
+  LINKED_LIST_DECL_REMOVE (LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE);	\
+  LINKED_LIST_DECL_SWAP (LWRAPPERTYPE, LTYPE, EXPORT, ATTRIBUTE)
 
 #define LINKED_LIST_MUTATIVE_OPS_DECL(LWRAPPERTYPE, LTYPE, EXPORT)	\
-  LINKED_LIST_DEFN_APPEND(LWRAPPERTYPE, LTYPE, EXPORT)			\
-  LINKED_LIST_DEFN_PREPEND(LWRAPPERTYPE, LTYPE, EXPORT)			\
-  LINKED_LIST_DEFN_INSERT_BEFORE(LWRAPPERTYPE, LTYPE, EXPORT)		\
-  LINKED_LIST_DEFN_POP_FRONT(LWRAPPERTYPE, LTYPE, EXPORT)		\
-  LINKED_LIST_DEFN_POP_BACK(LWRAPPERTYPE, LTYPE, EXPORT)		\
-  LINKED_LIST_DEFN_REMOVE(LWRAPPERTYPE, LTYPE, EXPORT)			\
-  LINKED_LIST_DEFN_SWAP(LWRAPPERTYPE, LTYPE, EXPORT)
+  LINKED_LIST_DEFN_APPEND (LWRAPPERTYPE, LTYPE, EXPORT)			\
+  LINKED_LIST_DEFN_PREPEND (LWRAPPERTYPE, LTYPE, EXPORT)		\
+  LINKED_LIST_DEFN_INSERT_BEFORE (LWRAPPERTYPE, LTYPE, EXPORT)		\
+  LINKED_LIST_DEFN_POP_FRONT (LWRAPPERTYPE, LTYPE, EXPORT)		\
+  LINKED_LIST_DEFN_POP_BACK (LWRAPPERTYPE, LTYPE, EXPORT)		\
+  LINKED_LIST_DEFN_REMOVE (LWRAPPERTYPE, LTYPE, EXPORT)			\
+  LINKED_LIST_DEFN_SWAP (LWRAPPERTYPE, LTYPE, EXPORT)
 
 
 /* Sorting.  */
@@ -303,15 +309,16 @@ LTYPE##_swap (LWRAPPERTYPE *wrapper, LTYPE *node1, LTYPE *node2)	\
 
 #define LINKED_LIST_MERGE_SORT(LTYPE)	LTYPE##_merge_sort
 
-#define LINKED_LIST_MERGE_SORT_PROTOTYPE_(LTYPE, EXPORT)		\
+#define LINKED_LIST_MERGE_SORT_PROTOTYPE_(LTYPE, EXPORT, ATTRIBUTE)	\
   EXPORT LTYPE *							\
   LTYPE##_merge_sort_ (LTYPE *node,					\
-		       int (*fn_cmp) (const LTYPE *, const LTYPE *))
+		       int (*fn_cmp) (const LTYPE *, const LTYPE *)) ATTRIBUTE
 
-#define LINKED_LIST_MERGE_SORT_PROTOTYPE(LWRAPPERTYPE, LTYPE, EXPORT)	\
+#define LINKED_LIST_MERGE_SORT_PROTOTYPE(LWRAPPERTYPE, LTYPE, EXPORT,	\
+					 ATTRIBUTE)			\
   EXPORT void								\
   LTYPE##_merge_sort (LWRAPPERTYPE *wrapper,				\
-		      int (*fn_cmp) (const LTYPE *, const LTYPE *))
+		      int (*fn_cmp) (const LTYPE *, const LTYPE *)) ATTRIBUTE
 
 /* Note: all the functions and macros below starting with "_" should be
    considered private.  */
@@ -438,10 +445,10 @@ LTYPE##_merge_sort (LWRAPPERTYPE *wrapper,				\
 }
 
 #define LINKED_LIST_MERGE_SORT_DECL(LWRAPPERTYPE, LTYPE, EXPORT)	\
-  _MERGE_SORT_IMPL_COMPUTE_TURTLE(LTYPE)				\
-  _MERGE_SORT_IMPL_OUT_APPEND(LTYPE)					\
-  _MERGE_SORT_IMPL_MERGE(LTYPE)						\
-  _MERGE_SORT_DEFN_SORT(LTYPE, EXPORT)					\
-  _MERGE_SORT_DEFN_WRAPPER_SORT(LWRAPPERTYPE, LTYPE, EXPORT)
+  _MERGE_SORT_IMPL_COMPUTE_TURTLE (LTYPE)				\
+  _MERGE_SORT_IMPL_OUT_APPEND (LTYPE)					\
+  _MERGE_SORT_IMPL_MERGE (LTYPE)					\
+  _MERGE_SORT_DEFN_SORT (LTYPE, EXPORT)					\
+  _MERGE_SORT_DEFN_WRAPPER_SORT (LWRAPPERTYPE, LTYPE, EXPORT)
 
 #endif /* _DOUBLY_LINKED_LIST_H */
diff --git a/libiberty/testsuite/test-doubly-linked-list.c b/libiberty/testsuite/test-doubly-linked-list.c
index 93fe19a27ae..547306f9478 100644
--- a/libiberty/testsuite/test-doubly-linked-list.c
+++ b/libiberty/testsuite/test-doubly-linked-list.c
@@ -49,8 +49,8 @@ int compare_nodes (const ListNodeType *n1, const ListNodeType *n2)
     return 1;
 }
 
-LINKED_LIST_MUTATIVE_OPS_PROTOTYPE (LinkedListWrapperType, ListNodeType, static);
-LINKED_LIST_MERGE_SORT_PROTOTYPE (LinkedListWrapperType, ListNodeType, static);
+LINKED_LIST_MUTATIVE_OPS_PROTOTYPE (LinkedListWrapperType, ListNodeType, static,);
+LINKED_LIST_MERGE_SORT_PROTOTYPE (LinkedListWrapperType, ListNodeType, static,);
 
 LINKED_LIST_MUTATIVE_OPS_DECL (LinkedListWrapperType, ListNodeType, static)
 LINKED_LIST_MERGE_SORT_DECL (LinkedListWrapperType, ListNodeType, static)
-- 
2.52.0



More information about the Gcc-patches mailing list