Add new ld option: --print-memory-usage

ld/
	* 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/
	* 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.t,
	* 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.
This commit is contained in:
Tristan Gingold 2015-06-05 15:09:31 +02:00
parent db7858e227
commit 3604cb1f8c
20 changed files with 226 additions and 0 deletions

View file

@ -1,3 +1,16 @@
2015-06-12 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-06-08 Nick Clifton <nickc@redhat.com>
* po/fr.po: Updated French Translation.

View file

@ -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

View file

@ -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;

View file

@ -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

View file

@ -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);
}
}

View file

@ -688,4 +688,7 @@ ldlang_override_segment_assignment
extern void
lang_ld_feature (char *);
extern void
lang_print_memory_usage (void);
#endif

View file

@ -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. */

View file

@ -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;

View file

@ -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;
}
}

View file

@ -1,3 +1,16 @@
2015-06-12 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.t,
* 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 Nick Clifton <nickc@redhat.com>
* ld-elf/compressed1d.d: Fix typo: iq200 -> iq2000.

View file

@ -0,0 +1,3 @@
Memory region Used Size Region Size %age Used
ROM: 32 B 1 KB 3.12%
RAM: 32 B 256 KB 0.01%

View file

@ -0,0 +1,8 @@
.text
.globl text_symbol
text_symbol:
.space 32
.data
.globl data_symbol
data_symbol:
.space 32

View file

@ -0,0 +1,5 @@
MEMORY
{
ROM (RX) : ORIGIN = 0x1000, LENGTH = 1K
RAM (W) : ORIGIN = 0x100000, LENGTH = 256K
}

View file

@ -0,0 +1 @@
Memory region Used Size Region Size %age Used

View file

@ -0,0 +1,14 @@
SECTIONS
{
.text 0x1000 :
{
*(.text)
*(.pr)
}
.data :
{
*(.data)
*(.rw)
}
}

View file

@ -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%

View file

@ -0,0 +1,8 @@
.text
.globl text_symbol
text_symbol:
.space 256*1024
.data
.globl data_symbol
data_symbol:
.space 32

View file

@ -0,0 +1,5 @@
MEMORY
{
ROM (RX) : ORIGIN = 0x100000, LENGTH = 1M
RAM (W) : ORIGIN = 0x1000000, LENGTH = 2048M
}

View file

@ -0,0 +1,69 @@
# 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.
# Mips adds MIPS.abiflags section.
# Spu, pdp11 memory is too small.
# Tic30 needs a special linker script.
# Tic54x interpret space values in bits.
# XCOFF has garbage collection
if { [istarget mips*-*-*]
|| [istarget spu*-*-*]
|| [istarget pdp11*-*-*]
|| [istarget tic30*-*-*]
|| [istarget tic54x*-*-*]
|| [istarget *-*-aix*]
|| [istarget *-*-xcoff*] } {
return
}
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-2.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"
}
}

View file

@ -0,0 +1,14 @@
SECTIONS
{
.text :
{
*(.text)
*(.pr)
}
.data :
{
*(.data)
*(.rw)
}
}