From 3decd3b1f0cbb3a035f72e9eade42279d0507b89 Mon Sep 17 00:00:00 2001 From: Gerhard Sittig Date: Tue, 3 Nov 2020 18:25:18 +0100 Subject: [PATCH] driver_list: unbreak list of builtin drivers for LTO configurations Check for the availability of the "no_reorder" linker attribute, which keeps the list of builtin drivers in shape on LTO enabled build setups. Keep backwards compatibility for platforms which lack support for the "no_reorder" attribute. Phrase the implementation such that other keywords as well as user provided external specs are possible. This resolves bug #1433. Submitted-By: Ivan Mironov --- src/driver_list_start.c | 1 + src/driver_list_stop.c | 1 + src/libsigrok-internal.h | 10 ++++++++++ 3 files changed, 12 insertions(+) diff --git a/src/driver_list_start.c b/src/driver_list_start.c index 7b6c7755..535e3312 100644 --- a/src/driver_list_start.c +++ b/src/driver_list_start.c @@ -28,6 +28,7 @@ */ SR_PRIV const struct sr_dev_driver *sr_driver_list__start[] + SR_DRIVER_LIST_NOREORDER __attribute__((section (SR_DRIVER_LIST_SECTION), used, aligned(sizeof(struct sr_dev_driver *)))) = { NULL /* Dummy item, as zero length arrays are not allowed by C99 */ }; diff --git a/src/driver_list_stop.c b/src/driver_list_stop.c index ff2c51de..eefda055 100644 --- a/src/driver_list_stop.c +++ b/src/driver_list_stop.c @@ -28,6 +28,7 @@ */ SR_PRIV const struct sr_dev_driver *sr_driver_list__stop[] + SR_DRIVER_LIST_NOREORDER __attribute__((section (SR_DRIVER_LIST_SECTION), used, aligned(sizeof(struct sr_dev_driver *)))) = { NULL /* Dummy item, as zero length arrays are not allowed by C99 */ }; diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 98d1631e..19fcccfd 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -967,6 +967,15 @@ static inline void write_dblle_inc(uint8_t **p, double x) #define SR_DRIVER_LIST_SECTION "__sr_driver_list" #endif +#if !defined SR_DRIVER_LIST_NOREORDER && defined __has_attribute +#if __has_attribute(no_reorder) +#define SR_DRIVER_LIST_NOREORDER __attribute__((no_reorder)) +#endif +#endif +#if !defined SR_DRIVER_LIST_NOREORDER +#define SR_DRIVER_LIST_NOREORDER /* EMPTY */ +#endif + /** * Register a list of hardware drivers. * @@ -996,6 +1005,7 @@ static inline void write_dblle_inc(uint8_t **p, double x) */ #define SR_REGISTER_DEV_DRIVER_LIST(name, ...) \ static const struct sr_dev_driver *name[] \ + SR_DRIVER_LIST_NOREORDER \ __attribute__((section (SR_DRIVER_LIST_SECTION), used, \ aligned(sizeof(struct sr_dev_driver *)))) \ = { \ -- 2.30.2