From 152b10dc306f2236af62d83ca5fd61f6f3129f06 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Thu, 18 Aug 2016 22:09:09 +0200 Subject: [PATCH 01/14] WIP: cross file arrays --- core/include/xfa.h | 114 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 core/include/xfa.h diff --git a/core/include/xfa.h b/core/include/xfa.h new file mode 100644 index 000000000000..480a61d3ada2 --- /dev/null +++ b/core/include/xfa.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2016 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup core_util + * @brief Cross File Arrays + * @{ + * + * This macro, in combination with an entry in the linker scripts, allows the + * definition of constant arrays to be spread over multiple C compilation + * units. These arrays are called "cross-file arrays" or short xfa. + * + * + * + * @file + * @author Kaspar Schleiser + */ + +#ifndef XFA_H +#define XFA_H + +#if defined(__arm__) +#define XFA_EXTRA volatile +#else +#define XFA_EXTRA +#endif + +/** + * @brief helper macro for other XFA_* macros + * + * @internal + */ +#define _XFA(type, name, prio) __attribute__((used)) \ + __attribute__((section(".xfa." #name "." #prio))) \ + XFA_EXTRA \ + __attribute__((aligned(__alignof__(type)))) + +/** + * @brief Define a cross-file array + * + * This macro defines the symbols necessary to use XFA_START() and XFA_END(). + * It needs to be part of one single compilation unit. + * + * @param[in] type name of the cross-file array + * @param[in] name name of the cross-file array + */ +#define XFA_INIT(type, name) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wpedantic\"") \ + const _XFA(type, name, 0_) XFA_EXTRA type name [0] = {}; \ + const _XFA(type, name, 9_) type name ## _end [0] = {}; \ + _Pragma("GCC diagnostic pop") \ + extern unsigned __xfa_dummy + +/** + * @brief Declare an external cross-file array + * + * This macro defines the symbols necessary to use XFA_START() and XFA_END(). + * Think of this as XFA_INIT() but with "extern" keyword. + * It is supposed to be used in compilation units where the cross file array is + * being accessed, but not defined using XFA_INIT. + * + * @param[in] type name of the cross-file array + * @param[in] name name of the cross-file array + */ +#define XFA_USE(type, name) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wpedantic\"") \ + extern const XFA_EXTRA type name [0]; \ + extern const type name ## _end [0]; \ + _Pragma("GCC diagnostic pop") \ + extern unsigned __xfa_dummy + +/** + * @brief Define variable in cross-file array + * + * Variables will end up sorted by prio, then by variable name. + * + * Use instead of type in variable definition, e.g.: + * + * XFA(driver_params, 0, driver_params_t) _onboard = { .pin=42 }; + * + * @param[in] name name of the xfa + * @param[in] prio priority within the xfa + */ +#define XFA(xfa_name, prio, type) _XFA(type, xfa_name, 5_ ##prio) const type + +/** + * @brief Add a pointer to cross-file array + * + * Pointers will end up sorted by prio, then by name. + * + * @param[in] xfa_name name of the xfa + * @param[in] prio priority within the xfa + * @param[in] name symbol name + * @param[in] entry pointer variable to add to xfa + */ +#define XFA_ADD_PTR(xfa_name, prio, name, entry) \ + _XFA(typeof(entry), xfa_name, 5_ ##prio) \ + const typeof(entry) xfa_name ## _ ## prio ## _ ## name = entry + +/** + * @brief Calculate number of entries in cross-file array + * + */ +#define XFA_LEN(type, name) (((char*)name ## _end - (char*)name)/sizeof(type)) + +/** @} */ +#endif /* XFA_H */ From 632bef4b2e88fb82c4feaa01bf5867112f42f332 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Thu, 29 Sep 2016 13:24:17 +0200 Subject: [PATCH 02/14] WIP: xfa test --- tests/xfa/Makefile | 14 ++++++++++++++ tests/xfa/main.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ tests/xfa/xfatest.h | 9 +++++++++ tests/xfa/xfatest1.c | 6 ++++++ tests/xfa/xfatest2.c | 6 ++++++ 5 files changed, 79 insertions(+) create mode 100644 tests/xfa/Makefile create mode 100644 tests/xfa/main.c create mode 100644 tests/xfa/xfatest.h create mode 100644 tests/xfa/xfatest1.c create mode 100644 tests/xfa/xfatest2.c diff --git a/tests/xfa/Makefile b/tests/xfa/Makefile new file mode 100644 index 000000000000..c80d2768ec0f --- /dev/null +++ b/tests/xfa/Makefile @@ -0,0 +1,14 @@ +# name of your application +APPLICATION = xfa + +# If no BOARD is found in the environment, use this default: +BOARD ?= native + +# This has to be the absolute path to the RIOT base directory: +RIOTBASE ?= $(CURDIR)/../.. + +# Change this to 0 show compiler invocation lines by default: +QUIET ?= 1 + +#LINKFLAGS += -Wl,-Txfa.ld -Wl,-verbose +include $(RIOTBASE)/Makefile.include diff --git a/tests/xfa/main.c b/tests/xfa/main.c new file mode 100644 index 000000000000..7f98fda88177 --- /dev/null +++ b/tests/xfa/main.c @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2015 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup test + * @{ + * + * @file + * @brief cross file array (XFA) test application + * + * @author Kaspar Schleiser + * + * @} + */ + +#include +#include + +#include "xfa.h" + +#include "xfatest.h" + +XFA_INIT(xfatest_t, xfatest); + +/* hack to force inclusion of otherwise unused compilation units */ +extern int hack1; +extern int hack2; + +int main(void) +{ + unsigned n = XFA_LEN(xfatest_t, xfatest); + for (unsigned i = 0; i < n; i++) { + printf("%u %s\n", xfatest[i].val, xfatest[i].text); + } + + hack1 = hack2; + + return 0; +} diff --git a/tests/xfa/xfatest.h b/tests/xfa/xfatest.h new file mode 100644 index 000000000000..1511a80e93e3 --- /dev/null +++ b/tests/xfa/xfatest.h @@ -0,0 +1,9 @@ +#ifndef XFATEST_H +#define XFATEST_H + +typedef struct { + unsigned val; + const char *text; +} xfatest_t; + +#endif /* XFATEST_H */ diff --git a/tests/xfa/xfatest1.c b/tests/xfa/xfatest1.c new file mode 100644 index 000000000000..e3cef3062617 --- /dev/null +++ b/tests/xfa/xfatest1.c @@ -0,0 +1,6 @@ +#include "xfa.h" +#include "xfatest.h" + +XFA(xfatest, 0, xfatest_t) _xfatest1 = { .val = 1, .text = "xfatest1" }; + +int hack1; diff --git a/tests/xfa/xfatest2.c b/tests/xfa/xfatest2.c new file mode 100644 index 000000000000..d3d61b147648 --- /dev/null +++ b/tests/xfa/xfatest2.c @@ -0,0 +1,6 @@ +#include "xfa.h" +#include "xfatest.h" + +XFA(xfatest, 0, xfatest_t) _xfatest2 = { .val = 2, .text = "xfatest2" }; + +int hack2; From 431ffe26f91bd3a8ea4bf53a8ae47cf1888ae016 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Thu, 22 Sep 2016 13:08:14 +0200 Subject: [PATCH 03/14] cpu: cortexm_common: add xfa section to linkerscript --- cpu/cortexm_common/ldscripts/cortexm_base.ld | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cpu/cortexm_common/ldscripts/cortexm_base.ld b/cpu/cortexm_common/ldscripts/cortexm_base.ld index f97a9babde04..849ba81b21ac 100644 --- a/cpu/cortexm_common/ldscripts/cortexm_base.ld +++ b/cpu/cortexm_common/ldscripts/cortexm_base.ld @@ -83,6 +83,10 @@ SECTIONS KEEP (*(SORT(.dtors.*))) KEEP (*crtend.o(.dtors)) + . = ALIGN(4); + KEEP (*(SORT(.xfa.*))) + KEEP (*(.xfa)) + . = ALIGN(4); _efixed = .; /* End of text section */ } > rom From 70af8c81b498b28802095eed9fb47675ca3d8f10 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Thu, 22 Sep 2016 13:08:49 +0200 Subject: [PATCH 04/14] cpu: atmega: add ldscript for atmega2560, add xfa --- cpu/atmega2560/ldscripts/atmega2560.ld | 265 +++++++++++++++++++++++++ cpu/atmega_common/Makefile.include | 4 +- 2 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 cpu/atmega2560/ldscripts/atmega2560.ld diff --git a/cpu/atmega2560/ldscripts/atmega2560.ld b/cpu/atmega2560/ldscripts/atmega2560.ld new file mode 100644 index 000000000000..d70156f2cec7 --- /dev/null +++ b/cpu/atmega2560/ldscripts/atmega2560.ld @@ -0,0 +1,265 @@ +/* Script for -n: mix text and data on same page */ +/* Copyright (C) 2014-2016 Free Software Foundation, Inc. + Copying and distribution of this script, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. */ +OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") +OUTPUT_ARCH(avr:6) +__TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : 1024K; +__DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : 0xfe00; +__EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : 64K; +__FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : 1K; +__LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : 1K; +__SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : 1K; +__USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : 1K; +MEMORY +{ + text (rx) : ORIGIN = 0, LENGTH = __TEXT_REGION_LENGTH__ + data (rw!x) : ORIGIN = 0x800200, LENGTH = __DATA_REGION_LENGTH__ + eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__ + fuse (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__ + lock (rw!x) : ORIGIN = 0x830000, LENGTH = __LOCK_REGION_LENGTH__ + signature (rw!x) : ORIGIN = 0x840000, LENGTH = __SIGNATURE_REGION_LENGTH__ + user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__ +} +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + /* Internal text space or external memory. */ + .text : + { + *(.vectors) + KEEP(*(.vectors)) + /* For data that needs to reside in the lower 64k of progmem. */ + *(.progmem.gcc*) + /* PR 13812: Placing the trampolines here gives a better chance + that they will be in range of the code that uses them. */ + . = ALIGN(2); + __trampolines_start = . ; + /* The jump trampolines for the 16-bit limited relocs will reside here. */ + *(.trampolines) + *(.trampolines*) + __trampolines_end = . ; + /* avr-libc expects these data to reside in lower 64K. */ + *libprintf_flt.a:*(.progmem.data) + *libc.a:*(.progmem.data) + *(.progmem*) + . = ALIGN(2); + /* For future tablejump instruction arrays for 3 byte pc devices. + We don't relax jump/call instructions within these sections. */ + *(.jumptables) + *(.jumptables*) + /* For code that needs to reside in the lower 128k progmem. */ + *(.lowtext) + *(.lowtext*) + __ctors_start = . ; + *(.ctors) + __ctors_end = . ; + __dtors_start = . ; + *(.dtors) + __dtors_end = . ; + KEEP(SORT(*)(.ctors)) + KEEP(SORT(*)(.dtors)) + /* From this point on, we don't bother about wether the insns are + below or above the 16 bits boundary. */ + *(.init0) /* Start here after reset. */ + KEEP (*(.init0)) + *(.init1) + KEEP (*(.init1)) + *(.init2) /* Clear __zero_reg__, set up stack pointer. */ + KEEP (*(.init2)) + *(.init3) + KEEP (*(.init3)) + *(.init4) /* Initialize data and BSS. */ + KEEP (*(.init4)) + *(.init5) + KEEP (*(.init5)) + *(.init6) /* C++ constructors. */ + KEEP (*(.init6)) + *(.init7) + KEEP (*(.init7)) + *(.init8) + KEEP (*(.init8)) + *(.init9) /* Call main(). */ + KEEP (*(.init9)) + *(.text) + . = ALIGN(2); + *(.text.*) + . = ALIGN(2); + *(.fini9) /* _exit() starts here. */ + KEEP (*(.fini9)) + *(.fini8) + KEEP (*(.fini8)) + *(.fini7) + KEEP (*(.fini7)) + *(.fini6) /* C++ destructors. */ + KEEP (*(.fini6)) + *(.fini5) + KEEP (*(.fini5)) + *(.fini4) + KEEP (*(.fini4)) + *(.fini3) + KEEP (*(.fini3)) + *(.fini2) + KEEP (*(.fini2)) + *(.fini1) + KEEP (*(.fini1)) + *(.fini0) /* Infinite loop after program termination. */ + KEEP (*(.fini0)) + + _etext = . ; + } > text + .data : + { + PROVIDE (__data_start = .) ; + *(.data) + *(.data*) + *(.rodata) /* We need to include .rodata here if gcc is used */ + *(.rodata*) /* with -fdata-sections. */ + *(.gnu.linkonce.d*) + + . = ALIGN(2); + KEEP (*(SORT(.xfa.*))) + KEEP (*(.xfa)) + + . = ALIGN(2); + _edata = . ; + PROVIDE (__data_end = .) ; + } > data AT> text + .bss ADDR(.data) + SIZEOF (.data) : AT (ADDR (.bss)) + { + PROVIDE (__bss_start = .) ; + *(.bss) + *(.bss*) + *(COMMON) + PROVIDE (__bss_end = .) ; + } > data + __data_load_start = LOADADDR(.data); + __data_load_end = __data_load_start + SIZEOF(.data); + /* Global data not cleared after reset. */ + .noinit ADDR(.bss) + SIZEOF (.bss) : AT (ADDR (.noinit)) + { + PROVIDE (__noinit_start = .) ; + *(.noinit*) + PROVIDE (__noinit_end = .) ; + _end = . ; + PROVIDE (__heap_start = .) ; + } > data + .eeprom : + { + /* See .data above... */ + KEEP(*(.eeprom*)) + __eeprom_end = . ; + } > eeprom + .fuse : + { + KEEP(*(.fuse)) + KEEP(*(.lfuse)) + KEEP(*(.hfuse)) + KEEP(*(.efuse)) + } > fuse + .lock : + { + KEEP(*(.lock*)) + } > lock + .signature : + { + KEEP(*(.signature*)) + } > signature + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .note.gnu.build-id : { *(.note.gnu.build-id) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* DWARF 3 */ + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + /* DWARF Extension. */ + .debug_macro 0 : { *(.debug_macro) } +} + diff --git a/cpu/atmega_common/Makefile.include b/cpu/atmega_common/Makefile.include index 23fc0413a19c..8099cfe5fd18 100644 --- a/cpu/atmega_common/Makefile.include +++ b/cpu/atmega_common/Makefile.include @@ -8,7 +8,9 @@ export CFLAGS_OPT ?= -Os export CFLAGS += $(CFLAGS_CPU) $(CFLAGS_LINK) $(CFLAGS_DBG) $(CFLAGS_OPT) export ASFLAGS += $(CFLAGS_CPU) $(CFLAGS_DBG) -export LINKFLAGS += $(CFLAGS_CPU) $(CFLAGS_DBG) $(CFLAGS_OPT) -static -lgcc -e reset_handler -Wl,--gc-sections + +LINKER_SCRIPT := -T${RIOTBASE}/cpu/${CPU}/ldscripts/${CPU}.ld +export LINKFLAGS += $(CFLAGS_CPU) $(CFLAGS_DBG) $(CFLAGS_OPT) ${LINKER_SCRIPT} -static -lgcc -e reset_handler -Wl,--gc-sections # export the peripheral drivers to be linked into the final binary export USEMODULE += atmega_common_periph From 1910a6e69d1803149d1a268a43d11094748e90a9 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Thu, 22 Sep 2016 13:09:58 +0200 Subject: [PATCH 05/14] cpu: native: add xfa ld script --- cpu/native/Makefile.include | 2 ++ cpu/native/ldscripts/xfa.ld | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 cpu/native/ldscripts/xfa.ld diff --git a/cpu/native/Makefile.include b/cpu/native/Makefile.include index 58c603eff570..066c868f293c 100644 --- a/cpu/native/Makefile.include +++ b/cpu/native/Makefile.include @@ -8,6 +8,8 @@ endif USEMODULE += periph USEMODULE += periph_uart +LINKFLAGS += -T$(RIOTCPU)/native/ldscripts/xfa.ld + ifeq ($(shell uname -s),Darwin) export CFLAGS += -D_XOPEN_SOURCE=600 -D_DARWIN_C_SOURCE endif diff --git a/cpu/native/ldscripts/xfa.ld b/cpu/native/ldscripts/xfa.ld new file mode 100644 index 000000000000..17e507b72c7f --- /dev/null +++ b/cpu/native/ldscripts/xfa.ld @@ -0,0 +1,9 @@ +SECTIONS +{ + .xfa : + { + KEEP (*(SORT(.xfa.*))) + } +} + +INSERT AFTER .init; From f2b14c6432a53abd822e67a2c08735bfd8d1b86a Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Tue, 29 Aug 2017 13:19:36 +0200 Subject: [PATCH 06/14] fixup! WIP: cross file arrays --- core/include/xfa.h | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/core/include/xfa.h b/core/include/xfa.h index 480a61d3ada2..98eb21e9fa2c 100644 --- a/core/include/xfa.h +++ b/core/include/xfa.h @@ -24,21 +24,13 @@ #ifndef XFA_H #define XFA_H -#if defined(__arm__) -#define XFA_EXTRA volatile -#else -#define XFA_EXTRA -#endif - /** * @brief helper macro for other XFA_* macros * * @internal */ #define _XFA(type, name, prio) __attribute__((used)) \ - __attribute__((section(".xfa." #name "." #prio))) \ - XFA_EXTRA \ - __attribute__((aligned(__alignof__(type)))) + __attribute__((section(".xfa." #name "." #prio))) /** * @brief Define a cross-file array @@ -52,7 +44,7 @@ #define XFA_INIT(type, name) \ _Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic ignored \"-Wpedantic\"") \ - const _XFA(type, name, 0_) XFA_EXTRA type name [0] = {}; \ + const _XFA(type, name, 0_) type name [0] = {}; \ const _XFA(type, name, 9_) type name ## _end [0] = {}; \ _Pragma("GCC diagnostic pop") \ extern unsigned __xfa_dummy @@ -71,7 +63,7 @@ #define XFA_USE(type, name) \ _Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic ignored \"-Wpedantic\"") \ - extern const XFA_EXTRA type name [0]; \ + extern const type name [0]; \ extern const type name ## _end [0]; \ _Pragma("GCC diagnostic pop") \ extern unsigned __xfa_dummy From e54a70cdc1aa597353b29b8846e8a060880d13b6 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Tue, 29 Aug 2017 13:20:36 +0200 Subject: [PATCH 07/14] fixup! WIP: xfa test --- tests/xfa/Makefile | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/tests/xfa/Makefile b/tests/xfa/Makefile index c80d2768ec0f..abe5a68a5500 100644 --- a/tests/xfa/Makefile +++ b/tests/xfa/Makefile @@ -1,14 +1,5 @@ # name of your application APPLICATION = xfa +include ../Makefile.tests_common -# If no BOARD is found in the environment, use this default: -BOARD ?= native - -# This has to be the absolute path to the RIOT base directory: -RIOTBASE ?= $(CURDIR)/../.. - -# Change this to 0 show compiler invocation lines by default: -QUIET ?= 1 - -#LINKFLAGS += -Wl,-Txfa.ld -Wl,-verbose include $(RIOTBASE)/Makefile.include From 1c3b604e699d9573e0f9ae7e457b26d860449f92 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Tue, 29 Aug 2017 20:55:47 +0200 Subject: [PATCH 08/14] fixup! fixup! WIP: cross file arrays --- core/include/xfa.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/include/xfa.h b/core/include/xfa.h index 98eb21e9fa2c..39a58a9bd426 100644 --- a/core/include/xfa.h +++ b/core/include/xfa.h @@ -29,7 +29,7 @@ * * @internal */ -#define _XFA(type, name, prio) __attribute__((used)) \ +#define _XFA(name, prio) __attribute__((used)) \ __attribute__((section(".xfa." #name "." #prio))) /** @@ -44,8 +44,8 @@ #define XFA_INIT(type, name) \ _Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic ignored \"-Wpedantic\"") \ - const _XFA(type, name, 0_) type name [0] = {}; \ - const _XFA(type, name, 9_) type name ## _end [0] = {}; \ + const _XFA(name, 0_) type name [0] = {}; \ + const _XFA(name, 9_) type name ## _end [0] = {}; \ _Pragma("GCC diagnostic pop") \ extern unsigned __xfa_dummy @@ -80,7 +80,7 @@ * @param[in] name name of the xfa * @param[in] prio priority within the xfa */ -#define XFA(xfa_name, prio, type) _XFA(type, xfa_name, 5_ ##prio) const type +#define XFA(xfa_name, prio) _XFA(xfa_name, 5_ ##prio) /** * @brief Add a pointer to cross-file array @@ -93,7 +93,7 @@ * @param[in] entry pointer variable to add to xfa */ #define XFA_ADD_PTR(xfa_name, prio, name, entry) \ - _XFA(typeof(entry), xfa_name, 5_ ##prio) \ + _XFA(xfa_name, 5_ ##prio) \ const typeof(entry) xfa_name ## _ ## prio ## _ ## name = entry /** From 9544864538e04eca9e8fd9b1ecc23a355f400248 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Tue, 29 Aug 2017 20:55:47 +0200 Subject: [PATCH 09/14] fixup! WIP: xfa test --- tests/xfa/xfatest1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/xfa/xfatest1.c b/tests/xfa/xfatest1.c index e3cef3062617..5c92085cf04b 100644 --- a/tests/xfa/xfatest1.c +++ b/tests/xfa/xfatest1.c @@ -1,6 +1,6 @@ #include "xfa.h" #include "xfatest.h" -XFA(xfatest, 0, xfatest_t) _xfatest1 = { .val = 1, .text = "xfatest1" }; +XFA(xfatest, 0) xfatest_t _xfatest1 = { .val = 1, .text = "xfatest1" }; int hack1; From 00834c4d10e1a6f848abca67949a5a138e591f58 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Tue, 29 Aug 2017 20:55:47 +0200 Subject: [PATCH 10/14] fixup! WIP: xfa test --- tests/xfa/xfatest2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/xfa/xfatest2.c b/tests/xfa/xfatest2.c index d3d61b147648..a7378a3457c7 100644 --- a/tests/xfa/xfatest2.c +++ b/tests/xfa/xfatest2.c @@ -1,6 +1,6 @@ #include "xfa.h" #include "xfatest.h" -XFA(xfatest, 0, xfatest_t) _xfatest2 = { .val = 2, .text = "xfatest2" }; +XFA(xfatest, 0) xfatest_t _xfatest2 = { .val = 2, .text = "xfatest2" }; int hack2; From 461ac43cb0bd070e975b2be2efd204bea6d8cbd3 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Sat, 2 Sep 2017 00:09:13 +0200 Subject: [PATCH 11/14] fixup! fixup! fixup! WIP: cross file arrays --- core/include/xfa.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/include/xfa.h b/core/include/xfa.h index 39a58a9bd426..dea6f8771cec 100644 --- a/core/include/xfa.h +++ b/core/include/xfa.h @@ -29,8 +29,7 @@ * * @internal */ -#define _XFA(name, prio) __attribute__((used)) \ - __attribute__((section(".xfa." #name "." #prio))) +#define _XFA(name, prio) __attribute__((used, section(".xfa." #name "." #prio))) /** * @brief Define a cross-file array From d95e3ea9778e401faeb37b42d6b0148f686ef7d6 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Sat, 2 Sep 2017 00:12:04 +0200 Subject: [PATCH 12/14] fixup! fixup! fixup! fixup! WIP: cross file arrays --- core/include/xfa.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/include/xfa.h b/core/include/xfa.h index dea6f8771cec..947b846d2bf2 100644 --- a/core/include/xfa.h +++ b/core/include/xfa.h @@ -74,7 +74,7 @@ * * Use instead of type in variable definition, e.g.: * - * XFA(driver_params, 0, driver_params_t) _onboard = { .pin=42 }; + * XFA(driver_params, 0) driver_params_t _onboard = { .pin=42 }; * * @param[in] name name of the xfa * @param[in] prio priority within the xfa From b6fd406f92457e88c1f4ad0082d0eb0ed5458c60 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Sat, 2 Sep 2017 00:31:53 +0200 Subject: [PATCH 13/14] fixup! fixup! fixup! fixup! fixup! WIP: cross file arrays --- core/include/xfa.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/include/xfa.h b/core/include/xfa.h index 947b846d2bf2..041eb19a6ded 100644 --- a/core/include/xfa.h +++ b/core/include/xfa.h @@ -70,9 +70,9 @@ /** * @brief Define variable in cross-file array * - * Variables will end up sorted by prio, then by variable name. + * Variables will end up sorted by prio. * - * Use instead of type in variable definition, e.g.: + * Add this to the type in a variable definition, e.g.: * * XFA(driver_params, 0) driver_params_t _onboard = { .pin=42 }; * @@ -84,7 +84,7 @@ /** * @brief Add a pointer to cross-file array * - * Pointers will end up sorted by prio, then by name. + * Pointers will end up sorted by prio. * * @param[in] xfa_name name of the xfa * @param[in] prio priority within the xfa From eb33172c7958504d65695524e90af9313035b57d Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Wed, 18 Oct 2017 14:04:13 +0200 Subject: [PATCH 14/14] fixup! fixup! fixup! fixup! fixup! fixup! WIP: cross file arrays --- core/include/xfa.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/include/xfa.h b/core/include/xfa.h index 041eb19a6ded..aad6729dbe79 100644 --- a/core/include/xfa.h +++ b/core/include/xfa.h @@ -60,12 +60,8 @@ * @param[in] name name of the cross-file array */ #define XFA_USE(type, name) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wpedantic\"") \ extern const type name [0]; \ - extern const type name ## _end [0]; \ - _Pragma("GCC diagnostic pop") \ - extern unsigned __xfa_dummy + extern const type name ## _end [0]; /** * @brief Define variable in cross-file array