public inbox for binutils-cvs@sourceware.org
help / color / mirror / Atom feed
From: Alan Modra <amodra@sourceware.org>
To: bfd-cvs@sourceware.org
Subject: [binutils-gdb] Re: Get rid of fprintf_vma and sprintf_vma
Date: Thu,  4 Aug 2022 03:42:04 +0000 (GMT)	[thread overview]
Message-ID: <20220804034204.D2852385AC36@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6b9bd54c24dcf08e400e5b79a958e051ccfde30d

commit 6b9bd54c24dcf08e400e5b79a958e051ccfde30d
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Aug 4 10:12:51 2022 +0930

    Re: Get rid of fprintf_vma and sprintf_vma
    
    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.
    
            * 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): Likewise.
            (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_hash_entry *hash_entry,
        || hash_entry->type == bfd_link_hash_defweak)
       && sec == hash_entry->u.def.section)
     {
-      int i;
       struct xcoff_link_hash_entry *h;
 
-      for (i = 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 = 0;
 		}
-	      while (len < 20)
-		{
-		  print_space ();
-		  ++len;
-		}
+	      print_spaces (20 - len);
 
 	      if (e->name != 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)
 
   for (m = asneeded_list_head; m != NULL; m = m->next)
     {
-      size_t len;
+      int len;
 
       minfo ("%s", m->soname);
       len = strlen (m->soname);
@@ -2231,11 +2231,7 @@ lang_print_asneeded (void)
 	  print_nl ();
 	  len = 0;
 	}
-      while (len < 30)
-	{
-	  print_space ();
-	  ++len;
-	}
+      print_spaces (30 - len);
 
       if (m->ref != NULL)
 	minfo ("%pB ", m->ref);
@@ -2298,25 +2294,21 @@ lang_map (void)
 
   for (m = lang_memory_region_list; m != NULL; m = m->next)
     {
-      fprintf (config.map_file, "%-16s ", m->name_list.name);
+      fprintf (config.map_file, "%-16s", m->name_list.name);
 
-      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);
 
-	  if (m->not_flags)
-	    {
-	      minfo (" !");
-	      lang_map_flags (m->not_flags);
-	    }
+      if (m->not_flags)
+	{
+	  minfo ("!");
+	  lang_map_flags (m->not_flags);
 	}
 
       print_nl ();
@@ -4668,11 +4660,7 @@ print_output_section_statement
 	      print_nl ();
 	      len = 0;
 	    }
-	  while (len < SECTION_NAME_MAP_LENGTH)
-	    {
-	      print_space ();
-	      ++len;
-	    }
+	  print_spaces (SECTION_NAME_MAP_LENGTH - len);
 
 	  minfo ("0x%V %W", section->vma, TO_ADDR (section->size));
 
@@ -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;
 
-  for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
-    print_space ();
+  print_spaces (SECTION_NAME_MAP_LENGTH);
 
   if (assignment->exp->type.node_class == etree_assert)
     {
@@ -4725,6 +4711,8 @@ print_assignment (lang_assignment_statement_type *assignment,
   else
     expld.result.valid_p = false;
 
+  char buf[32];
+  const char *str = buf;
   if (expld.result.valid_p)
     {
       bfd_vma value;
@@ -4738,7 +4726,9 @@ print_assignment (lang_assignment_statement_type *assignment,
 	  if (expld.result.section != NULL)
 	    value += expld.result.section->vma;
 
-	  minfo ("0x%V", value);
+	  buf[0] = '0';
+	  buf[1] = 'x';
+	  bfd_sprintf_vma (link_info.output_bfd, buf + 2, value);
 	  if (is_dot)
 	    print_dot = value;
 	}
@@ -4756,25 +4746,26 @@ print_assignment (lang_assignment_statement_type *assignment,
 	      value += h->u.def.section->output_section->vma;
 	      value += h->u.def.section->output_offset;
 
-	      minfo ("[0x%V]", value);
+	      buf[0] = '[';
+	      buf[1] = '0';
+	      buf[2] = 'x';
+	      bfd_sprintf_vma (link_info.output_bfd, buf + 3, value);
+	      strcat (buf, "]");
 	    }
 	  else
-	    minfo ("[unresolved]");
+	    str = "[unresolved]";
 	}
     }
   else
     {
       if (assignment->exp->type.node_class == etree_provide)
-	minfo ("[!provide]");
+	str = "[!provide]";
       else
-	minfo ("*undef*   ");
-#ifdef BFD64
-      minfo ("        ");
-#endif
+	str = "*undef*";
     }
   expld.assign_name = NULL;
 
-  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_entry, void *ptr)
        || hash_entry->type == bfd_link_hash_defweak)
       && sec == hash_entry->u.def.section)
     {
-      int i;
-
-      for (i = 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)
 
   init_opb (i);
 
-  print_space ();
-  minfo ("%s", i->name);
+  minfo (" %s", i->name);
 
   len = 1 + strlen (i->name);
   if (len >= SECTION_NAME_MAP_LENGTH - 1)
@@ -4878,11 +4865,7 @@ print_input_section (asection *i, bool is_discarded)
       print_nl ();
       len = 0;
     }
-  while (len < SECTION_NAME_MAP_LENGTH)
-    {
-      print_space ();
-      ++len;
-    }
+  print_spaces (SECTION_NAME_MAP_LENGTH - len);
 
   if (i->output_section != NULL
       && i->output_section->owner == link_info.output_bfd)
@@ -4894,22 +4877,14 @@ print_input_section (asection *i, bool is_discarded)
 	size = 0;
     }
 
-  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);
 
   if (size != i->rawsize && i->rawsize != 0)
     {
-      len = SECTION_NAME_MAP_LENGTH + 3;
-#ifdef BFD64
-      len += 16;
-#else
-      len += 8;
-#endif
-      while (len > 0)
-	{
-	  print_space ();
-	  --len;
-	}
-
+      len = SECTION_NAME_MAP_LENGTH + 3 + strlen (buf);
+      print_spaces (len);
       minfo (_("%W (size before relaxing)\n"), TO_ADDR (i->rawsize));
     }
 
@@ -4943,14 +4918,12 @@ print_fill_statement (lang_fill_statement_type *fill)
 static void
 print_data_statement (lang_data_statement_type *data)
 {
-  int i;
   bfd_vma addr;
   bfd_size_type size;
   const char *name;
 
   init_opb (data->output_section);
-  for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
-    print_space ();
+  print_spaces (SECTION_NAME_MAP_LENGTH);
 
   addr = data->output_offset;
   if (data->output_section != NULL)
@@ -5013,13 +4986,11 @@ print_address_statement (lang_address_statement_type *address)
 static void
 print_reloc_statement (lang_reloc_statement_type *reloc)
 {
-  int i;
   bfd_vma addr;
   bfd_size_type size;
 
   init_opb (reloc->output_section);
-  for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
-    print_space ();
+  print_spaces (SECTION_NAME_MAP_LENGTH);
 
   addr = reloc->output_offset;
   if (reloc->output_section != NULL)
@@ -5051,11 +5022,7 @@ print_padding_statement (lang_padding_statement_type *s)
   minfo (" *fill*");
 
   len = sizeof " *fill*" - 1;
-  while (len < SECTION_NAME_MAP_LENGTH)
-    {
-      print_space ();
-      ++len;
-    }
+  print_spaces (SECTION_NAME_MAP_LENGTH - len);
 
   addr = s->output_offset;
   if (s->output_section != 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];
 
       if (!header_printed)
 	{
@@ -7299,22 +7266,9 @@ lang_one_common (struct bfd_link_hash_entry *h, void *info)
 	  print_nl ();
 	  len = 0;
 	}
-      while (len < 20)
-	{
-	  print_space ();
-	  ++len;
-	}
 
-      minfo ("0x");
       sprintf (buf, "%" PRIx64, (uint64_t) size);
-      minfo ("%s", buf);
-      len = strlen (buf);
-
-      while (len < 16)
-	{
-	  print_space ();
-	  ++len;
-	}
+      fprintf (config.map_file, "%*s0x%-16s", 20 - len, "", buf);
 
       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 = 0;
 	}
-      while (len < 30)
-	{
-	  print_space ();
-	  ++len;
-	}
+      print_spaces (30 - len);
 
       if (from != 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 = args[arg_no].v;
+		char buf[32];
+		bfd_vma value;
+
+		value = 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;
 
@@ -258,22 +262,15 @@ vfinfo (FILE *fp, const char *fmt, va_list ap, bool is_warning)
 
 	    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;
 
 		value = args[arg_no].v;
 		++arg_count;
-		sprintf (buf, "%" PRIx64, value);
-		len = strlen (buf);
-		while (len < 8)
-		  {
-		    putc (' ', fp);
-		    ++len;
-		  }
-		fprintf (fp, "0x%s", buf);
+		sprintf (buf, "0x%" PRIx64, value);
+		fprintf (fp, "%10s", buf);
 	      }
 	      break;
 
@@ -653,9 +650,9 @@ lfinfo (FILE *file, const char *fmt, ...)
 /* Functions to print the link map.  */
 
 void
-print_space (void)
+print_spaces (int count)
 {
-  fprintf (config.map_file, " ");
+  fprintf (config.map_file, "%*s", count, "");
 }
 
 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)
 
-extern void print_space (void);
+extern void print_spaces (int);
+#define print_space() print_spaces (1)
 extern void print_nl (void);
 
 #endif


                 reply	other threads:[~2022-08-04  3:42 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220804034204.D2852385AC36@sourceware.org \
    --to=amodra@sourceware.org \
    --cc=bfd-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).