From a4dd6c97bd5c7e2cc58f4d2a0b83145646f67cc7 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 2 Mar 2020 10:17:18 +1030 Subject: [PATCH] miscellaneous SEC_SMALL_DATA This patch arranges for symbols defined in .sdata and .sbss to be reported by nm with 'g' and 's' flags, for coff targets that support .sdata and .sbss. The assembler changes regarding SEC_SMALL_DATA are really just documentation. As far as I'm aware, this won't change any assembler output. bfd/ * coff-alpha.c (alpha_ecoff_le_vec): Add SEC_SMALL_DATA to applicable section flags. * coff-mips.c (mips_ecoff_le_vec, mips_ecoff_be_vec): Likewise. (mips_ecoff_bele_vec): Likewise. * coffcode.h (sec_to_styp_flags): Set SEC_SMALL_DATA for .sdata and .sbss sections. * ecoff.c (_bfd_ecoff_new_section_hook): Likewise. (_bfd_ecoff_styp_to_sec_flags): Likewise. gas/ * config/tc-m32r.c (md_begin): Set SEC_SMALL_DATA on .scommon section. * config/tc-mips.c (s_change_sec): Set SEC_SMALL_DATA for .sdata and .sbss sections. * config/tc-score.c: Delete !BFD_ASSEMBLER code throughout. (s3_s_change_sec): Set SEC_SMALL_DATA for .sbss section. (s3_s_score_lcomm): Likewise. * config/tc-score7.c: Similarly. * read.c (bss_alloc): Set SEC_SMALL_DATA for .sbss section. --- bfd/ChangeLog | 11 +++++++++++ bfd/coff-alpha.c | 3 ++- bfd/coff-mips.c | 9 ++++++--- bfd/coffcode.h | 12 +++++++++++- bfd/ecoff.c | 17 ++++++++++------- gas/ChangeLog | 11 +++++++++++ gas/config/tc-m32r.c | 4 +++- gas/config/tc-mips.c | 6 +++--- gas/config/tc-score.c | 28 +++++----------------------- gas/config/tc-score7.c | 39 +++++++++++---------------------------- gas/read.c | 2 +- 11 files changed, 74 insertions(+), 68 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 304efd06877..116b89397da 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2020-03-02 Alan Modra + + * coff-alpha.c (alpha_ecoff_le_vec): Add SEC_SMALL_DATA to + applicable section flags. + * coff-mips.c (mips_ecoff_le_vec, mips_ecoff_be_vec): Likewise. + (mips_ecoff_bele_vec): Likewise. + * coffcode.h (sec_to_styp_flags): Set SEC_SMALL_DATA for .sdata + and .sbss sections. + * ecoff.c (_bfd_ecoff_new_section_hook): Likewise. + (_bfd_ecoff_styp_to_sec_flags): Likewise. + 2020-03-02 Alan Modra * elf32-m32r.c (m32r_elf_section_flags): New function. diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c index 9a3ac089a67..821e5591a9a 100644 --- a/bfd/coff-alpha.c +++ b/bfd/coff-alpha.c @@ -2424,7 +2424,8 @@ const bfd_target alpha_ecoff_le_vec = | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), + (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE + | SEC_DATA | SEC_SMALL_DATA), 0, /* leading underscore */ ' ', /* ar_pad_char */ 15, /* ar_max_namelen */ diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c index 7c0a99194a4..772175325c9 100644 --- a/bfd/coff-mips.c +++ b/bfd/coff-mips.c @@ -1440,7 +1440,8 @@ const bfd_target mips_ecoff_le_vec = | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), + (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE + | SEC_DATA | SEC_SMALL_DATA), 0, /* leading underscore */ ' ', /* ar_pad_char */ 15, /* ar_max_namelen */ @@ -1497,7 +1498,8 @@ const bfd_target mips_ecoff_be_vec = | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), + (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE + | SEC_DATA | SEC_SMALL_DATA), 0, /* leading underscore */ ' ', /* ar_pad_char */ 15, /* ar_max_namelen */ @@ -1554,7 +1556,8 @@ const bfd_target mips_ecoff_bele_vec = | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), + (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE + | SEC_DATA | SEC_SMALL_DATA), 0, /* leading underscore */ ' ', /* ar_pad_char */ 15, /* ar_max_namelen */ diff --git a/bfd/coffcode.h b/bfd/coffcode.h index cd495dbe618..27158a061cc 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -717,7 +717,7 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags) #ifndef COFF_WITH_PE static bfd_boolean -styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED, +styp_to_sec_flags (bfd *abfd, void * hdr, const char *name, asection *section ATTRIBUTE_UNUSED, @@ -850,6 +850,11 @@ styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED, sec_flags = (SEC_LOAD | SEC_ALLOC); #endif /* STYP_SDATA */ + if ((bfd_applicable_section_flags (abfd) & SEC_SMALL_DATA) != 0 + && (CONST_STRNEQ (name, ".sbss") + || CONST_STRNEQ (name, ".sdata"))) + sec_flags |= SEC_SMALL_DATA; + #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE) /* As a GNU extension, if the name begins with .gnu.linkonce, we only link a single copy of the section. This is used to support @@ -1312,6 +1317,11 @@ styp_to_sec_flags (bfd *abfd, } } + if ((bfd_applicable_section_flags (abfd) & SEC_SMALL_DATA) != 0 + && (CONST_STRNEQ (name, ".sbss") + || CONST_STRNEQ (name, ".sdata"))) + sec_flags |= SEC_SMALL_DATA; + #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE) /* As a GNU extension, if the name begins with .gnu.linkonce, we only link a single copy of the section. This is used to support diff --git a/bfd/ecoff.c b/bfd/ecoff.c index 9e2efac8e3a..84eab993983 100644 --- a/bfd/ecoff.c +++ b/bfd/ecoff.c @@ -156,14 +156,14 @@ _bfd_ecoff_new_section_hook (bfd *abfd, asection *section) { _INIT, SEC_ALLOC | SEC_CODE | SEC_LOAD }, { _FINI, SEC_ALLOC | SEC_CODE | SEC_LOAD }, { _DATA, SEC_ALLOC | SEC_DATA | SEC_LOAD }, - { _SDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD }, + { _SDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_SMALL_DATA }, { _RDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, - { _LIT8, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, - { _LIT4, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, + { _LIT8, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY | SEC_SMALL_DATA}, + { _LIT4, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY | SEC_SMALL_DATA}, { _RCONST, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, { _PDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY}, { _BSS, SEC_ALLOC}, - { _SBSS, SEC_ALLOC}, + { _SBSS, SEC_ALLOC | SEC_SMALL_DATA}, /* An Irix 4 shared libary. */ { _LIB, SEC_COFF_SHARED_LIBRARY} }; @@ -412,16 +412,19 @@ _bfd_ecoff_styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED, || styp_flags == STYP_PDATA || styp_flags == STYP_RCONST) sec_flags |= SEC_READONLY; + if (styp_flags & STYP_SDATA) + sec_flags |= SEC_SMALL_DATA; } - else if ((styp_flags & STYP_BSS) - || (styp_flags & STYP_SBSS)) + else if (styp_flags & STYP_SBSS) + sec_flags |= SEC_ALLOC | SEC_SMALL_DATA; + else if (styp_flags & STYP_BSS) sec_flags |= SEC_ALLOC; else if ((styp_flags & STYP_INFO) || styp_flags == STYP_COMMENT) sec_flags |= SEC_NEVER_LOAD; else if ((styp_flags & STYP_LITA) || (styp_flags & STYP_LIT8) || (styp_flags & STYP_LIT4)) - sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY; + sec_flags |= SEC_DATA |SEC_SMALL_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY; else if (styp_flags & STYP_ECOFF_LIB) sec_flags |= SEC_COFF_SHARED_LIBRARY; else diff --git a/gas/ChangeLog b/gas/ChangeLog index d146fe321e7..f7011e25246 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2020-03-02 Alan Modra + + * config/tc-m32r.c (md_begin): Set SEC_SMALL_DATA on .scommon section. + * config/tc-mips.c (s_change_sec): Set SEC_SMALL_DATA for .sdata + and .sbss sections. + * config/tc-score.c: Delete !BFD_ASSEMBLER code throughout. + (s3_s_change_sec): Set SEC_SMALL_DATA for .sbss section. + (s3_s_score_lcomm): Likewise. + * config/tc-score7.c: Similarly. + * read.c (bss_alloc): Set SEC_SMALL_DATA for .sbss section. + 2020-02-28 YunQiang Su PR gas/25539 diff --git a/gas/config/tc-m32r.c b/gas/config/tc-m32r.c index bee0571e21f..824f67c124b 100644 --- a/gas/config/tc-m32r.c +++ b/gas/config/tc-m32r.c @@ -713,7 +713,8 @@ md_begin (void) /* This is copied from perform_an_assembly_pass. */ applicable = bfd_applicable_section_flags (stdoutput); - bfd_set_section_flags (sbss_section, applicable & SEC_ALLOC); + bfd_set_section_flags (sbss_section, + applicable & (SEC_ALLOC | SEC_SMALL_DATA)); subseg_set (seg, subseg); @@ -721,6 +722,7 @@ md_begin (void) but with the name .scommon. */ scom_section = *bfd_com_section_ptr; scom_section.name = ".scommon"; + scom_section.flags = SEC_IS_COMMON | SEC_SMALL_DATA; scom_section.output_section = & scom_section; scom_section.symbol = & scom_symbol; scom_section.symbol_ptr_ptr = & scom_section.symbol; diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index a00c69b6895..9f78b5a89ee 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -16365,8 +16365,8 @@ s_change_sec (int sec) case 's': seg = subseg_new (".sdata", (subsegT) get_absolute_expression ()); - bfd_set_section_flags (seg, - SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA); + bfd_set_section_flags (seg, (SEC_ALLOC | SEC_LOAD | SEC_RELOC + | SEC_DATA | SEC_SMALL_DATA)); if (strncmp (TARGET_OS, "elf", 3) != 0) record_alignment (seg, 4); demand_empty_rest_of_line (); @@ -16374,7 +16374,7 @@ s_change_sec (int sec) case 'B': seg = subseg_new (".sbss", (subsegT) get_absolute_expression ()); - bfd_set_section_flags (seg, SEC_ALLOC); + bfd_set_section_flags (seg, SEC_ALLOC | SEC_SMALL_DATA); if (strncmp (TARGET_OS, "elf", 3) != 0) record_alignment (seg, 4); demand_empty_rest_of_line (); diff --git a/gas/config/tc-score.c b/gas/config/tc-score.c index 8376d0beb4f..80c4cbfa4eb 100644 --- a/gas/config/tc-score.c +++ b/gas/config/tc-score.c @@ -5569,14 +5569,16 @@ s3_s_change_sec (int sec) { case 'r': seg = subseg_new (s3_RDATA_SECTION_NAME, (subsegT) get_absolute_expression ()); - bfd_set_section_flags (seg, (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_RELOC | SEC_DATA)); + bfd_set_section_flags (seg, (SEC_ALLOC | SEC_LOAD | SEC_READONLY + | SEC_RELOC | SEC_DATA)); if (strcmp (TARGET_OS, "elf") != 0) record_alignment (seg, 4); demand_empty_rest_of_line (); break; case 's': seg = subseg_new (".sdata", (subsegT) get_absolute_expression ()); - bfd_set_section_flags (seg, SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA); + bfd_set_section_flags (seg, (SEC_ALLOC | SEC_LOAD | SEC_RELOC + | SEC_DATA | SEC_SMALL_DATA)); if (strcmp (TARGET_OS, "elf") != 0) record_alignment (seg, 4); demand_empty_rest_of_line (); @@ -5685,17 +5687,10 @@ s3_s_score_ent (int aent) if (ISDIGIT (*input_line_pointer) || *input_line_pointer == '-') s3_get_number (); -#ifdef BFD_ASSEMBLER if ((bfd_section_flags (now_seg) & SEC_CODE) != 0) maybe_text = 1; else maybe_text = 0; -#else - if (now_seg != data_section && now_seg != bss_section) - maybe_text = 1; - else - maybe_text = 0; -#endif if (!maybe_text) as_warn (_(".ent or .aent not in text section.")); if (!aent && s3_cur_proc_ptr) @@ -5794,17 +5789,10 @@ s3_s_score_end (int x ATTRIBUTE_UNUSED) else p = NULL; -#ifdef BFD_ASSEMBLER if ((bfd_section_flags (now_seg) & SEC_CODE) != 0) maybe_text = 1; else maybe_text = 0; -#else - if (now_seg != data_section && now_seg != bss_section) - maybe_text = 1; - else - maybe_text = 0; -#endif if (!maybe_text) as_warn (_(".end not in text section")); @@ -6132,11 +6120,9 @@ s3_s_score_lcomm (int bytes_p) { bss_seg = subseg_new (".sbss", 1); seg_info (bss_seg)->bss = 1; -#ifdef BFD_ASSEMBLER - if (!bfd_set_section_flags (bss_seg, SEC_ALLOC)) + if (!bfd_set_section_flags (bss_seg, SEC_ALLOC | SEC_SMALL_DATA)) as_warn (_("error setting flags for \".sbss\": %s"), bfd_errmsg (bfd_get_error ())); -#endif } } #endif @@ -6215,12 +6201,8 @@ s3_s_score_lcomm (int bytes_p) if ( #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT)) -#ifdef BFD_ASSEMBLER (OUTPUT_FLAVOR != bfd_target_aout_flavour || (S_GET_OTHER (symbolP) == 0 && S_GET_DESC (symbolP) == 0)) && -#else - (S_GET_OTHER (symbolP) == 0 && S_GET_DESC (symbolP) == 0) && -#endif #endif (S_GET_SEGMENT (symbolP) == bss_seg || (!S_IS_DEFINED (symbolP) && S_GET_VALUE (symbolP) == 0))) { diff --git a/gas/config/tc-score7.c b/gas/config/tc-score7.c index 3b49f87cf2f..c3b6e97d34e 100644 --- a/gas/config/tc-score7.c +++ b/gas/config/tc-score7.c @@ -5422,14 +5422,16 @@ s7_s_change_sec (int sec) { case 'r': seg = subseg_new (s7_RDATA_SECTION_NAME, (subsegT) get_absolute_expression ()); - bfd_set_section_flags (seg, (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_RELOC | SEC_DATA)); + bfd_set_section_flags (seg, (SEC_ALLOC | SEC_LOAD | SEC_READONLY + | SEC_RELOC | SEC_DATA)); if (strcmp (TARGET_OS, "elf") != 0) record_alignment (seg, 4); demand_empty_rest_of_line (); break; case 's': seg = subseg_new (".sdata", (subsegT) get_absolute_expression ()); - bfd_set_section_flags (seg, SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA); + bfd_set_section_flags (seg, (SEC_ALLOC | SEC_LOAD | SEC_RELOC + | SEC_DATA | SEC_SMALL_DATA)); if (strcmp (TARGET_OS, "elf") != 0) record_alignment (seg, 4); demand_empty_rest_of_line (); @@ -5539,17 +5541,10 @@ s7_s_score_ent (int aent) if (ISDIGIT (*input_line_pointer) || *input_line_pointer == '-') s7_get_number (); -#ifdef BFD_ASSEMBLER if ((bfd_section_flags (now_seg) & SEC_CODE) != 0) maybe_text = 1; else maybe_text = 0; -#else - if (now_seg != data_section && now_seg != bss_section) - maybe_text = 1; - else - maybe_text = 0; -#endif if (!maybe_text) as_warn (_(".ent or .aent not in text section.")); if (!aent && s7_cur_proc_ptr) @@ -5649,17 +5644,10 @@ s7_s_score_end (int x ATTRIBUTE_UNUSED) else p = NULL; -#ifdef BFD_ASSEMBLER if ((bfd_section_flags (now_seg) & SEC_CODE) != 0) maybe_text = 1; else maybe_text = 0; -#else - if (now_seg != data_section && now_seg != bss_section) - maybe_text = 1; - else - maybe_text = 0; -#endif if (!maybe_text) as_warn (_(".end not in text section")); @@ -5989,14 +5977,13 @@ s7_s_score_lcomm (int bytes_p) { /* For Score and Alpha ECOFF or ELF, small objects are put in .sbss. */ if ((unsigned) temp <= bfd_get_gp_size (stdoutput)) - { - bss_seg = subseg_new (".sbss", 1); - seg_info (bss_seg)->bss = 1; -#ifdef BFD_ASSEMBLER - if (!bfd_set_section_flags (bss_seg, SEC_ALLOC)) - as_warn (_("error setting flags for \".sbss\": %s"), bfd_errmsg (bfd_get_error ())); -#endif - } + { + bss_seg = subseg_new (".sbss", 1); + seg_info (bss_seg)->bss = 1; + if (!bfd_set_section_flags (bss_seg, SEC_ALLOC | SEC_SMALL_DATA)) + as_warn (_("error setting flags for \".sbss\": %s"), + bfd_errmsg (bfd_get_error ())); + } } #endif @@ -6074,12 +6061,8 @@ s7_s_score_lcomm (int bytes_p) if ( #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT)) -#ifdef BFD_ASSEMBLER (OUTPUT_FLAVOR != bfd_target_aout_flavour || (S_GET_OTHER (symbolP) == 0 && S_GET_DESC (symbolP) == 0)) && -#else - (S_GET_OTHER (symbolP) == 0 && S_GET_DESC (symbolP) == 0) && -#endif #endif (S_GET_SEGMENT (symbolP) == bss_seg || (!S_IS_DEFINED (symbolP) && S_GET_VALUE (symbolP) == 0))) { diff --git a/gas/read.c b/gas/read.c index 784d6a8f79e..cdb4b3a8189 100644 --- a/gas/read.c +++ b/gas/read.c @@ -2465,7 +2465,7 @@ bss_alloc (symbolS *symbolP, addressT size, unsigned int align) { bss_seg = subseg_new (".sbss", 1); seg_info (bss_seg)->bss = 1; - if (!bfd_set_section_flags (bss_seg, SEC_ALLOC)) + if (!bfd_set_section_flags (bss_seg, SEC_ALLOC | SEC_SMALL_DATA)) as_warn (_("error setting flags for \".sbss\": %s"), bfd_errmsg (bfd_get_error ())); } -- 2.30.2