* ldgram.y (exp): Add two operand ALIGN.
authorNathan Sidwell <nathan@codesourcery.com>
Fri, 20 Feb 2004 15:31:10 +0000 (15:31 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Fri, 20 Feb 2004 15:31:10 +0000 (15:31 +0000)
* ldexp.c (fold_binary): Add ALIGN_K case.
* ld.texinfo (ALIGN): Document two operand version.
* ld-scripts/align.{s,t,exp}: New.

binutils/testsuite/ChangeLog
ld/ChangeLog
ld/ld.texinfo
ld/ldexp.c
ld/ldgram.y
ld/testsuite/ChangeLog
ld/testsuite/ld-scripts/align.exp [new file with mode: 0644]
ld/testsuite/ld-scripts/align.s [new file with mode: 0644]
ld/testsuite/ld-scripts/align.t [new file with mode: 0644]

index d433e8c..17166e4 100644 (file)
@@ -1,7 +1,7 @@
 2004-02-20  Nathan Sidwell  <nathan@codesourcery.com>
 
        * binutils-all/objcopy.exp: Reorder arguments for POSIXLY_CORRECT
-       systems.p
+       systems.
 
 For older changes see ChangeLog-9303
 \f
index 3b3516e..12716fb 100644 (file)
@@ -1,3 +1,9 @@
+2004-02-20  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * 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  <nathan@codesourcery.com>
 
        * ldlang.c (map_input_to_output_sections): Initialize sections
index ed7b3d1..55f861e 100644 (file)
@@ -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{}
index 2b973c3..23a2392 100644 (file)
@@ -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
index e885f7d..6c46c85 100644 (file)
@@ -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 ')'
index 23e41a9..b103d5b 100644 (file)
@@ -1,3 +1,7 @@
+2004-02-20  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * ld-scripts/align.{s,t,exp}: New.
+
 2004-02-19  Nathan Sidwell  <nathan@codesourcery.com>
 
        * 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 (file)
index 0000000..3959e6d
--- /dev/null
@@ -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 (file)
index 0000000..c9bad23
--- /dev/null
@@ -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 (file)
index 0000000..49d6053
--- /dev/null
@@ -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")
+}