From 3604cb1f8ca4a926039a9540d03bb224d84af3e1 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Fri, 5 Jun 2015 15:09:31 +0200 Subject: [PATCH] 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. --- ld/ChangeLog | 13 ++++ ld/NEWS | 2 + ld/ld.h | 3 + ld/ld.texinfo | 15 ++++ ld/ldlang.c | 38 ++++++++++ ld/ldlang.h | 3 + ld/ldlex.h | 1 + ld/ldmain.c | 2 + ld/lexsup.c | 6 ++ ld/testsuite/ChangeLog | 13 ++++ .../ld-scripts/print-memory-usage-1.l | 3 + .../ld-scripts/print-memory-usage-1.s | 8 +++ .../ld-scripts/print-memory-usage-1.t | 5 ++ .../ld-scripts/print-memory-usage-2.l | 1 + .../ld-scripts/print-memory-usage-2.t | 14 ++++ .../ld-scripts/print-memory-usage-3.l | 3 + .../ld-scripts/print-memory-usage-3.s | 8 +++ .../ld-scripts/print-memory-usage-3.t | 5 ++ .../ld-scripts/print-memory-usage.exp | 69 +++++++++++++++++++ ld/testsuite/ld-scripts/print-memory-usage.t | 14 ++++ 20 files changed, 226 insertions(+) create mode 100644 ld/testsuite/ld-scripts/print-memory-usage-1.l create mode 100644 ld/testsuite/ld-scripts/print-memory-usage-1.s create mode 100644 ld/testsuite/ld-scripts/print-memory-usage-1.t create mode 100644 ld/testsuite/ld-scripts/print-memory-usage-2.l create mode 100644 ld/testsuite/ld-scripts/print-memory-usage-2.t create mode 100644 ld/testsuite/ld-scripts/print-memory-usage-3.l create mode 100644 ld/testsuite/ld-scripts/print-memory-usage-3.s create mode 100644 ld/testsuite/ld-scripts/print-memory-usage-3.t create mode 100644 ld/testsuite/ld-scripts/print-memory-usage.exp create mode 100644 ld/testsuite/ld-scripts/print-memory-usage.t diff --git a/ld/ChangeLog b/ld/ChangeLog index 7fb7413c13..a12e5c9106 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,16 @@ +2015-06-12 Tristan Gingold + + * 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 * po/fr.po: Updated French Translation. diff --git a/ld/NEWS b/ld/NEWS index 4e84d5a5a6..140d3c9590 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 f804f9c069..e6ebaae90f 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 0c5f884b5f..e12b64affb 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 c96c21fd4e..b816d698fc 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 7cb7610e47..475cf71c21 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 f174c28823..7885de0282 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 a7b72bd63f..04920343e1 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 b618241f0d..b884d9a77f 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 ab94a78104..de4adbb909 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2015-06-12 Tristan Gingold + + * 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 * ld-elf/compressed1d.d: Fix typo: iq200 -> iq2000. 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 0000000000..34bc8951c0 --- /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: 32 B 1 KB 3.12% + RAM: 32 B 256 KB 0.01% 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 0000000000..ccb94bff03 --- /dev/null +++ b/ld/testsuite/ld-scripts/print-memory-usage-1.s @@ -0,0 +1,8 @@ + .text + .globl text_symbol +text_symbol: + .space 32 + .data + .globl data_symbol +data_symbol: + .space 32 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 0000000000..97065b30c5 --- /dev/null +++ b/ld/testsuite/ld-scripts/print-memory-usage-1.t @@ -0,0 +1,5 @@ +MEMORY +{ + ROM (RX) : ORIGIN = 0x1000, 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 0000000000..8797120cee --- /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-2.t b/ld/testsuite/ld-scripts/print-memory-usage-2.t new file mode 100644 index 0000000000..11ce1ba243 --- /dev/null +++ b/ld/testsuite/ld-scripts/print-memory-usage-2.t @@ -0,0 +1,14 @@ +SECTIONS +{ + .text 0x1000 : + { + *(.text) + *(.pr) + } + + .data : + { + *(.data) + *(.rw) + } +} 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 0000000000..1044101c98 --- /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 0000000000..917ff20cfa --- /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 0000000000..eff51b6bed --- /dev/null +++ b/ld/testsuite/ld-scripts/print-memory-usage-3.t @@ -0,0 +1,5 @@ +MEMORY +{ + ROM (RX) : ORIGIN = 0x100000, 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 0000000000..bbae75f181 --- /dev/null +++ b/ld/testsuite/ld-scripts/print-memory-usage.exp @@ -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" + } + +} + 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 0000000000..5ff057a5e3 --- /dev/null +++ b/ld/testsuite/ld-scripts/print-memory-usage.t @@ -0,0 +1,14 @@ +SECTIONS +{ + .text : + { + *(.text) + *(.pr) + } + + .data : + { + *(.data) + *(.rw) + } +}