[PATCH 2/2] linker_lists: Rework start/end macros to not rely on undefined behavior
Andrew Pinski
pinskia at gcc.gnu.org
Wed Mar 29 22:52:04 CEST 2023
On Tue, Mar 28, 2023 at 11:54 AM Tom Rini <trini at konsulko.com> wrote:
>
> Per the GCC bug listed below, the way we do linker lists is relying on
> undefined behavior that seems to work in gcc, but doesn't always work in
> clang. Andrew suggests rewriting our start/end macros in a different way
> (as implemented here, from what he said in comment 1) to avoid these
> problems.
>
> Reported-by: AdityaK <appujee at google.com>
> Suggested-by: Andrew Pinski <pinskia at gcc.gnu.org>
Suggested-by: Andrew Pinski <apinski at marvell.com>
Other than that it looks good.
Reviewed-by: Andrew Pinski <apinski at marvell.com>
Thanks,
Andrew Pinski
> Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108915
> Signed-off-by: Tom Rini <trini at konsulko.com>
> ---
> Andrew, please feel free to reply with any further tags you want here, I
> wasn't exactly sure of the best way to attribute this to you. Thanks!
> ---
> include/linker_lists.h | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/include/linker_lists.h b/include/linker_lists.h
> index d3da9d44e853..f9a2ee0c762a 100644
> --- a/include/linker_lists.h
> +++ b/include/linker_lists.h
> @@ -127,7 +127,9 @@
> static char start[0] __aligned(CONFIG_LINKER_LIST_ALIGN) \
> __attribute__((unused)) \
> __section("__u_boot_list_2_"#_list"_1"); \
> - (_type *)&start; \
> + _type * tmp = (_type *)&start; \
> + asm("":"+r"(tmp)); \
> + tmp; \
> })
>
> /**
> @@ -153,7 +155,9 @@
> ({ \
> static char end[0] __aligned(4) __attribute__((unused)) \
> __section("__u_boot_list_2_"#_list"_3"); \
> - (_type *)&end; \
> + _type * tmp = (_type *)&end; \
> + asm("":"+r"(tmp)); \
> + tmp; \
> })
> /**
> * ll_entry_count() - Return the number of elements in linker-generated array
> @@ -247,7 +251,9 @@
> ({ \
> static char start[0] __aligned(4) __attribute__((unused)) \
> __section("__u_boot_list_1"); \
> - (_type *)&start; \
> + _type * tmp = (_type *)&start; \
> + asm("":"+r"(tmp)); \
> + tmp; \
> })
>
> /**
> @@ -270,7 +276,9 @@
> ({ \
> static char end[0] __aligned(4) __attribute__((unused)) \
> __section("__u_boot_list_3"); \
> - (_type *)&end; \
> + _type * tmp = (_type *)&end; \
> + asm("":"+r"(tmp)); \
> + tmp; \
> })
>
> #endif /* __ASSEMBLY__ */
> --
> 2.34.1
>
More information about the U-Boot
mailing list