This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch]: ld - add --print-memory-usage option


Hello,


> On 08 Jun 2015, at 10:57, Nicholas Clifton <nickc@redhat.com> wrote:
> 
> Hi Tristan,
> 
>> this patch adds a new linker option to display memory usage on the target.
>> This feature is useful for embedded targets when you need to monitor the
>> amount of free memory.  As far as I know there is no binutils tool for that:
>> the output of size is too rough, and the output of 'objdump -hâ is not clear
>> enough.  Here is an example of output:
>> 
>> Memory region           size  total size  Ratio
>>            FLASH:     1524 B        3 MB    0.05%
>>             SRAM:    22536 B      256 KB    8.60%
>>            SDRAM:        0 GB       8 MB    0.00%
>> 
>> The names of memory region directly comes from the linker script.
> 
> I think that the names of the columns are slightly confusing.  "size" is really "Size of Region" and "total size" is "Size Occupied".  Also "Ratio" probably ought to be "%age Used" or something like that.
> 
> It might also help if the format of this layout is defined in the documentation somewhere so that it becomes fixed, and users can write tools to parse the output if they want to.

I have clarified the headline and added an example in the doc.

>> No regression on arm-elf.
> 
> What - no other targets ?  Please check x86 or x86_64 at least.

Also tested on GNU/linux x86 and x86_64.

>> Is it OK for trunk ?
> 
> I like it, but please could you add a testcase (or two) to check that the feature continues to work ?

In fact I added three testcases :-)

Tristan.

ld/
2015-06-05  Tristan Gingold  <gingold@adacore.com>

	* NEWS: Mention new option.
	* lexsup.c (parse_args): Handle --print-memory-usage.
	(ld_options): Add --print-memory-usage.
	* ldmain.c (main): Call lang_print_memory_usage.
	* ldlex.h (enum option_values): Add OPTION_PRINT_MEMORY_USAGE.
	* ldlang.h: Add prototype of lang_print_memory_usage.
	* ldlang.c (lang_print_memory_size, lang_print_memory_usage): New
	functions.
	* ld.texinfo (Options): Document --print-memory-usage.
	* ld.h (args_type): Add print_memory_usage field.

ld/testsuite/
2015-06-10  Tristan Gingold  <gingold@adacore.com>

	* ld-scripts/print-memory-usage-1.t,
	* ld-scripts/print-memory-usage-1.s,
	* ld-scripts/print-memory-usage-1.l,
	* ld-scripts/print-memory-usage-2.l,
	* ld-scripts/print-memory-usage-3.s,
	* ld-scripts/print-memory-usage-3.t,
	* ld-scripts/print-memory-usage-3.l,
	* ld-scripts/print-memory-usage.t: New tests.
	* ld-scripts/print-memory-usage.exp: Run them.


diff --git a/ld/ChangeLog b/ld/ChangeLog
index 84c268a..c5f1d1e 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,16 @@
+2015-06-05  Tristan Gingold  <gingold@adacore.com>
+
+	* NEWS: Mention new option.
+	* lexsup.c (parse_args): Handle --print-memory-usage.
+	(ld_options): Add --print-memory-usage.
+	* ldmain.c (main): Call lang_print_memory_usage.
+	* ldlex.h (enum option_values): Add OPTION_PRINT_MEMORY_USAGE.
+	* ldlang.h: Add prototype of lang_print_memory_usage.
+	* ldlang.c (lang_print_memory_size, lang_print_memory_usage): New
+	functions.
+	* ld.texinfo (Options): Document --print-memory-usage.
+	* ld.h (args_type): Add print_memory_usage field.
+
 2015-05-28  Catherine Moore  <clm@codesourcery.com>
 	    Paul Brook <paul@codesourcery.com>
 
diff --git a/ld/NEWS b/ld/NEWS
index 4e84d5a..140d3c9 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -7,6 +7,8 @@
 
 * Add support for LLVM plugin.
 
+* Add --print-memory-usage option to report memory blocks usage.
+
 Changes in 2.25:
 
 * PE binaries now once again contain real timestamps by default.  To disable
diff --git a/ld/ld.h b/ld/ld.h
index f804f9c..e6ebaae 100644
--- a/ld/ld.h
+++ b/ld/ld.h
@@ -161,6 +161,9 @@ typedef struct {
   /* If TRUE we'll just print the default output on stdout.  */
   bfd_boolean print_output_format;
 
+  /* If set, display the target memory usage (per memory region).  */
+  bfd_boolean print_memory_usage;
+
   /* Big or little endian as set on command line.  */
   enum endian_enum endian;
 
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index 0c5f884..e12b64a 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -1472,6 +1472,21 @@ Print the name of the default output format (perhaps influenced by
 other command-line options).  This is the string that would appear
 in an @code{OUTPUT_FORMAT} linker script command (@pxref{File Commands}).
 
+@kindex --print-memory-usage
+@cindex memory usage
+@item --print-memory-usage
+Print used size, total size and used size of memory regions created with
+the @ref{MEMORY} command.  This is useful on embedded targets to have a
+quick view of amount of free memory.  The format of the output has one
+headline and one line per region.  It is both human readable and easily
+parsable by tools.  Here is an example of an output:
+
+@smallexample
+Memory region         Used Size  Region Size  %age Used
+             ROM:        256 KB         1 MB     25.00%
+             RAM:          32 B         2 GB      0.00%
+@end smallexample
+
 @cindex help
 @cindex usage
 @kindex --help
diff --git a/ld/ldlang.c b/ld/ldlang.c
index c96c21f..b816d69 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -8133,3 +8133,41 @@ lang_ld_feature (char *str)
       p = q;
     }
 }
+
+/* Pretty print memory amount.  */
+
+static void
+lang_print_memory_size (bfd_vma sz)
+{
+  if ((sz & 0x3fffffff) == 0)
+    printf ("%10" BFD_VMA_FMT "u GB", sz >> 30);
+  else if ((sz & 0xfffff) == 0)
+    printf ("%10" BFD_VMA_FMT "u MB", sz >> 20);
+  else if ((sz & 0x3ff) == 0)
+    printf ("%10" BFD_VMA_FMT "u KB", sz >> 10);
+  else
+    printf (" %10" BFD_VMA_FMT "u B", sz);
+}
+
+/* Implement --print-memory-usage: disply per region memory usage.  */
+
+void
+lang_print_memory_usage (void)
+{
+  lang_memory_region_type *r;
+
+  printf ("Memory region         Used Size  Region Size  %%age Used\n");
+  for (r = lang_memory_region_list; r->next != NULL; r = r->next)
+    {
+      bfd_vma used_length = r->current - r->origin;
+      double percent;
+
+      printf ("%16s: ",r->name_list.name);
+      lang_print_memory_size (used_length);
+      lang_print_memory_size ((bfd_vma) r->length);
+
+      percent = used_length * 100.0 / r->length;
+
+      printf ("    %6.2f%%\n", percent);
+    }
+}
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 7cb7610..475cf71 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -688,4 +688,7 @@ ldlang_override_segment_assignment
 extern void
 lang_ld_feature (char *);
 
+extern void
+lang_print_memory_usage (void);
+
 #endif
diff --git a/ld/ldlex.h b/ld/ldlex.h
index f174c28..7885de0 100644
--- a/ld/ldlex.h
+++ b/ld/ldlex.h
@@ -142,6 +142,7 @@ enum option_values
   OPTION_IGNORE_UNRESOLVED_SYMBOL,
   OPTION_PUSH_STATE,
   OPTION_POP_STATE,
+  OPTION_PRINT_MEMORY_USAGE,
 };
 
 /* The initial parser states.  */
diff --git a/ld/ldmain.c b/ld/ldmain.c
index a7b72bd..0492034 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -440,6 +440,8 @@ main (int argc, char **argv)
     output_cref (config.map_file != NULL ? config.map_file : stdout);
   if (nocrossref_list != NULL)
     check_nocrossrefs ();
+  if (command_line.print_memory_usage)
+    lang_print_memory_usage ();
 #if 0
   {
     struct bfd_link_hash_entry * h;
diff --git a/ld/lexsup.c b/ld/lexsup.c
index b618241..b884d9a 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -523,6 +523,8 @@ static const struct ld_option ld_options[] =
   { {"pop-state", no_argument, NULL, OPTION_POP_STATE},
     '\0', NULL, N_("Pop state of flags governing input file handling"),
     TWO_DASHES },
+  { {"print-memory-usage", no_argument, NULL, OPTION_PRINT_MEMORY_USAGE},
+    '\0', NULL, N_("Report target memory usage"), TWO_DASHES },
 };
 
 #define OPTION_COUNT ARRAY_SIZE (ld_options)
@@ -1490,6 +1492,10 @@ parse_args (unsigned argc, char **argv)
 	      free (oldp);
 	    }
 	  break;
+
+	case OPTION_PRINT_MEMORY_USAGE:
+	  command_line.print_memory_usage = TRUE;
+	  break;
 	}
     }
 
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index e51f16b..0aa81fb 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,15 @@
+2015-06-10  Tristan Gingold  <gingold@adacore.com>
+
+	* ld-scripts/print-memory-usage-1.t,
+	* ld-scripts/print-memory-usage-1.s,
+	* ld-scripts/print-memory-usage-1.l,
+	* ld-scripts/print-memory-usage-2.l,
+	* ld-scripts/print-memory-usage-3.s,
+	* ld-scripts/print-memory-usage-3.t,
+	* ld-scripts/print-memory-usage-3.l,
+	* ld-scripts/print-memory-usage.t: New tests.
+	* ld-scripts/print-memory-usage.exp: Run them.
+
 2015-06-05  Alan Modra  <amodra@gmail.com>
 
 	* ld-powerpc/ppc476-shared.s,
diff --git a/ld/testsuite/ld-scripts/print-memory-usage-1.l b/ld/testsuite/ld-scripts/print-memory-usage-1.l
new file mode 100644
index 0000000..543b0cb
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage-1.l
@@ -0,0 +1,3 @@
+Memory region         Used Size  Region Size  %age Used
+             ROM:           4 B         1 KB      0.39%
+             RAM:           4 B       256 KB      0.00%
diff --git a/ld/testsuite/ld-scripts/print-memory-usage-1.s b/ld/testsuite/ld-scripts/print-memory-usage-1.s
new file mode 100644
index 0000000..d7b65b0
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage-1.s
@@ -0,0 +1,8 @@
+	.text
+	.globl text_symbol
+text_symbol:	
+	.long	1
+	.data
+	.globl data_symbol
+data_symbol:	
+	.long	2
diff --git a/ld/testsuite/ld-scripts/print-memory-usage-1.t b/ld/testsuite/ld-scripts/print-memory-usage-1.t
new file mode 100644
index 0000000..c4abf9f
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage-1.t
@@ -0,0 +1,5 @@
+MEMORY
+{
+  ROM (RX) : ORIGIN = 0x0, LENGTH = 1K
+  RAM (W)  : ORIGIN = 0x100000, LENGTH = 256K
+}
diff --git a/ld/testsuite/ld-scripts/print-memory-usage-2.l b/ld/testsuite/ld-scripts/print-memory-usage-2.l
new file mode 100644
index 0000000..8797120
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage-2.l
@@ -0,0 +1 @@
+Memory region         Used Size  Region Size  %age Used
diff --git a/ld/testsuite/ld-scripts/print-memory-usage-3.l b/ld/testsuite/ld-scripts/print-memory-usage-3.l
new file mode 100644
index 0000000..1044101
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage-3.l
@@ -0,0 +1,3 @@
+Memory region         Used Size  Region Size  %age Used
+             ROM:        256 KB         1 MB     25.00%
+             RAM:          32 B         2 GB      0.00%
diff --git a/ld/testsuite/ld-scripts/print-memory-usage-3.s b/ld/testsuite/ld-scripts/print-memory-usage-3.s
new file mode 100644
index 0000000..f1824f1
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage-3.s
@@ -0,0 +1,8 @@
+	.text
+	.globl text_symbol
+text_symbol:	
+	.space	256*1024
+	.data
+	.globl data_symbol
+data_symbol:	
+	.space	32
diff --git a/ld/testsuite/ld-scripts/print-memory-usage-3.t b/ld/testsuite/ld-scripts/print-memory-usage-3.t
new file mode 100644
index 0000000..0b23263
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage-3.t
@@ -0,0 +1,5 @@
+MEMORY
+{
+  ROM (RX) : ORIGIN = 0x0, LENGTH = 1M
+  RAM (W)  : ORIGIN = 0x1000000, LENGTH = 2048M
+}
diff --git a/ld/testsuite/ld-scripts/print-memory-usage.exp b/ld/testsuite/ld-scripts/print-memory-usage.exp
new file mode 100644
index 0000000..7deaf0f
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage.exp
@@ -0,0 +1,54 @@
+# Test --print-memory-usage linker functionality
+# By Tristan Gingold, AdaCore
+#   Copyright (C) 2015 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+run_ld_link_tests {
+    {
+	"print-memory-usage-1"
+	"-T print-memory-usage-1.t -T print-memory-usage.t --print-memory-usage"
+	""
+	""
+	{ "print-memory-usage-1.s" }
+	{ { ld "print-memory-usage-1.l" } }
+	"print-memory-usage-1"
+    }
+
+    {
+	"print-memory-usage-2"
+	"-T print-memory-usage.t --print-memory-usage"
+	""
+	""
+	{ "print-memory-usage-1.s" }
+	{ { ld "print-memory-usage-2.l" } }
+	"print-memory-usage-2"
+    }
+
+    {
+	"print-memory-usage-3"
+	"-T print-memory-usage-3.t -T print-memory-usage.t --print-memory-usage"
+	""
+	""
+	{ "print-memory-usage-3.s" }
+	{ { ld "print-memory-usage-3.l" } }
+	"print-memory-usage-3"
+    }
+
+}
+
diff --git a/ld/testsuite/ld-scripts/print-memory-usage.t b/ld/testsuite/ld-scripts/print-memory-usage.t
new file mode 100644
index 0000000..d826211
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage.t
@@ -0,0 +1,15 @@
+SECTIONS
+{
+  . = 0;
+  .text :
+  {
+    *(.text)
+    *(.pr)
+  }
+
+  .data :
+  {
+    *(.data)
+    *(.rw)
+  }
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]