Re: Get rid of fprintf_vma and sprintf_vma
authorAlan Modra <amodra@gmail.com>
Thu, 4 Aug 2022 00:42:51 +0000 (10:12 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 4 Aug 2022 02:30:36 +0000 (12:00 +0930)
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.

ld/emultempl/aix.em
ld/ldctor.c
ld/ldlang.c
ld/ldmain.c
ld/ldmisc.c
ld/ldmisc.h

index 355e2a4ffffb3e4ddafad357524356cca7a93353..af49efff3ec5ec64a6dfc88ea454357c69ca69ff 100644 (file)
@@ -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
index 43d2c7c387bc3560bab17ef035b0d53117da837c..9ebd68d90970033a468bf4cfef1d03c1be5f6024 100644 (file)
@@ -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);
index b7bb4a3aedad405488b31e4c95a3cb61d04b512a..865c28bf6aae2f0ffef67577f1289dc06a4079d3 100644 (file)
@@ -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);
     }
index ea72b14a301dc41a5aee7e91772881705039f073..1bbddaaad328ae3e05ad91831a33a9b0febc3ab4 100644 (file)
@@ -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);
index ee5248705aaa2385c2a2b8404621d7b9c9f363a1..3a02f752c38b2e65bae3dff7897371943a518d39 100644 (file)
@@ -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
index 6059268c28c50b25e812e29119d43ba0b4e57f27..dda40eeb50f493673d1c887d1d62ee202865c635 100644 (file)
@@ -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