aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorTristan Gingold <gingold@adacore.com>2015-06-05 15:09:31 +0200
committerTristan Gingold <gingold@adacore.com>2015-06-12 11:24:36 +0200
commit3604cb1f8ca4a926039a9540d03bb224d84af3e1 (patch)
tree962d40b3cb6bd43d06960653b70af6d73a207e66 /ld
parentdb7858e227f3951c665410314fca62c77349ac24 (diff)
downloadfsf-binutils-gdb-3604cb1f8ca4a926039a9540d03bb224d84af3e1.zip
fsf-binutils-gdb-3604cb1f8ca4a926039a9540d03bb224d84af3e1.tar.gz
fsf-binutils-gdb-3604cb1f8ca4a926039a9540d03bb224d84af3e1.tar.bz2
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.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog13
-rw-r--r--ld/NEWS2
-rw-r--r--ld/ld.h3
-rw-r--r--ld/ld.texinfo15
-rw-r--r--ld/ldlang.c38
-rw-r--r--ld/ldlang.h3
-rw-r--r--ld/ldlex.h1
-rw-r--r--ld/ldmain.c2
-rw-r--r--ld/lexsup.c6
-rw-r--r--ld/testsuite/ChangeLog13
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage-1.l3
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage-1.s8
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage-1.t5
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage-2.l1
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage-2.t14
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage-3.l3
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage-3.s8
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage-3.t5
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage.exp69
-rw-r--r--ld/testsuite/ld-scripts/print-memory-usage.t14
20 files changed, 226 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 7fb7413..a12e5c9 100644
--- a/ld/ChangeLog
+++ b/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.
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 ab94a78..de4adbb 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -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.
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..34bc895
--- /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 0000000..ccb94bf
--- /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 0000000..97065b3
--- /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 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-2.t b/ld/testsuite/ld-scripts/print-memory-usage-2.t
new file mode 100644
index 0000000..11ce1ba
--- /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 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..917ff20
--- /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..eff51b6
--- /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 0000000..bbae75f
--- /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 0000000..5ff057a
--- /dev/null
+++ b/ld/testsuite/ld-scripts/print-memory-usage.t
@@ -0,0 +1,14 @@
+SECTIONS
+{
+ .text :
+ {
+ *(.text)
+ *(.pr)
+ }
+
+ .data :
+ {
+ *(.data)
+ *(.rw)
+ }
+}