On Tue, Mar 28, 2023 at 11:54 AM Tom Rini <tr...@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 <appu...@google.com> > Suggested-by: Andrew Pinski <pins...@gcc.gnu.org>
Suggested-by: Andrew Pinski <apin...@marvell.com> Other than that it looks good. Reviewed-by: Andrew Pinski <apin...@marvell.com> Thanks, Andrew Pinski > Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108915 > Signed-off-by: Tom Rini <tr...@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 >