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:
parent
db7858e227
commit
3604cb1f8c
20 changed files with 226 additions and 0 deletions
13
ld/ChangeLog
13
ld/ChangeLog
|
@ -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.
|
||||
|
|
2
ld/NEWS
2
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
|
||||
|
|
3
ld/ld.h
3
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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
38
ld/ldlang.c
38
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -688,4 +688,7 @@ ldlang_override_segment_assignment
|
|||
extern void
|
||||
lang_ld_feature (char *);
|
||||
|
||||
extern void
|
||||
lang_print_memory_usage (void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
3
ld/testsuite/ld-scripts/print-memory-usage-1.l
Normal file
3
ld/testsuite/ld-scripts/print-memory-usage-1.l
Normal 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%
|
8
ld/testsuite/ld-scripts/print-memory-usage-1.s
Normal file
8
ld/testsuite/ld-scripts/print-memory-usage-1.s
Normal file
|
@ -0,0 +1,8 @@
|
|||
.text
|
||||
.globl text_symbol
|
||||
text_symbol:
|
||||
.space 32
|
||||
.data
|
||||
.globl data_symbol
|
||||
data_symbol:
|
||||
.space 32
|
5
ld/testsuite/ld-scripts/print-memory-usage-1.t
Normal file
5
ld/testsuite/ld-scripts/print-memory-usage-1.t
Normal file
|
@ -0,0 +1,5 @@
|
|||
MEMORY
|
||||
{
|
||||
ROM (RX) : ORIGIN = 0x1000, LENGTH = 1K
|
||||
RAM (W) : ORIGIN = 0x100000, LENGTH = 256K
|
||||
}
|
1
ld/testsuite/ld-scripts/print-memory-usage-2.l
Normal file
1
ld/testsuite/ld-scripts/print-memory-usage-2.l
Normal file
|
@ -0,0 +1 @@
|
|||
Memory region Used Size Region Size %age Used
|
14
ld/testsuite/ld-scripts/print-memory-usage-2.t
Normal file
14
ld/testsuite/ld-scripts/print-memory-usage-2.t
Normal file
|
@ -0,0 +1,14 @@
|
|||
SECTIONS
|
||||
{
|
||||
.text 0x1000 :
|
||||
{
|
||||
*(.text)
|
||||
*(.pr)
|
||||
}
|
||||
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
*(.rw)
|
||||
}
|
||||
}
|
3
ld/testsuite/ld-scripts/print-memory-usage-3.l
Normal file
3
ld/testsuite/ld-scripts/print-memory-usage-3.l
Normal 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%
|
8
ld/testsuite/ld-scripts/print-memory-usage-3.s
Normal file
8
ld/testsuite/ld-scripts/print-memory-usage-3.s
Normal file
|
@ -0,0 +1,8 @@
|
|||
.text
|
||||
.globl text_symbol
|
||||
text_symbol:
|
||||
.space 256*1024
|
||||
.data
|
||||
.globl data_symbol
|
||||
data_symbol:
|
||||
.space 32
|
5
ld/testsuite/ld-scripts/print-memory-usage-3.t
Normal file
5
ld/testsuite/ld-scripts/print-memory-usage-3.t
Normal file
|
@ -0,0 +1,5 @@
|
|||
MEMORY
|
||||
{
|
||||
ROM (RX) : ORIGIN = 0x100000, LENGTH = 1M
|
||||
RAM (W) : ORIGIN = 0x1000000, LENGTH = 2048M
|
||||
}
|
69
ld/testsuite/ld-scripts/print-memory-usage.exp
Normal file
69
ld/testsuite/ld-scripts/print-memory-usage.exp
Normal 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"
|
||||
}
|
||||
|
||||
}
|
||||
|
14
ld/testsuite/ld-scripts/print-memory-usage.t
Normal file
14
ld/testsuite/ld-scripts/print-memory-usage.t
Normal file
|
@ -0,0 +1,14 @@
|
|||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
*(.pr)
|
||||
}
|
||||
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
*(.rw)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue