From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12484 invoked by alias); 8 Nov 2004 11:51:36 -0000 Mailing-List: contact binutils-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sources.redhat.com Received: (qmail 12442 invoked from network); 8 Nov 2004 11:51:28 -0000 Received: from unknown (HELO smtp002.mail.ukl.yahoo.com) (217.12.11.33) by sourceware.org with SMTP; 8 Nov 2004 11:51:28 -0000 Received: from unknown (HELO Kindrogan) (compxsuk@81.136.112.227 with login) by smtp002.mail.ukl.yahoo.com with SMTP; 8 Nov 2004 11:51:27 -0000 Reply-To: From: "Jon Beniston" To: Subject: RE: MEMORY commands in link scripts Date: Mon, 08 Nov 2004 11:51:00 -0000 Organization: CompXs Message-ID: <000701c4c589$4574a400$0bbda8c0@Kindrogan> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0008_01C4C589.4574A400" In-Reply-To: <418F332D.4060007@redhat.com> X-SW-Source: 2004-11/txt/msg00132.txt.bz2 This is a multi-part message in MIME format. ------=_NextPart_000_0008_01C4C589.4574A400 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-length: 485 Hi, > > I still think it might be useful have ORIGIN() and LENGTH() > functions. Attached is a patch that implements these two functions. Cheers, Jon 2004-11-08 Jon Beniston * ld/ldlex.l: Allow ORIGIN and LENGTH in EXPRESSION. * ld/ldgram.y: Add ORIGIN and LENGTH expressions. * ld/ldexp.c (fold_name): Implement LENGTH() and ORIGIN() functions which return the length and origin of a memory. * ld/ld.texinfo: Document LENGTH() and ORIGIN() functions. ------=_NextPart_000_0008_01C4C589.4574A400 Content-Type: application/octet-stream; name="mem_origin_and_length.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="mem_origin_and_length.patch" Content-length: 6989 ? mem_origin_and_length.patch=0A= Index: ld.texinfo=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /cvs/src/src/ld/ld.texinfo,v=0A= retrieving revision 1.129=0A= diff -c -p -r1.129 ld.texinfo=0A= *** ld.texinfo 26 Oct 2004 18:41:51 -0000 1.129=0A= --- ld.texinfo 8 Nov 2004 11:38:45 -0000=0A= *************** the next available address within the me=0A= *** 3881,3886 ****=0A= --- 3881,3896 ----=0A= output sections directed to a memory region are too large for the=0A= region, the linker will issue an error message.=0A= =20=20=0A= + It is possible to access the origin and length of a memory in an=20=0A= + expression via the @code{ORIGIN(@var{memory})} and @code{LENGTH(@var{memo= ry})}=20=0A= + functions:=0A= +=20=0A= + @smallexample=0A= + @group=0A= + _fstack =3D ORIGIN(ram) + LENGTH(ram) - 4;=20=20=0A= + @end group=0A= + @end smallexample=0A= +=20=0A= @node PHDRS=0A= @section PHDRS Command=0A= @kindex PHDRS=0A= *************** SECTIONS @{ @dots{}=0A= *** 4656,4661 ****=0A= --- 4666,4675 ----=0A= @end group=0A= @end smallexample=0A= =20=20=0A= + @item LENGTH(@var{memory})=0A= + @kindex LENGTH(@var{memory})=0A= + Return the length of the named @var{memory}.=0A= +=20=0A= @item LOADADDR(@var{section})=0A= @kindex LOADADDR(@var{section})=0A= @cindex section load address in expression=0A= *************** This function is closely related to @cod=0A= *** 4680,4685 ****=0A= --- 4694,4703 ----=0A= use the @code{MEMORY} command to define discontinuous memory for the=0A= output file, the two functions are equivalent.=0A= =20=20=0A= + @item ORIGIN(@var{memory})=0A= + @kindex ORIGIN(@var{memory})=0A= + Return the origin of the named @var{memory}.=0A= +=20=0A= @item SEGMENT_START(@var{segment}, @var{default})=0A= @kindex SEGMENT_START(@var{segment}, @var{default})=0A= Return the base address of the named @var{segment}. If an explicit=0A= Index: ldexp.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /cvs/src/src/ld/ldexp.c,v=0A= retrieving revision 1.38=0A= diff -c -p -r1.38 ldexp.c=0A= *** ldexp.c 26 Oct 2004 18:41:51 -0000 1.38=0A= --- ldexp.c 8 Nov 2004 11:38:45 -0000=0A= *************** exp_print_token (token_code_type code, i=0A= *** 105,111 ****=0A= { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },=0A= { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },=0A= { DATA_SEGMENT_END, "DATA_SEGMENT_END" },=0A= ! { SEGMENT_START, "SEGMENT_START" }=0A= };=0A= unsigned int idx;=0A= =20=20=0A= --- 105,113 ----=0A= { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },=0A= { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },=0A= { DATA_SEGMENT_END, "DATA_SEGMENT_END" },=0A= ! { SEGMENT_START, "SEGMENT_START" },=0A= ! { ORIGIN, "ORIGIN" },=0A= ! { LENGTH, "LENGTH" }=0A= };=0A= unsigned int idx;=0A= =20=20=0A= *************** fold_name (etree_type *tree,=0A= *** 645,650 ****=0A= --- 647,678 ----=0A= }=0A= break;=0A= =20=20=0A= + case LENGTH:=0A= + {=0A= + lang_memory_region_type *mem;=0A= +=20=20=20=20=20=20=20=20=20=0A= + mem =3D lang_memory_region_lookup (tree->name.name, FALSE);=20=20= =0A= + if (mem !=3D NULL)=20=0A= + result =3D new_abs (mem->length);=0A= + else=20=20=20=20=20=20=20=20=20=20=0A= + einfo (_("%F%S: undefined memory `%s' referenced in expression\= n"),=0A= + tree->name.name);=0A= + }=0A= + break;=0A= +=20=0A= + case ORIGIN:=0A= + {=0A= + lang_memory_region_type *mem;=0A= +=20=20=20=20=20=20=20=20=20=0A= + mem =3D lang_memory_region_lookup (tree->name.name, FALSE);=20=20= =0A= + if (mem !=3D NULL)=20=0A= + result =3D new_abs (mem->origin);=0A= + else=20=20=20=20=20=20=20=20=20=20=0A= + einfo (_("%F%S: undefined memory `%s' referenced in expression\= n"),=0A= + tree->name.name);=0A= + }=0A= + break;=0A= +=20=0A= default:=0A= FAIL ();=0A= break;=0A= Index: ldgram.y=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /cvs/src/src/ld/ldgram.y,v=0A= retrieving revision 1.37=0A= diff -c -p -r1.37 ldgram.y=0A= *** ldgram.y 26 Oct 2004 18:41:51 -0000 1.37=0A= --- ldgram.y 8 Nov 2004 11:38:45 -0000=0A= *************** exp :=0A= *** 863,868 ****=0A= --- 863,872 ----=0A= { $$ =3D exp_binop (MIN_K, $3, $5 ); }=0A= | ASSERT_K '(' exp ',' NAME ')'=0A= { $$ =3D exp_assert ($3, $5); }=0A= + | ORIGIN '(' NAME ')'=0A= + { $$ =3D exp_nameop(ORIGIN, $3); }=0A= + | LENGTH '(' NAME ')'=0A= + { $$ =3D exp_nameop(LENGTH, $3); }=0A= ;=0A= =20=20=0A= =20=20=0A= Index: ldlex.l=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /cvs/src/src/ld/ldlex.l,v=0A= retrieving revision 1.27=0A= diff -c -p -r1.27 ldlex.l=0A= *** ldlex.l 26 Oct 2004 18:41:51 -0000 1.27=0A= --- ldlex.l 8 Nov 2004 11:38:48 -0000=0A= *************** V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([=0A= *** 242,252 ****=0A= ":" { RTOKEN(':'); }=0A= ";" { RTOKEN(';');}=0A= "MEMORY" { RTOKEN(MEMORY);}=0A= ! "ORIGIN" { RTOKEN(ORIGIN);}=0A= "VERSION" { RTOKEN(VERSIONK);}=0A= "BLOCK" { RTOKEN(BLOCK);}=0A= "BIND" { RTOKEN(BIND);}=0A= ! "LENGTH" { RTOKEN(LENGTH);}=0A= "ALIGN" { RTOKEN(ALIGN_K);}=0A= "DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN)= ;}=0A= "DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RE= LRO_END);}=0A= --- 242,252 ----=0A= ":" { RTOKEN(':'); }=0A= ";" { RTOKEN(';');}=0A= "MEMORY" { RTOKEN(MEMORY);}=0A= ! "ORIGIN" { RTOKEN(ORIGIN);}=0A= "VERSION" { RTOKEN(VERSIONK);}=0A= "BLOCK" { RTOKEN(BLOCK);}=0A= "BIND" { RTOKEN(BIND);}=0A= ! "LENGTH" { RTOKEN(LENGTH);}=0A= "ALIGN" { RTOKEN(ALIGN_K);}=0A= "DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN)= ;}=0A= "DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RE= LRO_END);}=0A= ------=_NextPart_000_0008_01C4C589.4574A400--