Hello toolchain people,
I created a patch on top of upstream binutils for a feature I need which should be universally useful as well. Now I have 3 questions for you:
1) Does it look sane enough?
2) If so, could you integrate it in the Linaro release?
3) Would you be willing to promote it upstream?
Comments appreciated.
Here's the patch:
----- >8 Subject: [PATCH] gas: introduce section name substitution support
When gas is invoked with --sectname-subst, the occurrence of %S in a section name will be substituted by the name of the current section. For example:
.macro exception_code .pushsection %S.exception [exception code here] .popsection .endm
.text [code] exception_code [...]
.section .init [init code] exception_code [...]
In the first exception_code invocation the .text.exception section is created while in the second invocation it is the .init.exception section that is created. This is useful e.g. to discriminate between anciliary sections that are tied to .init code and can be discarded at run time when initialization is over vs anciliary sections tied to .text sections that need to stay resident.
This would also allow for actually omitting __exit sections from the Linux kernel binary when modules are configured in even when exit marked code generates exception table entries.
Signed-off-by: Nicolas Pitre nico@linaro.org
diff --git a/gas/ChangeLog b/gas/ChangeLog index 57fc30a..0189bb2 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2015-06-03 Nicolas Pitre nico@linaro.org + + * as.c (show_usage): Document --sectname-subst. + (parse_args): Add --sectname-subst. + * as.h (flag_sectname_subst): New. + * config/obj-elf.c (obj_elf_section_name): Add %S substitution. + * doc/as.texinfo: Document it. + 2015-06-03 Matthew Wahab matthew.wahab@arm.com
* config/tc-arm.c (arm_archs): Add "armv8.1-a". diff --git a/gas/as.c b/gas/as.c index 2a8923f..fecfcd2 100644 --- a/gas/as.c +++ b/gas/as.c @@ -284,6 +284,8 @@ Options:\n\ fprintf (stream, _("\ --size-check=[error|warning]\n\ ELF .size directive check (default --size-check=error)\n")); + fprintf (stream, _("\ + --sectname-subst enable section name substitution sequences\n")); #endif fprintf (stream, _("\ -f skip whitespace and comment preprocessing\n")); @@ -447,6 +449,7 @@ parse_args (int * pargc, char *** pargv) OPTION_EXECSTACK, OPTION_NOEXECSTACK, OPTION_SIZE_CHECK, + OPTION_SECTNAME_SUBST, OPTION_ALTERNATE, OPTION_AL, OPTION_HASH_TABLE_SIZE, @@ -481,6 +484,7 @@ parse_args (int * pargc, char *** pargv) ,{"execstack", no_argument, NULL, OPTION_EXECSTACK} ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK} ,{"size-check", required_argument, NULL, OPTION_SIZE_CHECK} + ,{"sectname-subst", no_argument, NULL, OPTION_SECTNAME_SUBST} #endif ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL} ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF2} @@ -848,6 +852,10 @@ This program has absolutely no warranty.\n")); else as_fatal (_("Invalid --size-check= option: `%s'"), optarg); break; + + case OPTION_SECTNAME_SUBST: + flag_sectname_subst = 1; + break; #endif case 'Z': flag_always_generate_output = 1; diff --git a/gas/as.h b/gas/as.h index 6de319e..635b2c5 100644 --- a/gas/as.h +++ b/gas/as.h @@ -589,6 +589,9 @@ COMMON enum size_check_warning } flag_size_check; + +/* If section name substitution sequences should be honored */ +COMMON int flag_sectname_subst; #endif
#ifndef DOLLAR_AMBIGU diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 4d7a8a7..78dc6d9 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -917,6 +917,27 @@ obj_elf_section_name (void) name = (char *) xmalloc (end - input_line_pointer + 1); memcpy (name, input_line_pointer, end - input_line_pointer); name[end - input_line_pointer] = '\0'; + + while (flag_sectname_subst) + { + char *subst = strchr (name, '%'); + if (subst && subst[1] == 'S') + { + int oldlen = strlen (name); + int substlen = strlen (now_seg->name); + int newlen = oldlen - 2 + substlen; + char *newname = (char *) xmalloc (newlen + 1); + int headlen = subst - name; + memcpy (newname, name, headlen); + strcpy (newname + headlen, now_seg->name); + strcat (newname + headlen, subst + 2); + xfree (name); + name = newname; + } + else + break; + } + #ifdef tc_canonicalize_section_name name = tc_canonicalize_section_name (name); #endif diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 5710e1c..be13b6a 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -6259,6 +6259,36 @@ For ELF targets, the @code{.section} directive is used like this: .section @var{name} [, "@var{flags}"[, @@@var{type}[,@var{flag_specific_arguments}]]] @end smallexample
+@cindex --sectname-subst +If the @samp{--sectname-subst} command-line option is provided, the @var{name} +argument may contain a substitution sequence. Only @code{%S} is supported +at the moment, and substitutes the current section name. For example: + +@smallexample +.macro exception_code +.section %S.exception +[exception code here] +.previous +.endm + +.text +[code] +exception_code +[...] + +.section .init +[init code] +exception_code +[...] +@end smallexample + +The two @code{exception_code} invocations above would create the +@code{.text.exception} and @code{.init.exception} sections respectively. +This is useful e.g. to discriminate between anciliary sections that are +tied to setup code to be discarded after use from anciliary sections that +need to stay resident without having to define two @code{exception_code} +macros just for that purpose. + The optional @var{flags} argument is a quoted string which may contain any combination of the following characters: @table @code
Nicolas