diff options
| author | Tom Rini <[email protected]> | 2023-03-28 14:54:51 -0400 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2023-04-04 12:24:29 -0400 |
| commit | d0e3378ad73ed80d4baab95e2c3aaa0a18ae7747 (patch) | |
| tree | ea6d2e931dc7abc39ebba345d72c5892371bf9ad /include | |
| parent | 65fa29d6c39235a859f185465b1363814ffcc26c (diff) | |
linker_lists: Rework start/end macros to not rely on undefined behavior
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 <[email protected]>
Suggested-by: Andrew Pinski <[email protected]>
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108915
Signed-off-by: Tom Rini <[email protected]>
Reviewed-by: Simon Glass <[email protected]>
Reviewed-by: Andrew Pinski <[email protected]>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linker_lists.h | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/include/linker_lists.h b/include/linker_lists.h index d3da9d44e85..f9a2ee0c762 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__ */ |
