Skip to content

Commit 9e1db1a

Browse files
committed
Use asm("name") consistently for IMPORT_FSTR
All platforms support this approach. Using `extern "C"` within anonymous namespace is officially undefined behaviour, so may break in future updates. Underscores removed from assembler symbol names - this was only required on some platforms to accommodate `extern "C"`.
1 parent d5ab318 commit 9e1db1a

3 files changed

Lines changed: 35 additions & 36 deletions

File tree

src/include/FlashString/Object.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@
7878
*/
7979
#define IMPORT_FSTR_OBJECT(name, ObjectType, file) \
8080
IMPORT_FSTR_DATA(FSTR_DATA_NAME(name), file) \
81-
extern "C" __attribute__((visibility("hidden"))) const ObjectType ASM_LABEL(FSTR_DATA_NAME(name)); \
81+
extern __attribute__((visibility("hidden"))) const ObjectType ASM_LABEL(FSTR_DATA_NAME(name)); \
8282
DEFINE_FSTR_OBJREF(name, FSTR_DATA_NAME(name))
8383

8484
/**
8585
* @brief Like IMPORT_FSTR_OBJECT except reference is declared static constexpr
8686
*/
8787
#define IMPORT_FSTR_OBJECT_LOCAL(name, ObjectType, file) \
8888
IMPORT_FSTR_DATA(FSTR_DATA_NAME(name), file) \
89-
extern "C" __attribute__((visibility("hidden"))) const ObjectType ASM_LABEL(FSTR_DATA_NAME(name)); \
89+
extern __attribute__((visibility("hidden"))) const ObjectType ASM_LABEL(FSTR_DATA_NAME(name)); \
9090
static constexpr DEFINE_FSTR_OBJREF(name, FSTR_DATA_NAME(name))
9191

9292
namespace FSTR

src/include/FlashString/Utility.hpp

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -87,38 +87,38 @@ template <typename T, typename U> struct argument_type<T(U)> {
8787
#define STR(x) XSTR(x)
8888
#define XSTR(x) #x
8989
#ifdef __WIN32
90-
#define IMPORT_FSTR_DATA(name, file) \
91-
__asm__(".section .rodata\n" \
92-
".def _" STR(name) "; .scl 2; .type 32; .endef\n" \
93-
".align 4\n" \
94-
"_" STR(name) ":\n" \
95-
".long _" STR(name) "_end - _" STR(name) " - 4\n" \
96-
".incbin \"" file "\"\n" \
97-
"_" STR(name) "_end:\n");
90+
#define IMPORT_FSTR_DATA(name, file) \
91+
__asm__(".section .rodata\n" \
92+
".def " STR(name) "; .scl 2; .type 32; .endef\n" \
93+
".align 4\n" \
94+
STR(name) ":\n" \
95+
".long " STR(name) "_end - " STR(name) " - 4\n" \
96+
".incbin \"" file "\"\n" \
97+
STR(name) "_end:\n");
9898
#elif defined(__APPLE__)
99-
#define IMPORT_FSTR_DATA(name, file) \
100-
__asm__(".const_data\n" \
101-
".globl _" STR(name) "\n" \
102-
".align 4\n" "_" STR(name) ":\n" \
103-
".long _" STR(name) "_end - _" STR(name) " - 4\n" \
104-
".incbin \"" file "\"\n" \
105-
"_" STR(name) "_end:\n");
99+
#define IMPORT_FSTR_DATA(name, file) \
100+
__asm__(".const_data\n" \
101+
".globl " STR(name) "\n" \
102+
".align 4\n" STR(name) ":\n" \
103+
".long " STR(name) "_end - " STR(name) " - 4\n" \
104+
".incbin \"" file "\"\n" \
105+
STR(name) "_end:\n");
106106
#elif defined(__arm__)
107-
#define IMPORT_FSTR_DATA(name, file) \
108-
__asm__(".section " ICACHE_RODATA_SECTION "." STR(name) "\n" \
109-
".type " STR(name) ", %object\n" \
110-
".align 4\n" STR(name) ":\n" \
111-
".long _" STR(name) "_end - " STR(name) " - 4\n" \
112-
".incbin \"" file "\"\n" \
113-
"_" STR(name) "_end:\n");
107+
#define IMPORT_FSTR_DATA(name, file) \
108+
__asm__(".section " ICACHE_RODATA_SECTION "." STR(name) "\n" \
109+
".type " STR(name) ", %object\n" \
110+
".align 4\n" STR(name) ":\n" \
111+
".long " STR(name) "_end - " STR(name) " - 4\n" \
112+
".incbin \"" file "\"\n" \
113+
STR(name) "_end:\n");
114114
#else
115-
#define IMPORT_FSTR_DATA(name, file) \
116-
__asm__(".section " ICACHE_RODATA_SECTION "." STR(name) "\n" \
117-
".type " STR(name) ", @object\n" \
118-
".align 4\n" STR(name) ":\n" \
119-
".long _" STR(name) "_end - " STR(name) " - 4\n" \
120-
".incbin \"" file "\"\n" \
121-
"_" STR(name) "_end:\n");
115+
#define IMPORT_FSTR_DATA(name, file) \
116+
__asm__(".section " ICACHE_RODATA_SECTION "." STR(name) "\n" \
117+
".type " STR(name) ", @object\n" \
118+
".align 4\n" STR(name) ":\n" \
119+
".long " STR(name) "_end - " STR(name) " - 4\n" \
120+
".incbin \"" file "\"\n" \
121+
STR(name) "_end:\n");
122122
#endif
123123
// clang-format on
124124

src/include/FlashString/config.hpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@
4949

5050
/*
5151
When referencing inline assembler labels using `extern "C"` tells the compiler not to
52-
mangle the name. GCC 15 ignores this so requires an additional `asm(label)` directive.
52+
mangle the name. However, doing that inside an anonymous namespace leads to undefined
53+
behaviour and breaks with GCC 15.
54+
Using an explicit `asm(label)` directive makes this unambiguous.
55+
See https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html
5356
*/
54-
#if defined(__clang__) || defined(__WIN32)
55-
#define ASM_LABEL(name) name
56-
#else
5757
#define ASM_LABEL(name) name asm(STR(name))
58-
#endif

0 commit comments

Comments
 (0)