From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 45008 invoked by alias); 2 Mar 2020 01:05:41 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 44996 invoked by uid 89); 2 Mar 2020 01:05:41 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mail-pj1-f47.google.com Received: from mail-pj1-f47.google.com (HELO mail-pj1-f47.google.com) (209.85.216.47) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 02 Mar 2020 01:05:38 +0000 Received: by mail-pj1-f47.google.com with SMTP id nm14so941053pjb.0 for ; Sun, 01 Mar 2020 17:05:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:subject:message-id:mime-version:content-disposition :user-agent; bh=OoxzWpnY/E/s/J3Wvl2wD5kzX7JwGX4xXZkL46D8rKs=; b=qWeihAbdOH3e8kLAAiV2LJoQUnEDGHWFZacB8ZBpfQ6ZVa+XXeyQ+fnyTg/K1wViUI c+UTo3YlzynD8d/1KYkSLrNudF5xInUnGRkyZveXjjbAU6AhO5f5Su6gvDHrscOKNyfX V2Ullqsg+WGIn4JNtikK/DMopt7t0oceffW6eFALrW+PAc+btYELrWNjUOAP1cixkXN/ 2rKfuTGf1chHTAzdCu675ZCaL4DHStHN3pGmkolUKI1VGlHSRf1/w6l42fk7vmzLDSe8 hOcBMgX9a8e3mMOptCZQN5kZGpYSNBrYQtfbbAde1xhPYk1EqKgxskOL5jJ5oimPs832 0jhA== Return-Path: Received: from bubble.grove.modra.org ([2406:3400:51d:8cc0:4cbf:6151:c307:e623]) by smtp.gmail.com with ESMTPSA id r10sm15351491pgv.25.2020.03.01.17.05.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 17:05:35 -0800 (PST) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id 19F8C80490; Mon, 2 Mar 2020 11:35:32 +1030 (ACDT) Date: Mon, 02 Mar 2020 01:05:00 -0000 From: Alan Modra To: binutils@sourceware.org Subject: miscellaneous SEC_SMALL_DATA Message-ID: <20200302010532.GG5384@bubble.grove.modra.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.9.4 (2018-02-28) X-IsSubscribed: yes X-SW-Source: 2020-03/txt/msg00007.txt 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. diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c index 9a3ac089a6..821e5591a9 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 7c0a99194a..772175325c 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 cd495dbe61..27158a061c 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 9e2efac8e3..84eab99398 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/config/tc-m32r.c b/gas/config/tc-m32r.c index bee0571e21..824f67c124 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 a00c69b689..9f78b5a89e 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 8376d0beb4..80c4cbfa4e 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 3b49f87cf2..c3b6e97d34 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 784d6a8f79..cdb4b3a818 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 ())); } -- Alan Modra Australia Development Lab, IBM