[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