[PATCH 2/2] linker_lists: Rework start/end macros to not rely on undefined behavior

Tom Rini trini at konsulko.com
Tue Mar 28 20:54:51 CEST 2023


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>
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