Index: common.cc =================================================================== RCS file: /cvs/src/src/gold/common.cc,v retrieving revision 1.14 diff -p -u -r1.14 common.cc --- common.cc 13 Mar 2008 21:04:21 -0000 1.14 +++ common.cc 27 Mar 2008 19:54:43 -0000 @@ -93,19 +93,21 @@ Sort_commons::operator()(const Sym const Sized_symbol* psa = symtab->get_sized_symbol(pa); const Sized_symbol* psb = symtab->get_sized_symbol(pb); + // Sort by largest size first. typename Sized_symbol::Size_type sa = psa->symsize(); typename Sized_symbol::Size_type sb = psb->symsize(); if (sa < sb) return false; - else if (sb > sa) + else if (sb < sa) return true; - // When the symbols are the same size, we sort them by alignment. + // When the symbols are the same size, we sort them by alignment, + // largest alignment first. typename Sized_symbol::Value_type va = psa->value(); typename Sized_symbol::Value_type vb = psb->value(); if (va < vb) return false; - else if (vb > va) + else if (vb < va) return true; // Otherwise we stabilize the sort by sorting by name. Index: testsuite/Makefile.am =================================================================== RCS file: /cvs/src/src/gold/testsuite/Makefile.am,v retrieving revision 1.49 diff -p -u -r1.49 Makefile.am --- testsuite/Makefile.am 27 Mar 2008 18:19:09 -0000 1.49 +++ testsuite/Makefile.am 27 Mar 2008 19:54:43 -0000 @@ -277,6 +277,10 @@ two_file_mixed_2_shared_test_LDADD = two endif FN_PTRS_IN_SO_WITHOUT_PIC +check_PROGRAMS += common_test_1 +common_test_1_SOURCES = common_test_1.c +common_test_1_DEPENDENCIES = gcctestdir/ld +common_test_1_LDFLAGS = -Bgcctestdir/ check_PROGRAMS += exception_test check_PROGRAMS += exception_static_test Index: testsuite/common_test_1.c =================================================================== RCS file: testsuite/common_test_1.c diff -N testsuite/common_test_1.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/common_test_1.c 27 Mar 2008 19:54:43 -0000 @@ -0,0 +1,75 @@ +/* common_test_1.c -- test common symbol sorting + + Copyright 2008 Free Software Foundation, Inc. + Written by Ian Lance Taylor + + This file is part of gold. + + 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. + + This is a test of a common symbol in the main program and a + versioned symbol in a shared library. The common symbol in the + main program should override the shared library symbol. */ + +#include + +/* Common symbols should be sorted by size, largest first, and then by + alignment, largest first. We mix up the names, because gas seems + to sort common symbols roughly by name. */ + +int c9[90]; +int c8[80]; +int c7[70]; +int c6[60]; +int c5[10]; +int c4[20]; +int c3[30]; +int c2[40]; +int c1[50]; + +int a1 __attribute__ ((aligned (1 << 9))); +int a2 __attribute__ ((aligned (1 << 8))); +int a3 __attribute__ ((aligned (1 << 7))); +int a4 __attribute__ ((aligned (1 << 6))); +int a5 __attribute__ ((aligned (1 << 1))); +int a6 __attribute__ ((aligned (1 << 2))); +int a7 __attribute__ ((aligned (1 << 3))); +int a8 __attribute__ ((aligned (1 << 4))); +int a9 __attribute__ ((aligned (1 << 5))); + +int +main (int argc __attribute__ ((unused)), char** argv __attribute__ ((unused))) +{ + assert (c5 > c4); + assert (c4 > c3); + assert (c3 > c2); + assert (c2 > c1); + assert (c1 > c6); + assert (c6 > c7); + assert (c7 > c8); + assert (c8 > c9); + + assert (&a1 < &a2); + assert (&a2 < &a3); + assert (&a3 < &a4); + assert (&a4 < &a9); + assert (&a9 < &a8); + assert (&a8 < &a7); + assert (&a7 < &a6); + assert (&a6 < &a5); + + return 0; +}