diff options
Diffstat (limited to 'binutils-2.25/gold/testsuite/initpri1.c')
-rw-r--r-- | binutils-2.25/gold/testsuite/initpri1.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/binutils-2.25/gold/testsuite/initpri1.c b/binutils-2.25/gold/testsuite/initpri1.c new file mode 100644 index 00000000..1c5252d8 --- /dev/null +++ b/binutils-2.25/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 <mark@codesourcery.com>. + + 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 <stdlib.h> + +/* 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)) */ |