[v3] ld: Add --no-print-map-discarded option

Message ID 20190402201735.285064-1-fshahbazker@wavecomp.com
State New
Headers show
Series
  • [v3] ld: Add --no-print-map-discarded option
Related show

Commit Message

Faraz Shahbazker April 2, 2019, 8:17 p.m.
Add a new option to disable the listing of discarded sections
in map file output.  The use case stems from a large application
built with -ffunction-sections --gc-sections where the list of
discarded sections blows up the map file output.  The default
behaviour remains to print discarded sections,  but the new option
allows us to disable it.

ld/
	* NEWS: Mention new option --no-print-map-discarded.
	* ld.h (ld_config_type) <print_map_discarded>: New field.
	* ldlang.c (lang_map): Conditionally output discarded sections
	in map files based on configuration option.
	* ldlex.h (option_values) <OPTION_PRINT_MAP_DISCARDED,
	OPTION_NO_PRINT_MAP_DISCARDED>: New.
	* ldmain.c (main): Enabled print_map_discarded by default.
	* lexsup.c (ld_options): Add new command-line options.
	(parse_args) <OPTION_NO_PRINT_MAP_DISCARDED,
	OPTION_PRINT_MAP_DISCARDED>: New cases.
	* ld.texi: Document new options.
	* testsuite/ld-gc/gc.exp: Add new test.
	* testsuite/ld-gc/skip-map-discarded.s: New file.
	* testsuite/ld-gc/skip-map-discarded.d: New file.
	* testsuite/ld-gc/skip-map-discarded.map: New file.
---
This is corrected version 3 of a patch posted for review few months back,
but not committed due to pending copyright assignment. Somehow managed to
reverse the previous version before posting.

 ld/NEWS                                   |  2 ++
 ld/ld.h                                   |  3 +++
 ld/ld.texi                                |  8 ++++++++
 ld/ldlang.c                               | 25 +++++++++++++------------
 ld/ldlex.h                                |  2 ++
 ld/ldmain.c                               |  1 +
 ld/lexsup.c                               | 14 ++++++++++++++
 ld/testsuite/ld-gc/gc.exp                 |  2 ++
 ld/testsuite/ld-gc/skip-map-discarded.d   |  3 +++
 ld/testsuite/ld-gc/skip-map-discarded.map |  5 +++++
 ld/testsuite/ld-gc/skip-map-discarded.s   |  5 +++++
 11 files changed, 58 insertions(+), 12 deletions(-)
 create mode 100644 ld/testsuite/ld-gc/skip-map-discarded.d
 create mode 100644 ld/testsuite/ld-gc/skip-map-discarded.map
 create mode 100644 ld/testsuite/ld-gc/skip-map-discarded.s

-- 
2.9.5

Comments

Nick Clifton April 10, 2019, 3:57 p.m. | #1
Hi Faraz,

> 	* NEWS: Mention new option --no-print-map-discarded.

> 	* ld.h (ld_config_type) <print_map_discarded>: New field.

> 	* ldlang.c (lang_map): Conditionally output discarded sections

> 	in map files based on configuration option.

> 	* ldlex.h (option_values) <OPTION_PRINT_MAP_DISCARDED,

> 	OPTION_NO_PRINT_MAP_DISCARDED>: New.

> 	* ldmain.c (main): Enabled print_map_discarded by default.

> 	* lexsup.c (ld_options): Add new command-line options.

> 	(parse_args) <OPTION_NO_PRINT_MAP_DISCARDED,

> 	OPTION_PRINT_MAP_DISCARDED>: New cases.

> 	* ld.texi: Document new options.

> 	* testsuite/ld-gc/gc.exp: Add new test.

> 	* testsuite/ld-gc/skip-map-discarded.s: New file.

> 	* testsuite/ld-gc/skip-map-discarded.d: New file.

> 	* testsuite/ld-gc/skip-map-discarded.map: New file.


> This is corrected version 3 of a patch posted for review few months back,

> but not committed due to pending copyright assignment. Somehow managed to

> reverse the previous version before posting.

 The patch looks good to me.  Once the copyright assignment is in place
please ping me and I will approve it.

Cheers
  Nick
Faraz Shahbazker April 10, 2019, 4:19 p.m. | #2
Hi Nick,

I have been told that the copyright assignment from Wave Computing is in place.

Regards,
Faraz

On 4/10/19 8:57 AM, Nick Clifton wrote:
> Hi Faraz,

> 

>> 	* NEWS: Mention new option --no-print-map-discarded.

>> 	* ld.h (ld_config_type) <print_map_discarded>: New field.

>> 	* ldlang.c (lang_map): Conditionally output discarded sections

>> 	in map files based on configuration option.

>> 	* ldlex.h (option_values) <OPTION_PRINT_MAP_DISCARDED,

>> 	OPTION_NO_PRINT_MAP_DISCARDED>: New.

>> 	* ldmain.c (main): Enabled print_map_discarded by default.

>> 	* lexsup.c (ld_options): Add new command-line options.

>> 	(parse_args) <OPTION_NO_PRINT_MAP_DISCARDED,

>> 	OPTION_PRINT_MAP_DISCARDED>: New cases.

>> 	* ld.texi: Document new options.

>> 	* testsuite/ld-gc/gc.exp: Add new test.

>> 	* testsuite/ld-gc/skip-map-discarded.s: New file.

>> 	* testsuite/ld-gc/skip-map-discarded.d: New file.

>> 	* testsuite/ld-gc/skip-map-discarded.map: New file.

> 

>> This is corrected version 3 of a patch posted for review few months back,

>> but not committed due to pending copyright assignment. Somehow managed to

>> reverse the previous version before posting.

>  The patch looks good to me.  Once the copyright assignment is in place

> please ping me and I will approve it.

> 

> Cheers

>   Nick

>
Nick Clifton April 11, 2019, 10:54 a.m. | #3
Hi Faraz,

> I have been told that the copyright assignment from Wave Computing is in place.


Indeed it is,

>>> 	* NEWS: Mention new option --no-print-map-discarded.

>>> 	* ld.h (ld_config_type) <print_map_discarded>: New field.

>>> 	* ldlang.c (lang_map): Conditionally output discarded sections

>>> 	in map files based on configuration option.

>>> 	* ldlex.h (option_values) <OPTION_PRINT_MAP_DISCARDED,

>>> 	OPTION_NO_PRINT_MAP_DISCARDED>: New.

>>> 	* ldmain.c (main): Enabled print_map_discarded by default.

>>> 	* lexsup.c (ld_options): Add new command-line options.

>>> 	(parse_args) <OPTION_NO_PRINT_MAP_DISCARDED,

>>> 	OPTION_PRINT_MAP_DISCARDED>: New cases.

>>> 	* ld.texi: Document new options.

>>> 	* testsuite/ld-gc/gc.exp: Add new test.

>>> 	* testsuite/ld-gc/skip-map-discarded.s: New file.

>>> 	* testsuite/ld-gc/skip-map-discarded.d: New file.

>>> 	* testsuite/ld-gc/skip-map-discarded.map: New file.


Patch approved - please apply.

Cheers
  Nick
Faraz Shahbazker April 11, 2019, 2:05 p.m. | #4
Hi Nick,


I don't have write access yet. I've had maybe a handful of patches approved. Is there a threshold to meet for requesting write access?


Regards,

Faraz

________________________________
From: Nick Clifton <nickc@redhat.com>

Sent: Thursday, April 11, 2019 3:54:11 AM
To: Faraz Shahbazker; binutils@sourceware.org
Subject: Re: [PATCH v3] ld: Add --no-print-map-discarded option

Hi Faraz,

> I have been told that the copyright assignment from Wave Computing is in place.


Indeed it is,

>>>      * NEWS: Mention new option --no-print-map-discarded.

>>>      * ld.h (ld_config_type) <print_map_discarded>: New field.

>>>      * ldlang.c (lang_map): Conditionally output discarded sections

>>>      in map files based on configuration option.

>>>      * ldlex.h (option_values) <OPTION_PRINT_MAP_DISCARDED,

>>>      OPTION_NO_PRINT_MAP_DISCARDED>: New.

>>>      * ldmain.c (main): Enabled print_map_discarded by default.

>>>      * lexsup.c (ld_options): Add new command-line options.

>>>      (parse_args) <OPTION_NO_PRINT_MAP_DISCARDED,

>>>      OPTION_PRINT_MAP_DISCARDED>: New cases.

>>>      * ld.texi: Document new options.

>>>      * testsuite/ld-gc/gc.exp: Add new test.

>>>      * testsuite/ld-gc/skip-map-discarded.s: New file.

>>>      * testsuite/ld-gc/skip-map-discarded.d: New file.

>>>      * testsuite/ld-gc/skip-map-discarded.map: New file.


Patch approved - please apply.

Cheers
  Nick

Patch

diff --git a/ld/NEWS b/ld/NEWS
index 597845a..de2cd16 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,5 +1,7 @@ 
 -*- text -*-
 
+* Add command-line option --no-print-map-discarded.
+
 Changes in 2.33:
 
 * Add target handlers for AArch64 for ELF GNU program properties.
diff --git a/ld/ld.h b/ld/ld.h
index b97d977..55078a9 100644
--- a/ld/ld.h
+++ b/ld/ld.h
@@ -318,6 +318,9 @@  typedef struct
 
   /* The common page size for ELF.  */
   bfd_vma commonpagesize;
+
+  /* If set, print discarded sections in map file output.  */
+  bfd_boolean print_map_discarded;
 } ld_config_type;
 
 extern ld_config_type config;
diff --git a/ld/ld.texi b/ld/ld.texi
index 0bcbec4..d88bdb4 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -783,6 +783,14 @@  when merging properties in  @file{foo.o}, whose 0xc0010001 property value
 is 0x1, and @file{bar.o}, whose 0xc0010001 property value is 0x1.
 @end itemize
 
+@cindex link map discarded
+@kindex --print-map-discarded
+@kindex --no-print-map-discarded
+@item --print-map-discarded
+@itemx --no-print-map-discarded
+Print (or do not print) the list of discarded and garbage collected sections
+in the link map.  Enabled by default.
+
 @kindex -n
 @cindex read-only text
 @cindex NMAGIC
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 1952d4a..898735e 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -2251,19 +2251,20 @@  lang_map (void)
 	  || file->flags.just_syms)
 	continue;
 
-      for (s = file->the_bfd->sections; s != NULL; s = s->next)
-	if ((s->output_section == NULL
-	     || s->output_section->owner != link_info.output_bfd)
-	    && (s->flags & (SEC_LINKER_CREATED | SEC_KEEP)) == 0)
-	  {
-	    if (!dis_header_printed)
-	      {
-		fprintf (config.map_file, _("\nDiscarded input sections\n\n"));
-		dis_header_printed = TRUE;
-	      }
+      if (config.print_map_discarded)
+	for (s = file->the_bfd->sections; s != NULL; s = s->next)
+	  if ((s->output_section == NULL
+	       || s->output_section->owner != link_info.output_bfd)
+	      && (s->flags & (SEC_LINKER_CREATED | SEC_KEEP)) == 0)
+	    {
+	      if (! dis_header_printed)
+		{
+		  fprintf (config.map_file, _("\nDiscarded input sections\n\n"));
+		  dis_header_printed = TRUE;
+		}
 
-	    print_input_section (s, TRUE);
-	  }
+	      print_input_section (s, TRUE);
+	    }
     }
 
   minfo (_("\nMemory Configuration\n\n"));
diff --git a/ld/ldlex.h b/ld/ldlex.h
index 32853de..32a7a64 100644
--- a/ld/ldlex.h
+++ b/ld/ldlex.h
@@ -148,6 +148,8 @@  enum option_values
   OPTION_REQUIRE_DEFINED_SYMBOL,
   OPTION_ORPHAN_HANDLING,
   OPTION_FORCE_GROUP_ALLOCATION,
+  OPTION_PRINT_MAP_DISCARDED,
+  OPTION_NO_PRINT_MAP_DISCARDED,
 };
 
 /* The initial parser states.  */
diff --git a/ld/ldmain.c b/ld/ldmain.c
index 77cdbd0..da1c6a7 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -264,6 +264,7 @@  main (int argc, char **argv)
   config.make_executable = TRUE;
   config.magic_demand_paged = TRUE;
   config.text_read_only = TRUE;
+  config.print_map_discarded = TRUE;
   link_info.disable_target_specific_optimizations = -1;
 
   command_line.warn_mismatch = TRUE;
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 88e85c7..dacb962 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -543,6 +543,12 @@  static const struct ld_option ld_options[] =
   { {"orphan-handling", required_argument, NULL, OPTION_ORPHAN_HANDLING},
     '\0', N_("=MODE"), N_("Control how orphan sections are handled."),
     TWO_DASHES },
+  { {"print-map-discarded", no_argument, NULL, OPTION_PRINT_MAP_DISCARDED},
+    '\0', NULL, N_("Show discarded sections in map file output (default)"),
+    TWO_DASHES },
+  { {"no-print-map-discarded", no_argument, NULL, OPTION_NO_PRINT_MAP_DISCARDED},
+    '\0', NULL, N_("Do not show discarded sections in map file output"),
+    TWO_DASHES },
 };
 
 #define OPTION_COUNT ARRAY_SIZE (ld_options)
@@ -1577,6 +1583,14 @@  parse_args (unsigned argc, char **argv)
 	    einfo (_("%F%P: invalid argument to option"
 		     " \"--orphan-handling\"\n"));
 	  break;
+
+	case OPTION_NO_PRINT_MAP_DISCARDED:
+	  config.print_map_discarded = FALSE;
+	  break;
+
+	case OPTION_PRINT_MAP_DISCARDED:
+	  config.print_map_discarded = TRUE;
+	  break;
 	}
     }
 
diff --git a/ld/testsuite/ld-gc/gc.exp b/ld/testsuite/ld-gc/gc.exp
index 536356c..13968cc 100644
--- a/ld/testsuite/ld-gc/gc.exp
+++ b/ld/testsuite/ld-gc/gc.exp
@@ -171,3 +171,5 @@  if { [is_elf_format] && [check_shared_lib_support] \
     ]
     run_dump_test "pr20306"
 }
+
+run_dump_test "skip-map-discarded"
diff --git a/ld/testsuite/ld-gc/skip-map-discarded.d b/ld/testsuite/ld-gc/skip-map-discarded.d
new file mode 100644
index 0000000..2e79f0b
--- /dev/null
+++ b/ld/testsuite/ld-gc/skip-map-discarded.d
@@ -0,0 +1,3 @@ 
+#name: Check --no-print-map-discarded linker option
+#ld: -e 0 --gc-sections --no-print-map-discarded
+#map: skip-map-discarded.map
diff --git a/ld/testsuite/ld-gc/skip-map-discarded.map b/ld/testsuite/ld-gc/skip-map-discarded.map
new file mode 100644
index 0000000..ca4818e
--- /dev/null
+++ b/ld/testsuite/ld-gc/skip-map-discarded.map
@@ -0,0 +1,5 @@ 
+#failif
+Discarded input sections
+#...
+ _foo.*
+#...
diff --git a/ld/testsuite/ld-gc/skip-map-discarded.s b/ld/testsuite/ld-gc/skip-map-discarded.s
new file mode 100644
index 0000000..630aab0
--- /dev/null
+++ b/ld/testsuite/ld-gc/skip-map-discarded.s
@@ -0,0 +1,5 @@ 
+.globl __start
+__start:
+	.section	_foo
+foo:
+	.long	1