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.
This commit is contained in:
Alan Modra
2022-08-04 10:12:51 +09:30
parent 94e27e8e69
commit 6b9bd54c24
6 changed files with 62 additions and 120 deletions

View 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