[PATCH libaio 05/14] Use new symver function attribute to support LTO builds
authorGuillem Jover <guillem@hadrons.org>
Tue, 2 Nov 2021 21:37:32 +0000 (22:37 +0100)
committerGuillem Jover <guillem@debian.org>
Wed, 18 Jan 2023 00:35:12 +0000 (00:35 +0000)
From 3ec8be29fc945238788f1fc7f0d998b145a761c7 Mon Sep 17 00:00:00 2001
Origin: vendor
Forwarded: https://marc.info/?l=linux-aio&m=164999309520544

The LTO support cannot work properly when there are versioned symbols
via asm statements, as those are not seen by the compiler. Use the new
function attributes if supported instead of the asm statements.

We need to move the SYMVER calls after the function definitions
otherwise it will reference symbols not yet seen.

Signed-off-by: Guillem Jover <guillem@hadrons.org>
Gbp-Pq: Name 0005-Use-new-symver-function-attribute-to-support-LTO-bui.patch

src/compat-0_1.c
src/syscall.h

index 722e107444f533ba7ef50338af5e7cd0a8c76c4f..ac40fccdd6898db0a42d7606a1e7ba0fbda18fdb 100644 (file)
@@ -28,7 +28,6 @@
 
 
 /* ABI change.  Provide partial compatibility on this one for now. */
-SYMVER(compat0_1_io_cancel, io_cancel, 0.1);
 int compat0_1_io_cancel(io_context_t ctx, struct iocb *iocb)
 {
        struct io_event event;
@@ -36,8 +35,8 @@ int compat0_1_io_cancel(io_context_t ctx, struct iocb *iocb)
        /* FIXME: the old ABI would return the event on the completion queue */
        return io_cancel(ctx, iocb, &event);
 }
+SYMVER(compat0_1_io_cancel, io_cancel, 0.1);
 
-SYMVER(compat0_1_io_queue_wait, io_queue_wait, 0.1);
 int compat0_1_io_queue_wait(io_context_t ctx, struct timespec *when)
 {
        struct timespec timeout;
@@ -45,10 +44,10 @@ int compat0_1_io_queue_wait(io_context_t ctx, struct timespec *when)
                timeout = *when;
        return io_getevents(ctx, 0, 0, NULL, when ? &timeout : NULL);
 }
+SYMVER(compat0_1_io_queue_wait, io_queue_wait, 0.1);
 
 
 /* ABI change.  Provide backwards compatibility for this one. */
-SYMVER(compat0_1_io_getevents, io_getevents, 0.1);
 int compat0_1_io_getevents(io_context_t ctx, long nr,
                       struct io_event *events,
                       const struct timespec *const_timeout)
@@ -59,4 +58,4 @@ int compat0_1_io_getevents(io_context_t ctx, long nr,
        return io_getevents(ctx, 1, nr, events,
                        const_timeout ? &timeout : NULL);
 }
-
+SYMVER(compat0_1_io_getevents, io_getevents, 0.1);
index f7ce979619a147331cdcab98ea37ac890ebb0f0e..59e0bb3003382831efaa25c07484511654c36f21 100644 (file)
@@ -2,14 +2,27 @@
 #include <unistd.h>
 #include <errno.h>
 
+#ifndef __has_attribute
+#define __has_attribute(x) 0
+#endif
+
 #define _SYMSTR(str)   #str
 #define SYMSTR(str)    _SYMSTR(str)
 
+#if __has_attribute(__symver__)
+#define SYMVER(compat_sym, orig_sym, ver_sym)  \
+       extern __typeof(compat_sym) compat_sym \
+         __attribute__((__symver__(SYMSTR(orig_sym) "@LIBAIO_" SYMSTR(ver_sym))))
+#define DEFSYMVER(compat_sym, orig_sym, ver_sym)       \
+       extern __typeof(compat_sym) compat_sym \
+         __attribute__((__symver__(SYMSTR(orig_sym) "@@LIBAIO_" SYMSTR(ver_sym))))
+#else
 #define SYMVER(compat_sym, orig_sym, ver_sym)  \
        __asm__(".symver " SYMSTR(compat_sym) "," SYMSTR(orig_sym) "@LIBAIO_" SYMSTR(ver_sym))
 
 #define DEFSYMVER(compat_sym, orig_sym, ver_sym)       \
        __asm__(".symver " SYMSTR(compat_sym) "," SYMSTR(orig_sym) "@@LIBAIO_" SYMSTR(ver_sym))
+#endif
 
 #if defined(__i386__)
 #include "syscall-i386.h"