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

Reply via email to