X-Git-Url: https://oss.titaniummirror.com/gitweb?p=msp430-binutils.git;a=blobdiff_plain;f=gold%2Ftestsuite%2Finitpri1.c;fp=gold%2Ftestsuite%2Finitpri1.c;h=1c5252d873d210608215398fce80e88d7e335b97;hp=0000000000000000000000000000000000000000;hb=d5da4f291af551c0b8b79e1d4a9b173d60e5c10e;hpb=7b5ea4fcdf2819e070665ab5610f8b48e3867c10 diff --git a/gold/testsuite/initpri1.c b/gold/testsuite/initpri1.c new file mode 100644 index 0000000..1c5252d --- /dev/null +++ b/gold/testsuite/initpri1.c @@ -0,0 +1,105 @@ +/* initpri1.c -- test constructor priorities. + + Copyright 2007, 2008, 2009 Free Software Foundation, Inc. + Copied from the gcc testsuite, where the test was contributed by + Mark Mitchell . + + 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 tests that the linker handles constructor and destructor + priorities correctly. */ + +#include + +/* Constructor priorities in attributes were added in gcc 4.3. */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2) + +int i; +int j; + +void c1(void) __attribute__((constructor (500))); +void c2(void) __attribute__((constructor (700))); +void c3(void) __attribute__((constructor (600))); + +void c1() { + if (i++ != 0) + abort (); +} + +void c2() { + if (i++ != 2) + abort (); +} + +void c3() { + if (i++ != 1) + abort (); +} + +void d1(void) __attribute__((destructor (500))); +void d2(void) __attribute__((destructor (700))); +void d3(void) __attribute__((destructor (600))); + +void d1() { + if (--i != 0) + abort (); +} + +void d2() { + if (--i != 2) + abort (); +} + +void d3() { + if (j != 4) + abort (); + if (--i != 1) + abort (); +} + +void cd4(void) __attribute__((constructor (800), destructor (800))); + +void cd4() { + if (i != 3) + abort (); + ++j; +} + +void cd5(void) __attribute__((constructor, destructor)); + +void cd5() { + if (i != 3) + abort(); + ++j; +} + +int main (void) { + if (i != 3) + return 1; + if (j != 2) + abort (); + return 0; +} + +#else /* !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) */ + +int main (void) { + exit (0); +} + +#endif /* !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) */