From: nathan Date: Fri, 20 Feb 2004 15:31:09 +0000 (+0000) Subject: * ldgram.y (exp): Add two operand ALIGN. X-Git-Tag: reparent-point~3884 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9d05bf908e8e4ced9cae805592094f17d89d8e37;p=pf3gnuchains%2Fpf3gnuchains4x.git * ldgram.y (exp): Add two operand ALIGN. * ldexp.c (fold_binary): Add ALIGN_K case. * ld.texinfo (ALIGN): Document two operand version. * ld-scripts/align.{s,t,exp}: New. --- diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index d433e8cf36..17166e4276 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,7 +1,7 @@ 2004-02-20 Nathan Sidwell * binutils-all/objcopy.exp: Reorder arguments for POSIXLY_CORRECT - systems.p + systems. For older changes see ChangeLog-9303 diff --git a/ld/ChangeLog b/ld/ChangeLog index 3b3516ec23..12716fba5f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2004-02-20 Nathan Sidwell + + * ldgram.y (exp): Add two operand ALIGN. + * ldexp.c (fold_binary): Add ALIGN_K case. + * ld.texinfo (ALIGN): Document two operand version. + 2004-02-19 Nathan Sidwell * ldlang.c (map_input_to_output_sections): Initialize sections diff --git a/ld/ld.texinfo b/ld/ld.texinfo index ed7b3d1f6a..55f861e2e2 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -4383,17 +4383,25 @@ SECTIONS @{ @dots{} @end group @end smallexample -@item ALIGN(@var{exp}) -@kindex ALIGN(@var{exp}) +@item ALIGN(@var{align}) +@itemx ALIGN(@var{exp},@var{align}) +@kindex ALIGN(@var{align}) +@kindex ALIGN(@var{exp},@var{align}) @cindex round up location counter @cindex align location counter -Return the location counter (@code{.}) aligned to the next @var{exp} -boundary. -@code{ALIGN} doesn't change the value of the location counter---it just -does arithmetic on it. Here is an example which aligns the output -@code{.data} section to the next @code{0x2000} byte boundary after the -preceding section and sets a variable within the section to the next -@code{0x8000} boundary after the input sections: +@cindex round up expression +@cindex align expression +Return the location counter (@code{.}) or arbitrary expression aligned +to the next @var{align} boundary. The single operand @code{ALIGN} +doesn't change the value of the location counter---it just does +arithmetic on it. The two operand @code{ALIGN} allows an arbitrary +expression to be aligned upwards (@code{ALIGN(@var{align})} is +equivalent to @code{ALIGN(., @var{align})}). + +Here is an example which aligns the output @code{.data} section to the +next @code{0x2000} byte boundary after the preceding section and sets a +variable within the section to the next @code{0x8000} boundary after the +input sections: @smallexample @group SECTIONS @{ @dots{} diff --git a/ld/ldexp.c b/ld/ldexp.c index 2b973c3402..23a23924fe 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -394,6 +394,10 @@ fold_binary (etree_type *tree, result = other; break; + case ALIGN_K: + result.value = align_n (result.value, other.value); + break; + case DATA_SEGMENT_ALIGN: if (allocation_done != lang_first_phase_enum && current_section == abs_output_section diff --git a/ld/ldgram.y b/ld/ldgram.y index e885f7d55f..6c46c85447 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -804,6 +804,8 @@ exp : { $$ = exp_unop(ABSOLUTE, $3); } | ALIGN_K '(' exp ')' { $$ = exp_unop(ALIGN_K,$3); } + | ALIGN_K '(' exp ',' exp ')' + { $$ = exp_binop(ALIGN_K,$3,$5); } | DATA_SEGMENT_ALIGN '(' exp ',' exp ')' { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); } | DATA_SEGMENT_END '(' exp ')' diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 23e41a9526..b103d5bca5 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-02-20 Nathan Sidwell + + * ld-scripts/align.{s,t,exp}: New. + 2004-02-19 Nathan Sidwell * ld-scripts/data.{s,t,d,exp}: New. diff --git a/ld/testsuite/ld-scripts/align.exp b/ld/testsuite/ld-scripts/align.exp new file mode 100644 index 0000000000..3959e6da49 --- /dev/null +++ b/ld/testsuite/ld-scripts/align.exp @@ -0,0 +1,31 @@ +# Test ALIGN in a linker script. +# By Nathan Sidwell, CodeSourcery LLC +# Copyright 2004 +# Free Software Foundation, Inc. +# +# This file 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +set testname "ALIGN" + +if ![ld_assemble $as $srcdir/$subdir/align.s tmpdir/align.o] { + unresolved $testname + return +} + +if ![ld_simple_link $ld tmpdir/align "-T $srcdir/$subdir/align.t tmpdir/align.o"] { + fail $testname +} else { + pass $testname +} diff --git a/ld/testsuite/ld-scripts/align.s b/ld/testsuite/ld-scripts/align.s new file mode 100644 index 0000000000..c9bad232be --- /dev/null +++ b/ld/testsuite/ld-scripts/align.s @@ -0,0 +1,2 @@ + .text + .long 0 diff --git a/ld/testsuite/ld-scripts/align.t b/ld/testsuite/ld-scripts/align.t new file mode 100644 index 0000000000..49d6053a10 --- /dev/null +++ b/ld/testsuite/ld-scripts/align.t @@ -0,0 +1,8 @@ +SECTIONS +{ + .text : {*(.text)} + .data ALIGN(0x40) : AT (ALIGN (LOADADDR (.text) + SIZEOF (.text), 0x80)) + {} + ASSERT (LOADADDR(.data) == 0x80, "dyadic ALIGN broken") + ASSERT (ADDR(.data) == 0x40, "monadic ALIGN broken") +}