From 4006703d71641cd35a045f407a5c8bc85459978b Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Sun, 6 Jul 2008 13:38:37 +0000 Subject: [PATCH] * ld.texinfo (File Commands): Document that INCLUDE can be used in several different places. * ldgram.y (statement, memory_spec, section): Allow INCLUDE. (memory, memory_spec_list): Simplify BNF (memory_spec_list_opt): New rule. * ldlex.l (INCLUDE): Recognize in EXPRESSION. testsuite/ * ld-scripts/include-1.d: New. * ld-scripts/include-1.t: New. * ld-scripts/include-data.t: New. * ld-scripts/include-mem.t: New. * ld-scripts/include-ram.t: New. * ld-scripts/include-sections.t: New. * ld-scripts/include-subdata.t: New. * ld-scripts/include.exp: New. * ld-scripts/include.s: New. --- ld/ChangeLog | 9 ++++++ ld/ld.texinfo | 3 ++ ld/ldgram.y | 21 ++++++++++--- ld/ldlex.l | 2 +- ld/testsuite/ChangeLog | 12 ++++++++ ld/testsuite/ld-scripts/include-1.d | 11 +++++++ ld/testsuite/ld-scripts/include-1.t | 4 +++ ld/testsuite/ld-scripts/include-data.t | 4 +++ ld/testsuite/ld-scripts/include-mem.t | 5 ++++ ld/testsuite/ld-scripts/include-ram.t | 1 + ld/testsuite/ld-scripts/include-sections.t | 4 +++ ld/testsuite/ld-scripts/include-subdata.t | 2 ++ ld/testsuite/ld-scripts/include.exp | 35 ++++++++++++++++++++++ ld/testsuite/ld-scripts/include.s | 9 ++++++ 14 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 ld/testsuite/ld-scripts/include-1.d create mode 100644 ld/testsuite/ld-scripts/include-1.t create mode 100644 ld/testsuite/ld-scripts/include-data.t create mode 100644 ld/testsuite/ld-scripts/include-mem.t create mode 100644 ld/testsuite/ld-scripts/include-ram.t create mode 100644 ld/testsuite/ld-scripts/include-sections.t create mode 100644 ld/testsuite/ld-scripts/include-subdata.t create mode 100644 ld/testsuite/ld-scripts/include.exp create mode 100644 ld/testsuite/ld-scripts/include.s diff --git a/ld/ChangeLog b/ld/ChangeLog index 88e20f21abe..8ad99bc0f3c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2008-07-06 Nathan Sidwell + + * ld.texinfo (File Commands): Document that INCLUDE can be used in + several different places. + * ldgram.y (statement, memory_spec, section): Allow INCLUDE. + (memory, memory_spec_list): Simplify BNF + (memory_spec_list_opt): New rule. + * ldlex.l (INCLUDE): Recognize in EXPRESSION. + 2008-06-20 Alan Modra * emultempl/spuelf.em (gld${EMULATION_NAME}_finish): Make "can not diff --git a/ld/ld.texinfo b/ld/ld.texinfo index d0c0335d862..4400524cea0 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -2764,6 +2764,9 @@ be searched for in the current directory, and in any directory specified with the @option{-L} option. You can nest calls to @code{INCLUDE} up to 10 levels deep. +You can place @code{INCLUDE} directives at the top level, in @code{MEMORY} or +@code{SECTIONS} commands, or in output section descriptions. + @item INPUT(@var{file}, @var{file}, @dots{}) @itemx INPUT(@var{file} @var{file} @dots{}) @kindex INPUT(@var{files}) diff --git a/ld/ldgram.y b/ld/ldgram.y index f481f54c7d4..1149e6b29c4 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -577,6 +577,10 @@ statement: | ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')' end { ldlex_popstate (); lang_add_assignment (exp_assert ($4, $6)); } + | INCLUDE filename + { ldlex_script (); ldfile_open_command_file($2); } + statement_list_opt END + { ldlex_popstate (); } ; statement_list: @@ -668,13 +672,14 @@ opt_comma: memory: - MEMORY '{' memory_spec memory_spec_list '}' + MEMORY '{' memory_spec_list_opt '}' ; +memory_spec_list_opt: memory_spec_list | ; + memory_spec_list: - memory_spec_list memory_spec - | memory_spec_list ',' memory_spec - | + memory_spec_list opt_comma memory_spec + | memory_spec ; @@ -683,6 +688,10 @@ memory_spec: NAME attributes_opt ':' origin_spec opt_comma length_spec {} + | INCLUDE filename + { ldlex_script (); ldfile_open_command_file($2); } + memory_spec_list_opt END + { ldlex_popstate (); } ; origin_spec: @@ -966,6 +975,10 @@ section: NAME { ldlex_expression(); } lang_add_assignment (exp_assop ('=', ".", $3)); } '{' sec_or_group_p1 '}' + | INCLUDE filename + { ldlex_script (); ldfile_open_command_file($2); } + sec_or_group_p1 END + { ldlex_popstate (); } ; type: diff --git a/ld/ldlex.l b/ld/ldlex.l index 62610cffed0..aa06d5460d9 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -307,7 +307,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "org" { RTOKEN(ORIGIN);} "l" { RTOKEN( LENGTH);} "len" { RTOKEN( LENGTH);} -"INCLUDE" { RTOKEN(INCLUDE);} +"INCLUDE" { RTOKEN(INCLUDE);} "PHDRS" { RTOKEN (PHDRS); } "AT" { RTOKEN(AT);} "SUBALIGN" { RTOKEN(SUBALIGN);} diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 34d75e611ea..1d9610c97d4 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2008-07-06 Nathan Sidwell + + * ld-scripts/include-1.d: New. + * ld-scripts/include-1.t: New. + * ld-scripts/include-data.t: New. + * ld-scripts/include-mem.t: New. + * ld-scripts/include-ram.t: New. + * ld-scripts/include-sections.t: New. + * ld-scripts/include-subdata.t: New. + * ld-scripts/include.exp: New. + * ld-scripts/include.s: New. + 2008-06-29 Andreas Schwab * ld-m68k/got-1.s: New file. diff --git a/ld/testsuite/ld-scripts/include-1.d b/ld/testsuite/ld-scripts/include-1.d new file mode 100644 index 00000000000..fc7617be5d2 --- /dev/null +++ b/ld/testsuite/ld-scripts/include-1.d @@ -0,0 +1,11 @@ +# name: include-1 +# source: include.s +# ld: -T include-1.t +# objdump: -w -h + +.*: file format .* + +Sections: +Idx +Name +Size +VMA +LMA +File off +Algn +Flags + 0 .text 0+000000c 0+0000000 0+0000000 [0-9a-f]+ 2\*\*[0-9]+ CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .data 0+000000c 0+0100000 0+0100000 [0-9a-f]+ 2\*\*[0-9]+ CONTENTS, ALLOC, LOAD, DATA diff --git a/ld/testsuite/ld-scripts/include-1.t b/ld/testsuite/ld-scripts/include-1.t new file mode 100644 index 00000000000..cf2f8cdeaf3 --- /dev/null +++ b/ld/testsuite/ld-scripts/include-1.t @@ -0,0 +1,4 @@ + +INCLUDE include-mem.t +_start = 0x1000; +INCLUDE include-sections.t diff --git a/ld/testsuite/ld-scripts/include-data.t b/ld/testsuite/ld-scripts/include-data.t new file mode 100644 index 00000000000..eddbbb39fb5 --- /dev/null +++ b/ld/testsuite/ld-scripts/include-data.t @@ -0,0 +1,4 @@ +.data : { +INCLUDE include-subdata.t +__end = .; +}>ram diff --git a/ld/testsuite/ld-scripts/include-mem.t b/ld/testsuite/ld-scripts/include-mem.t new file mode 100644 index 00000000000..8aa65b147dc --- /dev/null +++ b/ld/testsuite/ld-scripts/include-mem.t @@ -0,0 +1,5 @@ + +MEMORY { + rom (rwx) : ORIGIN = 0, LENGTH = 0x1000 + INCLUDE include-ram.t +} diff --git a/ld/testsuite/ld-scripts/include-ram.t b/ld/testsuite/ld-scripts/include-ram.t new file mode 100644 index 00000000000..f7eaf0eb3e3 --- /dev/null +++ b/ld/testsuite/ld-scripts/include-ram.t @@ -0,0 +1 @@ +ram (rw) : ORIGIN = 0x100000, LENGTH = 512 diff --git a/ld/testsuite/ld-scripts/include-sections.t b/ld/testsuite/ld-scripts/include-sections.t new file mode 100644 index 00000000000..d5e500b01af --- /dev/null +++ b/ld/testsuite/ld-scripts/include-sections.t @@ -0,0 +1,4 @@ +SECTIONS { + .text : { *(.text) } >rom + INCLUDE include-data.t +} diff --git a/ld/testsuite/ld-scripts/include-subdata.t b/ld/testsuite/ld-scripts/include-subdata.t new file mode 100644 index 00000000000..136c9f4926d --- /dev/null +++ b/ld/testsuite/ld-scripts/include-subdata.t @@ -0,0 +1,2 @@ + *(.data) + diff --git a/ld/testsuite/ld-scripts/include.exp b/ld/testsuite/ld-scripts/include.exp new file mode 100644 index 00000000000..3c73c6b3653 --- /dev/null +++ b/ld/testsuite/ld-scripts/include.exp @@ -0,0 +1,35 @@ +# Test for proper diagnosis of overflowed memory regions. +# Copyright 2008 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. + +load_lib ld-lib.exp + +set old_ldflags $LDFLAGS +if { [istarget spu*-*-*] } { + set LDFLAGS "$LDFLAGS --no-overlays" +} + +set test_list [lsort [glob -nocomplain $srcdir/$subdir/include*.d]] +foreach test_file $test_list { + set test_name [file rootname $test_file] + set map_file "tmpdir/[file tail $test_name].map" + verbose $test_name + run_dump_test $test_name +} +set LDFLAGS $old_ldflags diff --git a/ld/testsuite/ld-scripts/include.s b/ld/testsuite/ld-scripts/include.s new file mode 100644 index 00000000000..bf12fbe82ec --- /dev/null +++ b/ld/testsuite/ld-scripts/include.s @@ -0,0 +1,9 @@ + .section .text, "ax", "progbits" + .4byte 0x11223344 + .4byte 0x55667788 + .4byte 0x99aabbcc + + .section .data, "aw", "progbits" + .4byte 0x01020304 + .4byte 0x05060708 + .4byte 0x090a0b0c -- 2.30.2