This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

allow INCLUDE in more places


I got stuck trying to INCLUDE linker fragments because INCLUDE is currently only allowed at the top level. This patch adds grammar fragments to allow INCLUDE inside MEMORY and SECTIONS elements, and also inside output section directives.

The change to the lexer to recognize INCLUDE inside expressions is necessary because the MEMORY elements are all parsed as EXPRESSIONS and we never return to SCRIPT lexing (note the lack of element terminators).

With this patch I'm able to create somewhat more flexible linker scripts.

ok?

nathan
--
Nathan Sidwell    ::   http://www.codesourcery.com   ::         CodeSourcery

2008-07-03  Nathan Sidwell  <nathan@codesourcery.com>

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

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

Index: ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.217
diff -c -3 -p -r1.217 ld.texinfo
*** ld.texinfo	16 Jun 2008 15:10:13 -0000	1.217
--- ld.texinfo	2 Jul 2008 13:20:32 -0000
*************** be searched for in the current directory
*** 2764,2769 ****
--- 2764,2772 ----
  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})
Index: ldgram.y
===================================================================
RCS file: /cvs/src/src/ld/ldgram.y,v
retrieving revision 1.57
diff -c -3 -p -r1.57 ldgram.y
*** ldgram.y	25 Jan 2008 12:03:37 -0000	1.57
--- ldgram.y	2 Jul 2008 13:20:33 -0000
*************** statement:
*** 577,582 ****
--- 577,586 ----
  	| 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:
*************** opt_comma:
*** 668,680 ****
  
  
  memory:
! 		MEMORY '{' memory_spec memory_spec_list '}'
  	;
  
  memory_spec_list:
! 		memory_spec_list memory_spec
! 	|	memory_spec_list ',' memory_spec
! 	|
  	;
  
  
--- 672,685 ----
  
  
  memory:
! 		MEMORY '{' memory_spec_list_opt '}'
  	;
  
+ memory_spec_list_opt: memory_spec_list | ;
+ 
  memory_spec_list:
! 		memory_spec_list opt_comma memory_spec
! 	|	memory_spec
  	;
  
  
*************** memory_spec: 	NAME
*** 683,688 ****
--- 688,697 ----
  		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:
*************** section:	NAME 		{ ldlex_expression(); }
*** 966,971 ****
--- 975,984 ----
  		  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:
Index: ldlex.l
===================================================================
RCS file: /cvs/src/src/ld/ldlex.l,v
retrieving revision 1.40
diff -c -3 -p -r1.40 ldlex.l
*** ldlex.l	25 Jan 2008 12:03:37 -0000	1.40
--- ldlex.l	2 Jul 2008 13:20:33 -0000
*************** V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([
*** 307,313 ****
  <BOTH,SCRIPT>"org"			{ RTOKEN(ORIGIN);}
  <BOTH,SCRIPT>"l"			{ RTOKEN( LENGTH);}
  <BOTH,SCRIPT>"len"			{ RTOKEN( LENGTH);}
! <BOTH,SCRIPT>"INCLUDE"			{ RTOKEN(INCLUDE);}
  <BOTH,SCRIPT>"PHDRS"			{ RTOKEN (PHDRS); }
  <EXPRESSION,BOTH,SCRIPT>"AT"		{ RTOKEN(AT);}
  <EXPRESSION,BOTH,SCRIPT>"SUBALIGN"	{ RTOKEN(SUBALIGN);}
--- 307,313 ----
  <BOTH,SCRIPT>"org"			{ RTOKEN(ORIGIN);}
  <BOTH,SCRIPT>"l"			{ RTOKEN( LENGTH);}
  <BOTH,SCRIPT>"len"			{ RTOKEN( LENGTH);}
! <EXPRESSION,BOTH,SCRIPT>"INCLUDE"	{ RTOKEN(INCLUDE);}
  <BOTH,SCRIPT>"PHDRS"			{ RTOKEN (PHDRS); }
  <EXPRESSION,BOTH,SCRIPT>"AT"		{ RTOKEN(AT);}
  <EXPRESSION,BOTH,SCRIPT>"SUBALIGN"	{ RTOKEN(SUBALIGN);}
Index: testsuite/ld-scripts/include-1.d
===================================================================
RCS file: testsuite/ld-scripts/include-1.d
diff -N testsuite/ld-scripts/include-1.d
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include-1.d	2 Jul 2008 13:20:36 -0000
***************
*** 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
Index: testsuite/ld-scripts/include-1.t
===================================================================
RCS file: testsuite/ld-scripts/include-1.t
diff -N testsuite/ld-scripts/include-1.t
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include-1.t	2 Jul 2008 13:20:36 -0000
***************
*** 0 ****
--- 1,4 ----
+ 
+ INCLUDE include-mem.t
+ _start = 0x1000;
+ INCLUDE include-sections.t
Index: testsuite/ld-scripts/include-data.t
===================================================================
RCS file: testsuite/ld-scripts/include-data.t
diff -N testsuite/ld-scripts/include-data.t
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include-data.t	2 Jul 2008 13:20:36 -0000
***************
*** 0 ****
--- 1,4 ----
+ .data : {
+ INCLUDE include-subdata.t
+ __end = .;
+ }>ram
Index: testsuite/ld-scripts/include-mem.t
===================================================================
RCS file: testsuite/ld-scripts/include-mem.t
diff -N testsuite/ld-scripts/include-mem.t
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include-mem.t	2 Jul 2008 13:20:36 -0000
***************
*** 0 ****
--- 1,5 ----
+ 
+ MEMORY {
+   rom (rwx) : ORIGIN = 0, LENGTH = 0x1000
+   INCLUDE include-ram.t
+ }
Index: testsuite/ld-scripts/include-ram.t
===================================================================
RCS file: testsuite/ld-scripts/include-ram.t
diff -N testsuite/ld-scripts/include-ram.t
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include-ram.t	2 Jul 2008 13:20:36 -0000
***************
*** 0 ****
--- 1 ----
+ ram (rw) : ORIGIN = 0x100000, LENGTH = 512
Index: testsuite/ld-scripts/include-sections.t
===================================================================
RCS file: testsuite/ld-scripts/include-sections.t
diff -N testsuite/ld-scripts/include-sections.t
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include-sections.t	2 Jul 2008 13:20:36 -0000
***************
*** 0 ****
--- 1,4 ----
+ SECTIONS {
+ 	 .text : { *(.text) } >rom
+ 	 INCLUDE include-data.t
+ }
Index: testsuite/ld-scripts/include-subdata.t
===================================================================
RCS file: testsuite/ld-scripts/include-subdata.t
diff -N testsuite/ld-scripts/include-subdata.t
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include-subdata.t	2 Jul 2008 13:20:36 -0000
***************
*** 0 ****
--- 1,2 ----
+  *(.data)
+ 
Index: testsuite/ld-scripts/include.exp
===================================================================
RCS file: testsuite/ld-scripts/include.exp
diff -N testsuite/ld-scripts/include.exp
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include.exp	2 Jul 2008 13:20:36 -0000
***************
*** 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
Index: testsuite/ld-scripts/include.s
===================================================================
RCS file: testsuite/ld-scripts/include.s
diff -N testsuite/ld-scripts/include.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/ld-scripts/include.s	2 Jul 2008 13:20:36 -0000
***************
*** 0 ****
--- 1,9 ----
+ 	.section .text, "ax", "progbits"
+ 	.4byte 0x11223344
+ 	.4byte 0x55667788
+ 	.4byte 0x99aabbcc
+ 
+ 	.section .data, "aw", "progbits"
+ 	.4byte 0x01020304
+ 	.4byte 0x05060708
+ 	.4byte 0x090a0b0c

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]