@@ -79,49 +79,52 @@ template <typename T, typename U> struct argument_type<T(U)> {
7979 *
8080 * No C/C++ symbol is declared, this is type-dependent and must be done separately:
8181 *
82- * extern "C" FSTR::String myFlashData;
82+ * DECLARE_FSTR_IMPORT( FSTR::String, myFlashData) ;
8383 *
8484 * If the symbol is not referenced the content will be discarded by the linker.
85+ *
8586 */
8687// clang-format off
8788#define STR (x ) XSTR(x)
8889#define XSTR (x ) #x
8990#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 " );
91+ #define IMPORT_FSTR_DATA_SECTION (name ) \
92+ " .section .rodata\n " \
93+ " .def " STR(name) " ; .scl 2; .type 32; .endef\n "
9894#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");
95+ #define IMPORT_FSTR_DATA_SECTION (name ) \
96+ " .const_data\n " \
97+ " .globl " STR(name) " \n "
10698#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");
99+ #define IMPORT_FSTR_DATA_SECTION (name ) \
100+ " .section " ICACHE_RODATA_SECTION " ." STR(name) " \n " \
101+ " .type " STR(name) " , %object\n "
114102#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");
103+ #define IMPORT_FSTR_DATA_SECTION (name ) \
104+ " .section " ICACHE_RODATA_SECTION " ." STR(name) " \n " \
105+ " .type " STR(name) " , @object\n "
122106#endif
107+
108+ #define IMPORT_FSTR_DATA (name, file ) \
109+ __asm__ (IMPORT_FSTR_DATA_SECTION(name) \
110+ ".align 4\n" \
111+ STR(name) ":\n" \
112+ ".long " STR(name) "_end - " STR(name) " - 4\n" \
113+ ".incbin \"" file "\"\n" \
114+ STR(name) "_end:\n");
123115// clang-format on
124116
117+ /* *
118+ * @brief Declare a reference to an `IMPORT_FSTR_DATA` block
119+ *
120+ * When referencing inline assembler labels using `extern "C"` tells the compiler
121+ * not to mangle the name. However, doing that inside an anonymous namespace leads
122+ * to undefined behaviour and breaks with GCC 15.
123+ * Using an explicit `asm(label)` directive makes this unambiguous.
124+ * See https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html
125+ */
126+ #define DECLARE_FSTR_IMPORT (ObjectType, name ) extern const ObjectType name __asm__ (STR(name));
127+
125128namespace FSTR
126129{
127130/* *
0 commit comments