From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1062) id D2852385AC36; Thu, 4 Aug 2022 03:42:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D2852385AC36 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Alan Modra To: bfd-cvs@sourceware.org Subject: [binutils-gdb] Re: Get rid of fprintf_vma and sprintf_vma X-Act-Checkin: binutils-gdb X-Git-Author: Alan Modra X-Git-Refname: refs/heads/master X-Git-Oldrev: 94e27e8e69a07d69554ee7598419646d3ee99907 X-Git-Newrev: 6b9bd54c24dcf08e400e5b79a958e051ccfde30d Message-Id: <20220804034204.D2852385AC36@sourceware.org> Date: Thu, 4 Aug 2022 03:42:04 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Aug 2022 03:42:04 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D6b9bd54c24dc= f08e400e5b79a958e051ccfde30d commit 6b9bd54c24dcf08e400e5b79a958e051ccfde30d Author: Alan Modra Date: Thu Aug 4 10:12:51 2022 +0930 Re: Get rid of fprintf_vma and sprintf_vma =20 Commit f493c2174e messed the formatting in linker map files, particularly for 32-bit builds where a number of tests using map files regressed. I should have noticed the BFD64 conditional printing of spaces to line up output due to the original %V printing hex vmas with 16 digits when BFD64 and 8 digits when not. Besides that, it is nicer to print 32-bit vmas for 32-bit targets. So change %V back to be target dependent, now using bfd_sprintf_vma. Since minfo doesn't return the number of chars printed, that means some places that currently use %V must instead sprintf to a buffer in order to find the length printed. =20 * ldmisc.h (print_spaces): Declare. (print_space): Change to a macro. * ldmisc.c (vfinfo): Use bfd_sprintf_vma for %V. Tidy %W case. (print_space): Delete. (print_spaces): New function. * emultempl/aix.em (print_symbol): Use print_spaces. * ldctor.c (ldctor_build_sets): Likewise. * ldmain.c (add_archive_element): Likewise. * ldlang.c (print_one_symbol, lang_print_asneeded): Likewise. (print_output_section_statement, print_data_statement): Likewis= e. (print_reloc_statement, print_padding_statement): Likewise. (print_assignment): Likewise. Also replace %V printing of vmas with printing to a buffer in order to properly format output. (print_input_section, lang_one_common): Likewise. Diff: --- ld/emultempl/aix.em | 4 +- ld/ldctor.c | 6 +-- ld/ldlang.c | 134 +++++++++++++++++-------------------------------= ---- ld/ldmain.c | 6 +-- ld/ldmisc.c | 29 +++++------- ld/ldmisc.h | 3 +- 6 files changed, 62 insertions(+), 120 deletions(-) diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em index 355e2a4ffff..af49efff3ec 100644 --- a/ld/emultempl/aix.em +++ b/ld/emultempl/aix.em @@ -1772,11 +1772,9 @@ gld${EMULATION_NAME}_print_symbol (struct bfd_link_h= ash_entry *hash_entry, || hash_entry->type =3D=3D bfd_link_hash_defweak) && sec =3D=3D hash_entry->u.def.section) { - int i; struct xcoff_link_hash_entry *h; =20 - for (i =3D 0; i < SECTION_NAME_MAP_LENGTH; i++) - print_space (); + print_spaces (SECTION_NAME_MAP_LENGTH); minfo ("0x%V ", (hash_entry->u.def.value + hash_entry->u.def.section->output_offset diff --git a/ld/ldctor.c b/ld/ldctor.c index 43d2c7c387b..9ebd68d9097 100644 --- a/ld/ldctor.c +++ b/ld/ldctor.c @@ -352,11 +352,7 @@ ldctor_build_sets (void) print_nl (); len =3D 0; } - while (len < 20) - { - print_space (); - ++len; - } + print_spaces (20 - len); =20 if (e->name !=3D NULL) minfo ("%pT\n", e->name); diff --git a/ld/ldlang.c b/ld/ldlang.c index b7bb4a3aeda..865c28bf6aa 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2221,7 +2221,7 @@ lang_print_asneeded (void) =20 for (m =3D asneeded_list_head; m !=3D NULL; m =3D m->next) { - size_t len; + int len; =20 minfo ("%s", m->soname); len =3D strlen (m->soname); @@ -2231,11 +2231,7 @@ lang_print_asneeded (void) print_nl (); len =3D 0; } - while (len < 30) - { - print_space (); - ++len; - } + print_spaces (30 - len); =20 if (m->ref !=3D NULL) minfo ("%pB ", m->ref); @@ -2298,25 +2294,21 @@ lang_map (void) =20 for (m =3D lang_memory_region_list; m !=3D NULL; m =3D m->next) { - fprintf (config.map_file, "%-16s ", m->name_list.name); + fprintf (config.map_file, "%-16s", m->name_list.name); =20 - minfo ("0x%V 0x%V", m->origin, m->length); - if (m->flags || m->not_flags) - { -#ifndef BFD64 - minfo (" "); -#endif - if (m->flags) - { - print_space (); - lang_map_flags (m->flags); - } + char buf[32]; + bfd_sprintf_vma (link_info.output_bfd, buf, m->origin); + fprintf (config.map_file, " 0x%-16s", buf); + bfd_sprintf_vma (link_info.output_bfd, buf, m->length); + fprintf (config.map_file, + " 0x%*s", m->flags || m->not_flags ? -17 : 0, buf); + if (m->flags) + lang_map_flags (m->flags); =20 - if (m->not_flags) - { - minfo (" !"); - lang_map_flags (m->not_flags); - } + if (m->not_flags) + { + minfo ("!"); + lang_map_flags (m->not_flags); } =20 print_nl (); @@ -4668,11 +4660,7 @@ print_output_section_statement print_nl (); len =3D 0; } - while (len < SECTION_NAME_MAP_LENGTH) - { - print_space (); - ++len; - } + print_spaces (SECTION_NAME_MAP_LENGTH - len); =20 minfo ("0x%V %W", section->vma, TO_ADDR (section->size)); =20 @@ -4695,13 +4683,11 @@ static void print_assignment (lang_assignment_statement_type *assignment, lang_output_section_statement_type *output_section) { - unsigned int i; bool is_dot; etree_type *tree; asection *osec; =20 - for (i =3D 0; i < SECTION_NAME_MAP_LENGTH; i++) - print_space (); + print_spaces (SECTION_NAME_MAP_LENGTH); =20 if (assignment->exp->type.node_class =3D=3D etree_assert) { @@ -4725,6 +4711,8 @@ print_assignment (lang_assignment_statement_type *ass= ignment, else expld.result.valid_p =3D false; =20 + char buf[32]; + const char *str =3D buf; if (expld.result.valid_p) { bfd_vma value; @@ -4738,7 +4726,9 @@ print_assignment (lang_assignment_statement_type *ass= ignment, if (expld.result.section !=3D NULL) value +=3D expld.result.section->vma; =20 - minfo ("0x%V", value); + buf[0] =3D '0'; + buf[1] =3D 'x'; + bfd_sprintf_vma (link_info.output_bfd, buf + 2, value); if (is_dot) print_dot =3D value; } @@ -4756,25 +4746,26 @@ print_assignment (lang_assignment_statement_type *a= ssignment, value +=3D h->u.def.section->output_section->vma; value +=3D h->u.def.section->output_offset; =20 - minfo ("[0x%V]", value); + buf[0] =3D '['; + buf[1] =3D '0'; + buf[2] =3D 'x'; + bfd_sprintf_vma (link_info.output_bfd, buf + 3, value); + strcat (buf, "]"); } else - minfo ("[unresolved]"); + str =3D "[unresolved]"; } } else { if (assignment->exp->type.node_class =3D=3D etree_provide) - minfo ("[!provide]"); + str =3D "[!provide]"; else - minfo ("*undef* "); -#ifdef BFD64 - minfo (" "); -#endif + str =3D "*undef*"; } expld.assign_name =3D NULL; =20 - minfo (" "); + fprintf (config.map_file, "%-34s", str); exp_print_tree (assignment->exp); print_nl (); } @@ -4798,10 +4789,7 @@ print_one_symbol (struct bfd_link_hash_entry *hash_e= ntry, void *ptr) || hash_entry->type =3D=3D bfd_link_hash_defweak) && sec =3D=3D hash_entry->u.def.section) { - int i; - - for (i =3D 0; i < SECTION_NAME_MAP_LENGTH; i++) - print_space (); + print_spaces (SECTION_NAME_MAP_LENGTH); minfo ("0x%V ", (hash_entry->u.def.value + hash_entry->u.def.section->output_offset @@ -4869,8 +4857,7 @@ print_input_section (asection *i, bool is_discarded) =20 init_opb (i); =20 - print_space (); - minfo ("%s", i->name); + minfo (" %s", i->name); =20 len =3D 1 + strlen (i->name); if (len >=3D SECTION_NAME_MAP_LENGTH - 1) @@ -4878,11 +4865,7 @@ print_input_section (asection *i, bool is_discarded) print_nl (); len =3D 0; } - while (len < SECTION_NAME_MAP_LENGTH) - { - print_space (); - ++len; - } + print_spaces (SECTION_NAME_MAP_LENGTH - len); =20 if (i->output_section !=3D NULL && i->output_section->owner =3D=3D link_info.output_bfd) @@ -4894,22 +4877,14 @@ print_input_section (asection *i, bool is_discarded) size =3D 0; } =20 - minfo ("0x%V %W %pB\n", addr, TO_ADDR (size), i->owner); + char buf[32]; + bfd_sprintf_vma (link_info.output_bfd, buf, addr); + minfo ("0x%s %W %pB\n", buf, TO_ADDR (size), i->owner); =20 if (size !=3D i->rawsize && i->rawsize !=3D 0) { - len =3D SECTION_NAME_MAP_LENGTH + 3; -#ifdef BFD64 - len +=3D 16; -#else - len +=3D 8; -#endif - while (len > 0) - { - print_space (); - --len; - } - + len =3D SECTION_NAME_MAP_LENGTH + 3 + strlen (buf); + print_spaces (len); minfo (_("%W (size before relaxing)\n"), TO_ADDR (i->rawsize)); } =20 @@ -4943,14 +4918,12 @@ print_fill_statement (lang_fill_statement_type *fil= l) static void print_data_statement (lang_data_statement_type *data) { - int i; bfd_vma addr; bfd_size_type size; const char *name; =20 init_opb (data->output_section); - for (i =3D 0; i < SECTION_NAME_MAP_LENGTH; i++) - print_space (); + print_spaces (SECTION_NAME_MAP_LENGTH); =20 addr =3D data->output_offset; if (data->output_section !=3D NULL) @@ -5013,13 +4986,11 @@ print_address_statement (lang_address_statement_typ= e *address) static void print_reloc_statement (lang_reloc_statement_type *reloc) { - int i; bfd_vma addr; bfd_size_type size; =20 init_opb (reloc->output_section); - for (i =3D 0; i < SECTION_NAME_MAP_LENGTH; i++) - print_space (); + print_spaces (SECTION_NAME_MAP_LENGTH); =20 addr =3D reloc->output_offset; if (reloc->output_section !=3D NULL) @@ -5051,11 +5022,7 @@ print_padding_statement (lang_padding_statement_type= *s) minfo (" *fill*"); =20 len =3D sizeof " *fill*" - 1; - while (len < SECTION_NAME_MAP_LENGTH) - { - print_space (); - ++len; - } + print_spaces (SECTION_NAME_MAP_LENGTH - len); =20 addr =3D s->output_offset; if (s->output_section !=3D NULL) @@ -7271,7 +7238,7 @@ lang_one_common (struct bfd_link_hash_entry *h, void = *info) static bool header_printed; int len; char *name; - char buf[50]; + char buf[32]; =20 if (!header_printed) { @@ -7299,22 +7266,9 @@ lang_one_common (struct bfd_link_hash_entry *h, void= *info) print_nl (); len =3D 0; } - while (len < 20) - { - print_space (); - ++len; - } =20 - minfo ("0x"); sprintf (buf, "%" PRIx64, (uint64_t) size); - minfo ("%s", buf); - len =3D strlen (buf); - - while (len < 16) - { - print_space (); - ++len; - } + fprintf (config.map_file, "%*s0x%-16s", 20 - len, "", buf); =20 minfo ("%pB\n", section->owner); } diff --git a/ld/ldmain.c b/ld/ldmain.c index ea72b14a301..1bbddaaad32 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -990,11 +990,7 @@ add_archive_element (struct bfd_link_info *info, print_nl (); len =3D 0; } - while (len < 30) - { - print_space (); - ++len; - } + print_spaces (30 - len); =20 if (from !=3D NULL) minfo ("%pB ", from); diff --git a/ld/ldmisc.c b/ld/ldmisc.c index ee5248705aa..3a02f752c38 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -47,7 +47,7 @@ %H like %C but in addition emit section+offset %P print program name %V hex bfd_vma - %W hex bfd_vma with 0x with no leading zeros taking up 8 spaces + %W hex bfd_vma with 0x with no leading zeros taking up 10 spaces %X no object output, fail return %d integer, like printf %ld long, like printf @@ -241,9 +241,13 @@ vfinfo (FILE *fp, const char *fmt, va_list ap, bool is= _warning) case 'V': /* hex bfd_vma */ { - uint64_t value =3D args[arg_no].v; + char buf[32]; + bfd_vma value; + + value =3D args[arg_no].v; ++arg_count; - fprintf (fp, "%016" PRIx64, value); + bfd_sprintf_vma (link_info.output_bfd, buf, value); + fprintf (fp, "%s", buf); } break; =20 @@ -258,22 +262,15 @@ vfinfo (FILE *fp, const char *fmt, va_list ap, bool i= s_warning) =20 case 'W': /* hex bfd_vma with 0x with no leading zeroes taking up - 8 spaces. */ + 10 spaces (including the 0x). */ { - char buf[100]; + char buf[32]; uint64_t value; - int len; =20 value =3D args[arg_no].v; ++arg_count; - sprintf (buf, "%" PRIx64, value); - len =3D strlen (buf); - while (len < 8) - { - putc (' ', fp); - ++len; - } - fprintf (fp, "0x%s", buf); + sprintf (buf, "0x%" PRIx64, value); + fprintf (fp, "%10s", buf); } break; =20 @@ -653,9 +650,9 @@ lfinfo (FILE *file, const char *fmt, ...) /* Functions to print the link map. */ =20 void -print_space (void) +print_spaces (int count) { - fprintf (config.map_file, " "); + fprintf (config.map_file, "%*s", count, ""); } =20 void diff --git a/ld/ldmisc.h b/ld/ldmisc.h index 6059268c28c..dda40eeb50f 100644 --- a/ld/ldmisc.h +++ b/ld/ldmisc.h @@ -38,7 +38,8 @@ do { if (!(x)) info_assert(__FILE__,__LINE__); } while (0) #define FAIL() \ do { info_assert(__FILE__,__LINE__); } while (0) =20 -extern void print_space (void); +extern void print_spaces (int); +#define print_space() print_spaces (1) extern void print_nl (void); =20 #endif