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