Properly report filename for alignment reduction.
authorNick Clifton <nickc@redhat.com>
Tue, 15 Apr 2003 09:38:11 +0000 (09:38 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 15 Apr 2003 09:38:11 +0000 (09:38 +0000)
Add test for alignment reduction.

bfd/ChangeLog
bfd/elflink.h
ld/testsuite/ChangeLog
ld/testsuite/ld-elfcomm/common1a.c [new file with mode: 0644]
ld/testsuite/ld-elfcomm/common1b.c [new file with mode: 0644]
ld/testsuite/ld-elfcomm/elfcomm.exp [new file with mode: 0644]

index 080cc0cd9d8ac1381205cc0f78c3969d00c254a2..b253ee62cecb4cf37377894d2905d133210a0420 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-15  H.J. Lu <hjl@gnu.org>
+
+       * elflink.h (elf_link_add_object_symbols): Properly report
+       filename for alignment reduction.
+
 2003-04-15  Rohit Kumar Srivastava <rohits@kpitcummins.com>
 
        * archures.c: Replace occurrances of 'Hitachi' with 'Renesas'.
index 780e341d42cc39ad72f6aedf76c700e709f72650..12f91ef4ef543ba50170cbe231dc42967edcbd87 100644 (file)
@@ -1929,7 +1929,11 @@ elf_link_add_object_symbols (abfd, info)
          if ((old_alignment || isym->st_shndx == SHN_COMMON)
              && h->root.type != bfd_link_hash_common)
            {
-             unsigned int common_align, normal_align, symbol_align;
+             unsigned int common_align;
+             unsigned int normal_align;
+             unsigned int symbol_align;
+             bfd *normal_bfd;
+             bfd *common_bfd;
 
              symbol_align = ffs (h->root.u.def.value) - 1;
              if ((h->root.u.def.section->owner->flags & DYNAMIC) == 0)
@@ -1942,16 +1946,26 @@ elf_link_add_object_symbols (abfd, info)
                normal_align = symbol_align;
 
              if (old_alignment)
-               common_align = old_alignment;
+               {
+                 common_align = old_alignment;
+                 common_bfd = old_bfd;
+                 normal_bfd = abfd;
+               }
              else
-               common_align = bfd_log2 (isym->st_value);
+               {
+                 common_align = bfd_log2 (isym->st_value);
+                 common_bfd = abfd;
+                 normal_bfd = old_bfd;
+               }
 
              if (normal_align < common_align)
                (*_bfd_error_handler)
                  (_("Warning: alignment %u of symbol `%s' in %s is smaller than %u in %s"),
-                  1 << normal_align, name,
-                  bfd_archive_filename (old_bfd),
-                  1 << common_align, bfd_archive_filename (abfd));
+                  1 << normal_align,
+                  name,
+                  bfd_archive_filename (normal_bfd),
+                  1 << common_align,
+                  bfd_archive_filename (common_bfd));
            }
 
          /* Remember the symbol size and type.  */
index c4105f1c621eb8cdbc06573217e07403fc7f4590..b9cf3490d8cc1fce10ba51589f6b844d07241c5c 100644 (file)
@@ -1,3 +1,11 @@
+2003-04-14  H.J. Lu <hjl@gnu.org>
+
+       * ld-elfcom: New directory.
+       * ld-elfcom/elfcom.exp: New file: Test alignment of common symbols
+       under ELF.
+       * ld-elfcom/common1a.c: New file: Test source code.
+       * ld-elfcom/common1b.c: New file: Test source code.
+
 2003-04-15  Rohit Kumar Srivastava <rohits@kpitcummins.com>
 
        * ld-sh/sh64/crange3-cmpct.rd: Replace occurrances of 'Hitachi'
diff --git a/ld/testsuite/ld-elfcomm/common1a.c b/ld/testsuite/ld-elfcomm/common1a.c
new file mode 100644 (file)
index 0000000..eb8fbef
--- /dev/null
@@ -0,0 +1,2 @@
+char foo1 [2] __attribute__((aligned(64)));
+char foo2 [2] __attribute__((aligned(128)));
diff --git a/ld/testsuite/ld-elfcomm/common1b.c b/ld/testsuite/ld-elfcomm/common1b.c
new file mode 100644 (file)
index 0000000..4ed9e03
--- /dev/null
@@ -0,0 +1,3 @@
+static char dummy1 = 'X';
+char foo1 [] = "Aligned at odd byte.";
+char foo2 [4];
diff --git a/ld/testsuite/ld-elfcomm/elfcomm.exp b/ld/testsuite/ld-elfcomm/elfcomm.exp
new file mode 100644 (file)
index 0000000..199e83e
--- /dev/null
@@ -0,0 +1,92 @@
+# Expect script for commom symbol tests
+#   Copyright 2003 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.
+#
+# Written by H.J. Lu (hjl@gnu.org)
+#
+
+# Make sure that ld correctly handles common symbols in ELF.
+
+# This test can only be run on ELF platforms.
+# Square bracket expressions seem to confuse istarget.
+if { ![istarget hppa*64*-*-hpux*] \
+     && ![istarget *-*-gnu] \
+     && ![istarget *-*-linux*] \
+     && ![istarget *-*-elf] } {
+    return
+}
+
+if { [istarget *-*-linux*aout*] \
+     || [istarget *-*-linux*oldld*] } {
+    return
+}
+
+proc dump_common1 { testname } {
+    global exec_output
+
+    send_log "readelf -s tmpdir/common1.o | grep foo\n"
+    catch "exec readelf -s tmpdir/common1.o | grep foo" exec_output
+    if { ![regexp "(\[         \]*)(\[0-9\]+):(\[      \]*)(\[0\]*)80(\[       \]+)4(\[        \]+)OBJECT(\[   \]+)GLOBAL(\[   \]+)DEFAULT(\[  \]+)COM(\[      \]+)foo2" $exec_output]
+        || ![regexp "(\[       \]*)(\[0-9\]+):(\[      \]*)(\[0\]*)1(\[        \]+)21(\[       \]+)OBJECT(\[   \]+)GLOBAL(\[   \]+)DEFAULT(\[  \]+)(\[0-9\]+)(\[       \]+)foo1" $exec_output] } {
+       send_log "$exec_output\n"
+       verbose $exec_output
+       fail $testname
+       return 0
+    }
+
+    return 1
+}
+
+set test1 "size/aligment change of commom symbols"
+if { ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/common1a.c tmpdir/common1a.o]
+    || ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/common1b.c tmpdir/common1b.o] } {
+    unresolved $test1
+    return
+}
+
+global ld
+global link_output
+
+if { [ld_simple_link $ld tmpdir/common1.o "-r tmpdir/common1a.o tmpdir/common1b.o"] } {
+    unresolved $test1
+    return
+}
+
+if { ![regexp "Warning: alignment 1 of symbol \`foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output]
+     || ![regexp "Warning: size of symbol \`foo1\' changed from 2 in tmpdir/common1a.o to 21 in tmpdir/common1b.o" $link_output] } {
+    fail "$test1 (warning 1)"
+} else {
+    pass "$test1 (warning 1)"
+}
+
+if { [dump_common1 "$test1 (change 1)"] } {
+    pass "$test1 (change 1)"
+}
+
+if { [ld_simple_link $ld tmpdir/common1.o "-r tmpdir/common1b.o tmpdir/common1a.o"] } {
+    unresolved $test1
+    return
+}
+
+if { ![regexp "Warning: alignment 1 of symbol \`foo1\' in tmpdir/common1b.o is smaller than 64 in tmpdir/common1a.o" $link_output] } {
+    fail "$test1 (warning 2)"
+} else {
+    pass "$test1 (warningi 2)"
+}
+
+if { [dump_common1 "$test1 (change 2)"] } {
+    pass "$test1 (change 2)"
+}