diff options
-rw-r--r-- | bfd/ChangeLog | 14 | ||||
-rw-r--r-- | bfd/elf32-xtensa.c | 62 | ||||
-rw-r--r-- | gas/ChangeLog | 11 | ||||
-rw-r--r-- | gas/config/tc-xtensa.c | 22 |
4 files changed, 98 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b36cdab..f373b8b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2018-06-04 Volodymyr Arbatov <arbatov@cadence.com> + + * elf32-xtensa.c (elf32xtensa_separate_props): New global + variable. + (xtensa_add_names): New function. + (xtensa_property_section_name): Add new parameter + separate_sections, use it to choose property section name. + (xtensa_get_separate_property_section): New function. + (xtensa_get_property_section): Invoke + xtensa_get_separate_property_section to get individual property + section if it exists, common property section otherwise. + (xtensa_make_property_section): Pass elf32xtensa_separate_props + to xtensa_property_section_name. + 2018-06-04 H.J. Lu <hongjiu.lu@intel.com> PR binutils/23146 diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index c12b2f5..db3c8f4 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -154,6 +154,11 @@ static bfd_boolean relaxing_section = FALSE; int elf32xtensa_no_literal_movement = 1; +/* Place property records for a section into individual property section + with xt.prop. prefix. */ + +bfd_boolean elf32xtensa_separate_props = FALSE; + /* Rename one of the generic section flags to better document how it is used here. */ /* Whether relocations have been processed. */ @@ -10987,10 +10992,30 @@ match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf) } +static char * +xtensa_add_names (const char *base, const char *suffix) +{ + if (suffix) + { + size_t base_len = strlen (base); + size_t suffix_len = strlen (suffix); + char *str = bfd_malloc (base_len + suffix_len + 1); + + memcpy (str, base, base_len); + memcpy (str + base_len, suffix, suffix_len + 1); + return str; + } + else + { + return strdup (base); + } +} + static int linkonce_len = sizeof (".gnu.linkonce.") - 1; static char * -xtensa_property_section_name (asection *sec, const char *base_name) +xtensa_property_section_name (asection *sec, const char *base_name, + bfd_boolean separate_sections) { const char *suffix, *group_name; char *prop_sec_name; @@ -11001,11 +11026,7 @@ xtensa_property_section_name (asection *sec, const char *base_name) suffix = strrchr (sec->name, '.'); if (suffix == sec->name) suffix = 0; - prop_sec_name = (char *) bfd_malloc (strlen (base_name) + 1 - + (suffix ? strlen (suffix) : 0)); - strcpy (prop_sec_name, base_name); - if (suffix) - strcat (prop_sec_name, suffix); + prop_sec_name = xtensa_add_names (base_name, suffix); } else if (strncmp (sec->name, ".gnu.linkonce.", linkonce_len) == 0) { @@ -11033,19 +11054,24 @@ xtensa_property_section_name (asection *sec, const char *base_name) strcat (prop_sec_name + linkonce_len, suffix); } else - prop_sec_name = strdup (base_name); + { + prop_sec_name = xtensa_add_names (base_name, + separate_sections ? sec->name : NULL); + } return prop_sec_name; } static asection * -xtensa_get_property_section (asection *sec, const char *base_name) +xtensa_get_separate_property_section (asection *sec, const char *base_name, + bfd_boolean separate_section) { char *prop_sec_name; asection *prop_sec; - prop_sec_name = xtensa_property_section_name (sec, base_name); + prop_sec_name = xtensa_property_section_name (sec, base_name, + separate_section); prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name, match_section_group, (void *) elf_group_name (sec)); @@ -11053,6 +11079,21 @@ xtensa_get_property_section (asection *sec, const char *base_name) return prop_sec; } +static asection * +xtensa_get_property_section (asection *sec, const char *base_name) +{ + asection *prop_sec; + + /* Try individual property section first. */ + prop_sec = xtensa_get_separate_property_section (sec, base_name, TRUE); + + /* Refer to a common property section if individual is not present. */ + if (!prop_sec) + prop_sec = xtensa_get_separate_property_section (sec, base_name, FALSE); + + return prop_sec; +} + asection * xtensa_make_property_section (asection *sec, const char *base_name) @@ -11061,7 +11102,8 @@ xtensa_make_property_section (asection *sec, const char *base_name) asection *prop_sec; /* Check if the section already exists. */ - prop_sec_name = xtensa_property_section_name (sec, base_name); + prop_sec_name = xtensa_property_section_name (sec, base_name, + elf32xtensa_separate_props); prop_sec = bfd_get_section_by_name_if (sec->owner, prop_sec_name, match_section_group, (void *) elf_group_name (sec)); diff --git a/gas/ChangeLog b/gas/ChangeLog index a448598..a3dc441 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2018-06-04 Volodymyr Arbatov <arbatov@cadence.com> + + * config/tc-xtensa.c (elf32xtensa_separate_props): New + declaration. + (option_separate_props, option_no_separate_props): New + enumeration constants. + (md_longopts): Add separate-prop-tables option. + (md_parse_option): Add cases for option_separate_props and + option_no_separate_props. + (md_show_usage): Add help for [no-]separate-prop-tables options. + 2018-06-01 H.J. Lu <hongjiu.lu@intel.com> * configure: Regenerated. diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 84211dd..d3a2f8e 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -637,6 +637,9 @@ static bfd_boolean enforce_three_byte_loop_align = FALSE; static bfd_boolean workaround_all_short_loops = FALSE; +/* Generate individual property section for every section. + This option is defined in BDF library. */ +extern bfd_boolean elf32xtensa_separate_props; static void xtensa_setup_hw_workarounds (int earliest, int latest) @@ -722,6 +725,9 @@ enum option_auto_litpools, option_no_auto_litpools, option_auto_litpool_limit, + + option_separate_props, + option_no_separate_props, }; const char *md_shortopts = ""; @@ -801,6 +807,8 @@ struct option md_longopts[] = { "no-auto-litpools", no_argument, NULL, option_no_auto_litpools }, { "auto-litpool-limit", required_argument, NULL, option_auto_litpool_limit }, + { "separate-prop-tables", no_argument, NULL, option_separate_props }, + { NULL, no_argument, NULL, 0 } }; @@ -1021,6 +1029,14 @@ md_parse_option (int c, const char *arg) return 1; } + case option_separate_props: + elf32xtensa_separate_props = TRUE; + return 1; + + case option_no_separate_props: + elf32xtensa_separate_props = FALSE; + return 1; + default: return 0; } @@ -1051,7 +1067,11 @@ Xtensa options:\n\ --auto-litpool-limit=<value>\n\ (range 100-10000) Maximum number of blocks of\n\ instructions to emit between literal pool\n\ - locations; implies --auto-litpools flag\n", stream); + locations; implies --auto-litpools flag\n\ + --[no-]separate-prop-tables\n\ + [Do not] place Xtensa property records into\n\ + individual property sections for each section.\n\ + Default is to generate single property section.\n", stream); } |