On 15/01/2026 07:27, Jan Beulich wrote:
On 14.01.2026 18:49, Matthieu Longo wrote:
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).
If already we add such a parameter (see below as to whether to), let's not
limit its potential purpose in the description. I.e. drop "visibility".
+ 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)
\
Is the extra parameter really needed? Can't the use site of the macro ...
EXPORT void \
... append (or prepend?) it to what it passes for EXPORT? That may then also
allow use of this argument with e.g. MSVC's __declspec() (don't know whether
nowadays this is still of interest; it certainly used to be at some point).
Jan
If I rephrase your comments above, just to make sure I understood you well,
1. We should use the same macro parameter to pass the visibility attribute. If
we want to pass more attributes, it should work as well.
- If this is correct, I think that the parameter EXPORT should be renamed to
ATTRIBUTES.
- If we only plan to pass the scope attribute, i.e. extern, static,
__declspec(dllexport), __attribute__ ((__visibility__ ("hidden"))), then SCOPE
would be a better name.
2. In the binutils codebase, ATTRIBUTE_HIDDEN is normally placed at the end of
the function declaration.
However, Visual Studio has some constraints on __declspec.
https://learn.microsoft.com/en-us/cpp/cpp/declspec?view=msvc-170
The __declspec keywords should be placed at the beginning of a simple declaration.
The compiler ignores, without warning, any __declspec keywords placed after * or
& and in front of the variable identifier in a declaration.
Consequently, you would prefer that we move the parameter to the beginning of
the function declaration to make it potentialluy compatible with VS.
Is my understanding correct ?
Matthieu