
This shall eliminate the need for bubblesorting of commands at runtime. Every command definition structure is now put into it's own subsection of section .u_boot_cmd, that is .u_boot_cmd.<name> . These are then put into .u_boot_cmd by linker and lastly, linker uses SORT() over these subsections to make proper order on them. This shall eliminate some runtime overhead.
Signed-off-by: Marek Vasut marex@denx.de Cc: Wolfgang Denk wd@denx.de Cc: Mike Frysinger vapier@gentoo.org --- arch/arm/cpu/u-boot.lds | 2 +- common/cmd_help.c | 2 +- include/command.h | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-)
******** * NOTE * THIS PATCH IS CRAZY ********
Further notes: - This is only compile-tested with gcc-4.7 (debian 4.7.1-5, binutils 2.22) - This patch affects only arm926t, obviously to make it proper, every linkerscript would have to be adjusted - I'm not sure at all the macro logic is correct, please check - Can this crash on *BSD or with older linker/cpp? - Please don't rip me limb to limb ;-)
diff --git a/arch/arm/cpu/u-boot.lds b/arch/arm/cpu/u-boot.lds index e49ca0c..c39193b 100644 --- a/arch/arm/cpu/u-boot.lds +++ b/arch/arm/cpu/u-boot.lds @@ -50,7 +50,7 @@ SECTIONS
. = .; __u_boot_cmd_start = .; - .u_boot_cmd : { *(.u_boot_cmd) } + .u_boot_cmd : { *(SORT(.u_boot_cmd.*)) } __u_boot_cmd_end = .;
. = ALIGN(4); diff --git a/common/cmd_help.c b/common/cmd_help.c index 8c8178e..5d778f5 100644 --- a/common/cmd_help.c +++ b/common/cmd_help.c @@ -41,7 +41,7 @@ U_BOOT_CMD( );
/* This does not use the U_BOOT_CMD macro as ? can't be used in symbol names */ -cmd_tbl_t __u_boot_cmd_question_mark Struct_Section = { +cmd_tbl_t __u_boot_cmd_question_mark Struct_Section(?) = { "?", CONFIG_SYS_MAXARGS, 1, do_help, "alias for 'help'", #ifdef CONFIG_SYS_LONGHELP diff --git a/include/command.h b/include/command.h index 6e1bdc2..42b4c6a 100644 --- a/include/command.h +++ b/include/command.h @@ -149,8 +149,11 @@ int cmd_process(int flag, int argc, char * const argv[], #define CMD_FLAG_REPEAT 0x0001 /* repeat last command */ #define CMD_FLAG_BOOTD 0x0002 /* command is from bootd */
-#define Struct_Section __attribute__((unused, section(".u_boot_cmd"), \ - aligned(4))) +#define __sectstr(__cmd,__name) .__cmd.__name +#define sectstr(type, __name) __stringify(__sectstr(type, __name)) + +#define Struct_Section(__name) \ + __attribute__((unused, section(sectstr(u_boot_cmd, __name)), aligned(4)))
#ifdef CONFIG_AUTO_COMPLETE # define _CMD_COMPLETE(x) x, @@ -170,7 +173,7 @@ int cmd_process(int flag, int argc, char * const argv[], U_BOOT_CMD_MKENT_COMPLETE(name,maxargs,rep,cmd,usage,help,NULL)
#define U_BOOT_CMD_COMPLETE(name,maxargs,rep,cmd,usage,help,comp) \ - cmd_tbl_t __u_boot_cmd_##name Struct_Section = \ + cmd_tbl_t __u_boot_cmd_##name Struct_Section(name) = \ U_BOOT_CMD_MKENT_COMPLETE(name,maxargs,rep,cmd,usage,help,comp)
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \