From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- gcc/testsuite/gcc.dg/weak/typeof-2.c | 48 +++++++++++++++ gcc/testsuite/gcc.dg/weak/weak-1.c | 51 ++++++++++++++++ gcc/testsuite/gcc.dg/weak/weak-10.c | 13 +++++ gcc/testsuite/gcc.dg/weak/weak-11.c | 10 ++++ gcc/testsuite/gcc.dg/weak/weak-12.c | 17 ++++++ gcc/testsuite/gcc.dg/weak/weak-13.c | 13 +++++ gcc/testsuite/gcc.dg/weak/weak-14.c | 34 +++++++++++ gcc/testsuite/gcc.dg/weak/weak-15.c | 39 +++++++++++++ gcc/testsuite/gcc.dg/weak/weak-16.c | 21 +++++++ gcc/testsuite/gcc.dg/weak/weak-2.c | 47 +++++++++++++++ gcc/testsuite/gcc.dg/weak/weak-3.c | 73 +++++++++++++++++++++++ gcc/testsuite/gcc.dg/weak/weak-4.c | 105 +++++++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/weak/weak-5.c | 109 +++++++++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/weak/weak-6.c | 7 +++ gcc/testsuite/gcc.dg/weak/weak-7.c | 7 +++ gcc/testsuite/gcc.dg/weak/weak-8.c | 8 +++ gcc/testsuite/gcc.dg/weak/weak-9.c | 23 ++++++++ gcc/testsuite/gcc.dg/weak/weak.exp | 31 ++++++++++ 18 files changed, 656 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/weak/typeof-2.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-1.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-10.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-11.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-12.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-13.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-14.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-15.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-16.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-2.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-3.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-4.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-5.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-6.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-7.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-8.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak-9.c create mode 100644 gcc/testsuite/gcc.dg/weak/weak.exp (limited to 'gcc/testsuite/gcc.dg/weak') diff --git a/gcc/testsuite/gcc.dg/weak/typeof-2.c b/gcc/testsuite/gcc.dg/weak/typeof-2.c new file mode 100644 index 000000000..63f427fc8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/typeof-2.c @@ -0,0 +1,48 @@ +/* Test typeof with __asm redirection. */ +/* { dg-do compile } */ +/* -mlongcall will cause us to place &baz3 in the CTR register. */ +/* { dg-skip-if "" { powerpc*-*-* } { "-mlongcall" } { "" } } */ +/* { dg-require-weak "" } */ +/* { dg-require-alias "" } */ +/* { dg-options "-O2" } */ + +extern int foo1 (int x) __asm ("baz1"); +int bar1 (int x) { return x; } +extern __typeof (bar1) foo1 __attribute ((weak, alias ("bar1"))); + +extern int foo2 (int x) __attribute__ ((const)); +extern __typeof (foo2) foo2 __asm ("baz2"); +int bar2 (int x) +{ + return foo2 (x) + foo2 (x) + foo2 (x) + foo2 (x) + foo2 (x) + foo2 (x); +} + +extern int foo3 (int x); +extern __typeof (foo3) foo3 __asm ("baz3"); +int bar3 (int x) +{ + return foo3 (x) + foo3 (x) + foo3 (x) + foo3 (x) + foo3 (x) + foo3 (x); +} + +// { dg-final { scan-assembler-not "foo1" } } +// { dg-final { scan-assembler "baz1" } } +// { dg-final { scan-assembler-not "foo2" } } +// { dg-final { scan-assembler "baz2" } } +// { dg-final { scan-assembler-not "baz2.*baz2.*baz2.*baz2.*baz2.*baz2" } } +// { dg-final { scan-assembler-not "foo3" } } +// SH targets put the funtion address into a constant pool and / or register, +// so it does not appear repeated (as much as expected) in the assembler. +// { dg-final { global target_triplet } } +// { dg-final { if [string match sh-*-* $target_triplet ] {return} } } +// { dg-final { if [string match {sh[elb1-9]*-*-*} $target_triplet ] {return} } } +// Likewise for S/390 targets +// { dg-final { if [string match s390*-*-* $target_triplet ] {return} } } +// Likewise for CRIS targets. +// { dg-final { if [string match cris-*-* $target_triplet ] {return} } } +// { dg-final { if [string match crisv32-*-* $target_triplet ] {return} } } +// Likewise for m68k targets. +// { dg-final { if [string match fido-*-* $target_triplet ] {return} } } +// { dg-final { if [string match m68k-*-* $target_triplet ] {return} } } +// Likewise for moxie targets. +// { dg-final { if [string match moxie-*-* $target_triplet ] {return} } } +// { dg-final { scan-assembler "baz3.*baz3.*baz3.*baz3.*baz3.*baz3" } } diff --git a/gcc/testsuite/gcc.dg/weak/weak-1.c b/gcc/testsuite/gcc.dg/weak/weak-1.c new file mode 100644 index 000000000..078c3ef36 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-1.c @@ -0,0 +1,51 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-options "-fno-common" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?a" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?b" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?c" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?d" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?e" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?g" } } */ +/* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?i" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?j" } } */ + +#pragma weak a +int a; + +int b; +#pragma weak b + +#pragma weak c +extern int c; +int c; + +extern int d; +#pragma weak d +int d; + +#pragma weak e +void e(void) { } + +#if 0 +/* This permutation is illegal. */ +void f(void) { } +#pragma weak f +#endif + +#pragma weak g +int g = 1; + +#if 0 +/* This permutation is illegal. */ +int h = 1; +#pragma weak h +#endif + +#pragma weak i +extern int i; + +#pragma weak j +extern int j; +int use_j() { return j; } diff --git a/gcc/testsuite/gcc.dg/weak/weak-10.c b/gcc/testsuite/gcc.dg/weak/weak-10.c new file mode 100644 index 000000000..f39fbc4bb --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-10.c @@ -0,0 +1,13 @@ +/* Test for #pragma weak where the weak alias symbol isn't declared, + although the symbol it is an alias for is defined in the + translation unit. Bug 7544. */ +/* Origin: Joseph Myers */ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-require-alias "" } */ +/* { dg-options "-fno-common" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?bar1" } } */ + +#pragma weak bar1 = foo1 +void foo1 (void) {} diff --git a/gcc/testsuite/gcc.dg/weak/weak-11.c b/gcc/testsuite/gcc.dg/weak/weak-11.c new file mode 100644 index 000000000..c20135a3a --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-11.c @@ -0,0 +1,10 @@ +/* PR 19031 */ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-require-alias "" } */ +/* { dg-options "-funit-at-a-time" } */ + +/* { dg-final { scan-assembler "xyzzy" } } */ + +static const int local = 1; +#pragma weak xyzzy = local diff --git a/gcc/testsuite/gcc.dg/weak/weak-12.c b/gcc/testsuite/gcc.dg/weak/weak-12.c new file mode 100644 index 000000000..72cc1445e --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-12.c @@ -0,0 +1,17 @@ +/* Test for #pragma weak with declaration not at file scope. */ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-options "" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?foo" } } */ + +#pragma weak foo + +int +main (void) +{ + extern int foo (void); + if (&foo) + return foo (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/weak/weak-13.c b/gcc/testsuite/gcc.dg/weak/weak-13.c new file mode 100644 index 000000000..15106a534 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-13.c @@ -0,0 +1,13 @@ +/* Test for weak aliases with multiple declarations. Sun assembler + rejects multiple weak alias definitions in the output. */ +/* { dg-do assemble } */ +/* { dg-require-weak "" } */ +/* { dg-require-alias "" } */ +/* { dg-options "" } */ + +#pragma weak foo = _foo + +extern int foo; +extern int foo; + +int _foo = 4; diff --git a/gcc/testsuite/gcc.dg/weak/weak-14.c b/gcc/testsuite/gcc.dg/weak/weak-14.c new file mode 100644 index 000000000..33c7933f1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-14.c @@ -0,0 +1,34 @@ +// { dg-do run } +// { dg-require-weak "" } +// { dg-require-alias "" } +// { dg-options "-O2 -fno-common" } + +// Copyright 2005 Free Software Foundation, Inc. +// Contributed by Alexandre Oliva + +// PR middle-end/24295 + +// The unit-at-a-time call graph code used to fail to emit variables +// without external linkage that were only used indirectly, through +// aliases. We might then get linker failures because the static +// variable was not defined, or run-time errors because the weak alias +// ended up pointing somewhere random. + +#include + +static unsigned long lv1 = 0xdeadbeefUL; +#pragma weak Av1a = lv1 +extern unsigned long Av1a; + +static unsigned long lf1(void) { return 0x510bea7UL; } +#pragma weak Af1a = lf1 +extern unsigned long Af1a(void); + +int main (void) { + if (! &Av1a + || ! &Af1a + || Av1a != 0xdeadbeefUL + || Af1a() != 0x510bea7UL) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/weak/weak-15.c b/gcc/testsuite/gcc.dg/weak/weak-15.c new file mode 100644 index 000000000..2218ca4a7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-15.c @@ -0,0 +1,39 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-options "-fno-common" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?a" } } */ +/* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?b" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?c" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?d" } } */ + +#pragma weak a +extern char a[]; + +char *user_a(void) +{ + return a+1; +} + +int x; +int extern inline b(int y) +{ + return x+y; +} + +extern int b(int y); + +int user_b(int z) +{ + return b(z); +} + +#pragma weak c +extern int c; + +int *user_c = &c; + +#pragma weak d +extern char d[]; + +char *user_d = &d[1]; diff --git a/gcc/testsuite/gcc.dg/weak/weak-16.c b/gcc/testsuite/gcc.dg/weak/weak-16.c new file mode 100644 index 000000000..3bcf3885d --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-16.c @@ -0,0 +1,21 @@ +/* From PR37280. */ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-options "-fno-common -Os" } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?kallsyms_token_index" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?kallsyms_token_table" } } */ + +extern int kallsyms_token_index[] __attribute__((weak)); +extern int kallsyms_token_table[] __attribute__((weak)); +void kallsyms_expand_symbol(int *result) +{ + int len = *result; + int *tptr; + while(len) { + tptr = &kallsyms_token_table[ kallsyms_token_index[*result] ]; + len--; + while (*tptr) tptr++; + *tptr = 1; + } + *result = 0; +} diff --git a/gcc/testsuite/gcc.dg/weak/weak-2.c b/gcc/testsuite/gcc.dg/weak/weak-2.c new file mode 100644 index 000000000..973f4c216 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-2.c @@ -0,0 +1,47 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-options "-fno-common" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1a" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1b" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1c" } } */ +/* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?ffoo1d" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1e" } } */ + +/* test function addresses with #pragma weak */ + +#pragma weak ffoo1a +extern void * ffoo1a (void); +void * foo1a (void) +{ + return (void *)ffoo1a; +} + +extern void * ffoo1b (void); +#pragma weak ffoo1b +void * foo1b (void) +{ + return (void *)ffoo1b; +} + +extern void * ffoo1c (void); +void * foo1c (void) +{ + return (void *)ffoo1c; +} +#pragma weak ffoo1c + + +int ffoo1d (void); +#pragma weak ffoo1d + + +extern void * ffoo1e (void); +#pragma weak ffoo1e +void * foo1e (void) +{ + if (ffoo1e) + ffoo1e (); + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/weak/weak-3.c b/gcc/testsuite/gcc.dg/weak/weak-3.c new file mode 100644 index 000000000..748bd236c --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-3.c @@ -0,0 +1,73 @@ +/* { dg-do compile } */ +/* { dg-require-alias "" } */ +/* { dg-require-weak "" } */ +/* { dg-options "-fno-common -Waddress" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1a" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1b" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1c" } } */ +/* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?ffoo1d" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1e" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1f" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1g" } } */ + +/* test function addresses with __attribute__((weak)) */ + +extern void * ffoo1a (void) __attribute__((weak)); +extern void * ffoo1a (void); +void * foo1a (void) +{ + return (void *)ffoo1a; +} + + +extern void * ffoo1b (void); +extern void * ffoo1b (void) __attribute__((weak)); +void * foo1b (void) +{ + return (void *)ffoo1b; +} + + +extern void * ffoo1c (void); +void * foo1c (void) +{ + return (void *)ffoo1c; +} +extern void * ffoo1c (void) __attribute__((weak)); + + +int ffoo1d (void); +int ffoo1d (void) __attribute__((weak)); + + +extern void * ffoo1e (void); +extern void * ffoo1e (void) __attribute__((weak)); +void * foo1e (void) +{ + if (ffoo1e) + ffoo1e (); + return 0; +} + + +extern void * ffoo1f (void); +void * foo1f (void) +{ + if (ffoo1f) /* { dg-warning "" } */ + ffoo1f (); + return 0; +} +void * ffoox1f (void) { return (void *)0; } +extern void * ffoo1f (void) __attribute__((weak, alias ("ffoox1f"))); + + +extern void * ffoo1g (void); +void * ffoox1g (void) { return (void *)0; } +extern void * ffoo1g (void) __attribute__((weak, alias ("ffoox1g"))); +void * foo1g (void) +{ + if (ffoo1g) + ffoo1g (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/weak/weak-4.c b/gcc/testsuite/gcc.dg/weak/weak-4.c new file mode 100644 index 000000000..cd8a1e912 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-4.c @@ -0,0 +1,105 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-options "-fno-common" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1a" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1b" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1c" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1d" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1e" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1f" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1g" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1h" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1i" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1j" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1k" } } */ + +/* test variable addresses with #pragma weak */ + +#pragma weak vfoo1a +extern int vfoo1a; +void * foo1a (void) +{ + return (void *)&vfoo1a; +} + + +extern int vfoo1b; +#pragma weak vfoo1b +void * foo1b (void) +{ + return (void *)&vfoo1b; +} + + +extern int vfoo1c; +void * foo1c (void) +{ + return (void *)&vfoo1c; +} +#pragma weak vfoo1c + + +#pragma weak vfoo1d +int vfoo1d; +void * foo1d (void) +{ + return (void *)&vfoo1d; +} + + +int vfoo1e; +#pragma weak vfoo1e +void * foo1e (void) +{ + return (void *)&vfoo1e; +} + + +int vfoo1f; +void * foo1f (void) +{ + return (void *)&vfoo1f; +} +#pragma weak vfoo1f + + +extern int vfoo1g; +void * foo1g (void) +{ + return (void *)&vfoo1g; +} +#pragma weak vfoo1g +int vfoo1g; + + +extern int vfoo1h; +void * foo1h (void) +{ + return (void *)&vfoo1h; +} +int vfoo1h; +#pragma weak vfoo1h + + +int vfoo1i; +extern int vfoo1i; +void * foo1i (void) +{ + return (void *)&vfoo1i; +} +#pragma weak vfoo1i + + +extern int vfoo1j; +int vfoo1j; +void * foo1j (void) +{ + return (void *)&vfoo1j; +} +#pragma weak vfoo1j + + +#pragma weak vfoo1k +int vfoo1k = 1; + diff --git a/gcc/testsuite/gcc.dg/weak/weak-5.c b/gcc/testsuite/gcc.dg/weak/weak-5.c new file mode 100644 index 000000000..e82792af3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-5.c @@ -0,0 +1,109 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-require-alias "" } */ +/* { dg-options "-fno-common" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1a" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1b" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1c" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1d" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1e" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1f" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1g" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1h" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1i" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1j" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1k" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1l" } } */ + +/* test variable addresses with __attribute__ ((weak)) */ + +extern int vfoo1a __attribute__((weak)); +extern int vfoo1a; +void * foo1a (void) +{ + return (void *)&vfoo1a; +} + + +extern int vfoo1b; +extern int vfoo1b __attribute__((weak)); +void * foo1b (void) +{ + return (void *)&vfoo1b; +} + + +extern int vfoo1c; +void * foo1c (void) +{ + return (void *)&vfoo1c; +} +extern int vfoo1c __attribute__((weak)); + + +extern int vfoo1d __attribute__((weak)); +int vfoo1d; +void * foo1d (void) +{ + return (void *)&vfoo1d; +} + + +int vfoo1e; +extern int vfoo1e __attribute__((weak)); +void * foo1e (void) +{ + return (void *)&vfoo1e; +} + + +int vfoo1f; +void * foo1f (void) +{ + return (void *)&vfoo1f; +} +extern int vfoo1f __attribute__((weak)); + + +extern int vfoo1g; +void * foo1g (void) +{ + return (void *)&vfoo1g; +} +int vfoo1g __attribute__((weak)); + + +extern int vfoo1h __attribute__((weak)); +void * foo1h (void) +{ + return (void *)&vfoo1h; +} +extern int vfoo1h __attribute__((weak)); +int vfoo1h; + + +extern int vfoo1i __attribute__((weak)); +void * foo1i (void) +{ + return (void *)&vfoo1i; +} +extern int vfoo1i __attribute__((weak)); +extern int vfoo1i; + + +extern int vfoo1j __attribute__((weak)); +void * foo1j (void) +{ + return (void *)&vfoo1j; +} +extern int vfoo1j; +extern int vfoo1j __attribute__((weak)); + + +extern int vfoo1k __attribute__((weak)); +int vfoo1k = 1; + + +int vfoox1l = 1; +extern int vfoo1l __attribute__((weak, alias ("vfoox1l"))); diff --git a/gcc/testsuite/gcc.dg/weak/weak-6.c b/gcc/testsuite/gcc.dg/weak/weak-6.c new file mode 100644 index 000000000..6fa0d66ff --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-6.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ + +extern void * foo (void); +void * foo (void) { return (void *)foo; } +/* { dg-error "function pointer" "pointer conversion" { target *-*-* } 5 } */ +#pragma weak foo diff --git a/gcc/testsuite/gcc.dg/weak/weak-7.c b/gcc/testsuite/gcc.dg/weak/weak-7.c new file mode 100644 index 000000000..07c03bc97 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-7.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ + +extern void * foo (void); +void * foo (void) { return (void *)foo; } +/* { dg-error "function pointer" "pointer conversion" { target *-*-* } 5 } */ +extern void * foo (void) __attribute__((weak)); diff --git a/gcc/testsuite/gcc.dg/weak/weak-8.c b/gcc/testsuite/gcc.dg/weak/weak-8.c new file mode 100644 index 000000000..3de2e1e2f --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-8.c @@ -0,0 +1,8 @@ +/* { dg-do assemble } */ +/* { dg-require-weak "" } */ + +__attribute__ ((weak)) int i; + +int f() { + return i; +} diff --git a/gcc/testsuite/gcc.dg/weak/weak-9.c b/gcc/testsuite/gcc.dg/weak/weak-9.c new file mode 100644 index 000000000..abbd0201c --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-9.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-require-alias "" } */ +/* { dg-options "-fno-common" } */ + +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f1" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f2" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f3" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f4" } } */ + +void notf1() { } +void notf2() { } +void notf3() { } +void notf4() { } + +void f1() __attribute__((weak, alias("notf1"))); +void f2() __attribute__((alias("notf2"), weak)); + +#pragma weak f3=notf3 +void f3(); + +void f4(); +#pragma weak f4=notf4 diff --git a/gcc/testsuite/gcc.dg/weak/weak.exp b/gcc/testsuite/gcc.dg/weak/weak.exp new file mode 100644 index 000000000..5dde31edb --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak.exp @@ -0,0 +1,31 @@ +# Copyright (C) 1997, 2003, 2007 Free Software Foundation, Inc. + +# 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 GCC; see the file COPYING3. If not see +# . + +# GCC testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib gcc-dg.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CFLAGS +if ![info exists DEFAULT_CFLAGS] then { + set DEFAULT_CFLAGS " -ansi -pedantic-errors" +} + +dg-init +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \ + "" $DEFAULT_CFLAGS +dg-finish -- cgit v1.2.3