From: H.J. Lu Date: Fri, 7 Dec 2012 19:23:50 +0000 (+0000) Subject: Add LTO tests X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=af55061b181d122041b34ef1455fc379d83f9c5c;p=binutils-gdb.git Add LTO tests * ld-plugin/dummy.c: New file. * ld-plugin/dummy.s: Likewise. * ld-plugin/lto-11.out: Likewise. * ld-plugin/lto-11a.c: Likewise. * ld-plugin/lto-11b.c: Likewise. * ld-plugin/lto-11c.c: Likewise. * ld-plugin/lto-12.out: Likewise. * ld-plugin/lto-12a.c: Likewise. * ld-plugin/lto-12b.c: Likewise. * ld-plugin/lto-12c.c: Likewise. * ld-plugin/lto-13.out: Likewise. * ld-plugin/lto-13a.c: Likewise. * ld-plugin/lto-13b.c: Likewise. * ld-plugin/lto-13c.c: Likewise. * ld-plugin/lto-14.out: Likewise. * ld-plugin/lto-14a.c: Likewise. * ld-plugin/lto-14b.c: Likewise. * ld-plugin/lto-14c.c: Likewise. * ld-plugin/lto-15.out: Likewise. * ld-plugin/lto-15a.c: Likewise. * ld-plugin/lto-15b.c: Likewise. * ld-plugin/lto-16a.c: Likewise. * ld-plugin/lto-16a.d: Likewise. * ld-plugin/lto-16b.c: Likewise. * ld-plugin/lto-16b.d: Likewise. * ld-plugin/lto-17a.c: Likewise. * ld-plugin/lto-17a.d: Likewise. * ld-plugin/lto-17b-1.d: Likewise. * ld-plugin/lto-17b-2.d: Likewise. * ld-plugin/lto-17b.c: Likewise. * ld-plugin/lto-1a.c: Likewise. * ld-plugin/lto-1b.c: Likewise. * ld-plugin/lto-2.c: Likewise. * ld-plugin/lto-3.d: Likewise. * ld-plugin/lto-3.out: Likewise. * ld-plugin/lto-3a.c: Likewise. * ld-plugin/lto-3b.c: Likewise. * ld-plugin/lto-3c.c: Likewise. * ld-plugin/lto-3r.d: Likewise. * ld-plugin/lto-5.d: Likewise. * ld-plugin/lto-5.out: Likewise. * ld-plugin/lto-5a.c: Likewise. * ld-plugin/lto-5b.c: Likewise. * ld-plugin/lto-5r.d: Likewise. * ld-plugin/lto-6.c: Likewise. * ld-plugin/lto-7.out: Likewise. * ld-plugin/lto-7a.c: Likewise. * ld-plugin/lto-7b.c: Likewise. * ld-plugin/lto-7c.c: Likewise. * ld-plugin/lto-7d.c: Likewise. * ld-plugin/lto-8.out: Likewise. * ld-plugin/lto-8a.c: Likewise. * ld-plugin/lto-8b.c: Likewise. * ld-plugin/lto-9.cc: Likewise. * ld-plugin/lto-9.d: Likewise. * ld-plugin/lto.exp: Likewise. * ld-plugin/pr12696-1.cc: Likewise. * ld-plugin/pr12758a.s: Likewise. * ld-plugin/pr12758b.c: Likewise. * ld-plugin/pr12760a.c: Likewise. * ld-plugin/pr12760b.c: Likewise. * ld-plugin/pr12942.out: Likewise. * ld-plugin/pr12942a.cc: Likewise. * ld-plugin/pr12942a.h: Likewise. * ld-plugin/pr12942b.cc: Likewise. * ld-plugin/pr12942c.cc: Likewise. * ld-plugin/pr12975.c: Likewise. * ld-plugin/pr12975.d: Likewise. * ld-plugin/pr12975.t: Likewise. * ld-plugin/pr12982.c: Likewise. * ld-plugin/pr12982.d: Likewise. * ld-plugin/pr13066.cc: Likewise. * ld-plugin/pr13066.out: Likewise. * ld-plugin/pr13183.d: Likewise. * ld-plugin/pr13183a.c: Likewise. * ld-plugin/pr13183b.c: Likewise. * ld-plugin/pr13201.c: Likewise. * ld-plugin/pr13201.out: Likewise. * ld-plugin/pr13229.cc: Likewise. * ld-plugin/pr13229.d: Likewise. * ld-plugin/pr13244.c: Likewise. * ld-plugin/pr13244.d: Likewise. * ld-plugin/pr13287.cc: Likewise. * ld-plugin/run-ie.c: Likewise. * ld-plugin/run-ie.out: Likewise. --- diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3a1d4371f00..d6a37fc7432 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,91 @@ +2012-12-07 H.J. Lu + + * ld-plugin/dummy.c: New file. + * ld-plugin/dummy.s: Likewise. + * ld-plugin/lto-11.out: Likewise. + * ld-plugin/lto-11a.c: Likewise. + * ld-plugin/lto-11b.c: Likewise. + * ld-plugin/lto-11c.c: Likewise. + * ld-plugin/lto-12.out: Likewise. + * ld-plugin/lto-12a.c: Likewise. + * ld-plugin/lto-12b.c: Likewise. + * ld-plugin/lto-12c.c: Likewise. + * ld-plugin/lto-13.out: Likewise. + * ld-plugin/lto-13a.c: Likewise. + * ld-plugin/lto-13b.c: Likewise. + * ld-plugin/lto-13c.c: Likewise. + * ld-plugin/lto-14.out: Likewise. + * ld-plugin/lto-14a.c: Likewise. + * ld-plugin/lto-14b.c: Likewise. + * ld-plugin/lto-14c.c: Likewise. + * ld-plugin/lto-15.out: Likewise. + * ld-plugin/lto-15a.c: Likewise. + * ld-plugin/lto-15b.c: Likewise. + * ld-plugin/lto-16a.c: Likewise. + * ld-plugin/lto-16a.d: Likewise. + * ld-plugin/lto-16b.c: Likewise. + * ld-plugin/lto-16b.d: Likewise. + * ld-plugin/lto-17a.c: Likewise. + * ld-plugin/lto-17a.d: Likewise. + * ld-plugin/lto-17b-1.d: Likewise. + * ld-plugin/lto-17b-2.d: Likewise. + * ld-plugin/lto-17b.c: Likewise. + * ld-plugin/lto-1a.c: Likewise. + * ld-plugin/lto-1b.c: Likewise. + * ld-plugin/lto-2.c: Likewise. + * ld-plugin/lto-3.d: Likewise. + * ld-plugin/lto-3.out: Likewise. + * ld-plugin/lto-3a.c: Likewise. + * ld-plugin/lto-3b.c: Likewise. + * ld-plugin/lto-3c.c: Likewise. + * ld-plugin/lto-3r.d: Likewise. + * ld-plugin/lto-5.d: Likewise. + * ld-plugin/lto-5.out: Likewise. + * ld-plugin/lto-5a.c: Likewise. + * ld-plugin/lto-5b.c: Likewise. + * ld-plugin/lto-5r.d: Likewise. + * ld-plugin/lto-6.c: Likewise. + * ld-plugin/lto-7.out: Likewise. + * ld-plugin/lto-7a.c: Likewise. + * ld-plugin/lto-7b.c: Likewise. + * ld-plugin/lto-7c.c: Likewise. + * ld-plugin/lto-7d.c: Likewise. + * ld-plugin/lto-8.out: Likewise. + * ld-plugin/lto-8a.c: Likewise. + * ld-plugin/lto-8b.c: Likewise. + * ld-plugin/lto-9.cc: Likewise. + * ld-plugin/lto-9.d: Likewise. + * ld-plugin/lto.exp: Likewise. + * ld-plugin/pr12696-1.cc: Likewise. + * ld-plugin/pr12758a.s: Likewise. + * ld-plugin/pr12758b.c: Likewise. + * ld-plugin/pr12760a.c: Likewise. + * ld-plugin/pr12760b.c: Likewise. + * ld-plugin/pr12942.out: Likewise. + * ld-plugin/pr12942a.cc: Likewise. + * ld-plugin/pr12942a.h: Likewise. + * ld-plugin/pr12942b.cc: Likewise. + * ld-plugin/pr12942c.cc: Likewise. + * ld-plugin/pr12975.c: Likewise. + * ld-plugin/pr12975.d: Likewise. + * ld-plugin/pr12975.t: Likewise. + * ld-plugin/pr12982.c: Likewise. + * ld-plugin/pr12982.d: Likewise. + * ld-plugin/pr13066.cc: Likewise. + * ld-plugin/pr13066.out: Likewise. + * ld-plugin/pr13183.d: Likewise. + * ld-plugin/pr13183a.c: Likewise. + * ld-plugin/pr13183b.c: Likewise. + * ld-plugin/pr13201.c: Likewise. + * ld-plugin/pr13201.out: Likewise. + * ld-plugin/pr13229.cc: Likewise. + * ld-plugin/pr13229.d: Likewise. + * ld-plugin/pr13244.c: Likewise. + * ld-plugin/pr13244.d: Likewise. + * ld-plugin/pr13287.cc: Likewise. + * ld-plugin/run-ie.c: Likewise. + * ld-plugin/run-ie.out: Likewise. + 2012-12-07 H.J. Lu * ld-plugin/func1p.c: New file. diff --git a/ld/testsuite/ld-plugin/dummy.c b/ld/testsuite/ld-plugin/dummy.c new file mode 100644 index 00000000000..5c0328739c6 --- /dev/null +++ b/ld/testsuite/ld-plugin/dummy.c @@ -0,0 +1 @@ +/* An empty file. */ diff --git a/ld/testsuite/ld-plugin/dummy.s b/ld/testsuite/ld-plugin/dummy.s new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/ld/testsuite/ld-plugin/dummy.s @@ -0,0 +1 @@ + diff --git a/ld/testsuite/ld-plugin/lto-11.out b/ld/testsuite/ld-plugin/lto-11.out new file mode 100644 index 00000000000..899682aecc3 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-11.out @@ -0,0 +1,2 @@ +Hello from foo! +Hello from bar! diff --git a/ld/testsuite/ld-plugin/lto-11a.c b/ld/testsuite/ld-plugin/lto-11a.c new file mode 100644 index 00000000000..5193972c3fc --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-11a.c @@ -0,0 +1,9 @@ +extern void foo(void); +extern void bar(void); + +int main(void) +{ + foo(); + bar(); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-11b.c b/ld/testsuite/ld-plugin/lto-11b.c new file mode 100644 index 00000000000..62d61ecf94b --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-11b.c @@ -0,0 +1,6 @@ +extern int printf(const char *, ...); + +void foo(void) +{ + printf("Hello from %s!\n", __FUNCTION__); +} diff --git a/ld/testsuite/ld-plugin/lto-11c.c b/ld/testsuite/ld-plugin/lto-11c.c new file mode 100644 index 00000000000..8cd40b95ec7 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-11c.c @@ -0,0 +1,6 @@ +extern int printf(const char *, ...); + +void bar(void) +{ + printf("Hello from %s!\n", __FUNCTION__); +} diff --git a/ld/testsuite/ld-plugin/lto-12.out b/ld/testsuite/ld-plugin/lto-12.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-12.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-plugin/lto-12a.c b/ld/testsuite/ld-plugin/lto-12a.c new file mode 100644 index 00000000000..30ff3d936a7 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-12a.c @@ -0,0 +1,16 @@ +#include +#include + +extern int value; + +int +main (int argc, char **argv) +{ + int n = 10 * (argc + 1); + char *p = malloc (n); + __builtin_memcpy (p, argv[0], n); + if (value != -1) + abort (); + printf ("OK\n"); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-12b.c b/ld/testsuite/ld-plugin/lto-12b.c new file mode 100644 index 00000000000..c2b00e4cd2c --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-12b.c @@ -0,0 +1 @@ +int value = -1; diff --git a/ld/testsuite/ld-plugin/lto-12c.c b/ld/testsuite/ld-plugin/lto-12c.c new file mode 100644 index 00000000000..ecd1bd48a1c --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-12c.c @@ -0,0 +1,15 @@ +#include + +extern int value; + +void *memcpy(void *dest, const void *src, size_t n) +{ + char *d = (char *) dest; + const char *s = (const char *) src; + + while (n--) + *d++ = *s++; + + value = 1; + return dest; +} diff --git a/ld/testsuite/ld-plugin/lto-13.out b/ld/testsuite/ld-plugin/lto-13.out new file mode 100644 index 00000000000..3bd1f0e2974 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-13.out @@ -0,0 +1,2 @@ +foo +bar diff --git a/ld/testsuite/ld-plugin/lto-13a.c b/ld/testsuite/ld-plugin/lto-13a.c new file mode 100644 index 00000000000..5193972c3fc --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-13a.c @@ -0,0 +1,9 @@ +extern void foo(void); +extern void bar(void); + +int main(void) +{ + foo(); + bar(); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-13b.c b/ld/testsuite/ld-plugin/lto-13b.c new file mode 100644 index 00000000000..7c87a5ebdfa --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-13b.c @@ -0,0 +1,7 @@ +#include + +void +bar (void) +{ + printf ("bar\n"); +} diff --git a/ld/testsuite/ld-plugin/lto-13c.c b/ld/testsuite/ld-plugin/lto-13c.c new file mode 100644 index 00000000000..4859019056f --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-13c.c @@ -0,0 +1,7 @@ +#include + +void +foo (void) +{ + printf ("foo\n"); +} diff --git a/ld/testsuite/ld-plugin/lto-14.out b/ld/testsuite/ld-plugin/lto-14.out new file mode 100644 index 00000000000..7ef22e9a431 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-14.out @@ -0,0 +1 @@ +PASS diff --git a/ld/testsuite/ld-plugin/lto-14a.c b/ld/testsuite/ld-plugin/lto-14a.c new file mode 100644 index 00000000000..d61437b1d1b --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-14a.c @@ -0,0 +1,12 @@ +#include + +extern void foo(void); +extern int i; + +int main() +{ + foo(); + if (i == 0x1234) + printf ("PASS\n"); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-14b.c b/ld/testsuite/ld-plugin/lto-14b.c new file mode 100644 index 00000000000..5d3eb75c7e7 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-14b.c @@ -0,0 +1,7 @@ +extern int bar(void); +extern int i; + +void foo(void) +{ + i = bar(); +} diff --git a/ld/testsuite/ld-plugin/lto-14c.c b/ld/testsuite/ld-plugin/lto-14c.c new file mode 100644 index 00000000000..a01e0f9ba9f --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-14c.c @@ -0,0 +1,6 @@ +int i; + +int bar(void) +{ + return 0x1234; +} diff --git a/ld/testsuite/ld-plugin/lto-15.out b/ld/testsuite/ld-plugin/lto-15.out new file mode 100644 index 00000000000..7ef22e9a431 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-15.out @@ -0,0 +1 @@ +PASS diff --git a/ld/testsuite/ld-plugin/lto-15a.c b/ld/testsuite/ld-plugin/lto-15a.c new file mode 100644 index 00000000000..c4ce5e9db4f --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-15a.c @@ -0,0 +1,7 @@ +#include + +int main(int argc, char **argv) +{ + printf ("PASS\n"); + return (int) ((unsigned long long) argc / argv[0][0]); +} diff --git a/ld/testsuite/ld-plugin/lto-15b.c b/ld/testsuite/ld-plugin/lto-15b.c new file mode 100644 index 00000000000..0ae748d25aa --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-15b.c @@ -0,0 +1,7 @@ +extern void abort (void); +unsigned long long +__udivdi3(unsigned long long n, unsigned long long d) +{ + abort (); + return n + d; +} diff --git a/ld/testsuite/ld-plugin/lto-16a.c b/ld/testsuite/ld-plugin/lto-16a.c new file mode 100644 index 00000000000..aa1cbe23c3d --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-16a.c @@ -0,0 +1 @@ +void foo (void) { } diff --git a/ld/testsuite/ld-plugin/lto-16a.d b/ld/testsuite/ld-plugin/lto-16a.d new file mode 100644 index 00000000000..76ff1f6f840 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-16a.d @@ -0,0 +1,3 @@ +#... +[0-9a-f]+ T foo +#... diff --git a/ld/testsuite/ld-plugin/lto-16b.c b/ld/testsuite/ld-plugin/lto-16b.c new file mode 100644 index 00000000000..31781e830db --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-16b.c @@ -0,0 +1,4 @@ +void +bar () +{ +} diff --git a/ld/testsuite/ld-plugin/lto-16b.d b/ld/testsuite/ld-plugin/lto-16b.d new file mode 100644 index 00000000000..5c0e148a4f8 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-16b.d @@ -0,0 +1,3 @@ +#... +[0-9a-f]+ T bar +#... diff --git a/ld/testsuite/ld-plugin/lto-17a.c b/ld/testsuite/ld-plugin/lto-17a.c new file mode 100644 index 00000000000..7de81b31a47 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-17a.c @@ -0,0 +1,4 @@ +void +bar (void) +{ +} diff --git a/ld/testsuite/ld-plugin/lto-17a.d b/ld/testsuite/ld-plugin/lto-17a.d new file mode 100644 index 00000000000..5c0e148a4f8 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-17a.d @@ -0,0 +1,3 @@ +#... +[0-9a-f]+ T bar +#... diff --git a/ld/testsuite/ld-plugin/lto-17b-1.d b/ld/testsuite/ld-plugin/lto-17b-1.d new file mode 100644 index 00000000000..c8f43392840 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-17b-1.d @@ -0,0 +1,4 @@ +#failif +#... +[0-9a-f]+ . bar +#... diff --git a/ld/testsuite/ld-plugin/lto-17b-2.d b/ld/testsuite/ld-plugin/lto-17b-2.d new file mode 100644 index 00000000000..76ff1f6f840 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-17b-2.d @@ -0,0 +1,3 @@ +#... +[0-9a-f]+ T foo +#... diff --git a/ld/testsuite/ld-plugin/lto-17b.c b/ld/testsuite/ld-plugin/lto-17b.c new file mode 100644 index 00000000000..f129c90b66c --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-17b.c @@ -0,0 +1,6 @@ +extern void bar(void) __attribute__((__visibility__("hidden"))); + +void foo (void) +{ + bar (); +} diff --git a/ld/testsuite/ld-plugin/lto-1a.c b/ld/testsuite/ld-plugin/lto-1a.c new file mode 100644 index 00000000000..b775d0a52cd --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-1a.c @@ -0,0 +1,4 @@ +unsigned long long bar (unsigned long long y) +{ + return 30 / y; +} diff --git a/ld/testsuite/ld-plugin/lto-1b.c b/ld/testsuite/ld-plugin/lto-1b.c new file mode 100644 index 00000000000..8a961ef1975 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-1b.c @@ -0,0 +1,8 @@ +extern unsigned long long bar (unsigned long long); + +int +main (int argc, char **argv) +{ + unsigned long long d = bar ((unsigned long long) (argc + 1)); + return d; +} diff --git a/ld/testsuite/ld-plugin/lto-2.c b/ld/testsuite/ld-plugin/lto-2.c new file mode 100644 index 00000000000..f0eacf4e85f --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-2.c @@ -0,0 +1,11 @@ +#include +#include +#include + +int +main (int argc, char **argv) +{ + int d = atoi (argv[1]); + printf ("%f\n", sin (d)); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-3.d b/ld/testsuite/ld-plugin/lto-3.d new file mode 100644 index 00000000000..c3a9a167c35 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-3.d @@ -0,0 +1,4 @@ +#failif +#... +[0-9a-f]+ T foo +#... diff --git a/ld/testsuite/ld-plugin/lto-3.out b/ld/testsuite/ld-plugin/lto-3.out new file mode 100644 index 00000000000..a69f8f3524e --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-3.out @@ -0,0 +1,2 @@ +hello foo +hello bar diff --git a/ld/testsuite/ld-plugin/lto-3a.c b/ld/testsuite/ld-plugin/lto-3a.c new file mode 100644 index 00000000000..5193972c3fc --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-3a.c @@ -0,0 +1,9 @@ +extern void foo(void); +extern void bar(void); + +int main(void) +{ + foo(); + bar(); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-3b.c b/ld/testsuite/ld-plugin/lto-3b.c new file mode 100644 index 00000000000..c24f6d47b92 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-3b.c @@ -0,0 +1,6 @@ +#include + +void foo(void) +{ + printf ("hello foo\n"); +} diff --git a/ld/testsuite/ld-plugin/lto-3c.c b/ld/testsuite/ld-plugin/lto-3c.c new file mode 100644 index 00000000000..95b3bc0a8f8 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-3c.c @@ -0,0 +1,6 @@ +#include + +void bar(void) +{ + printf ("hello bar\n"); +} diff --git a/ld/testsuite/ld-plugin/lto-3r.d b/ld/testsuite/ld-plugin/lto-3r.d new file mode 100644 index 00000000000..1d1befe90f6 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-3r.d @@ -0,0 +1,7 @@ +#ld: -r tmpdir/lto-3b.o +#source: dummy.s +#nm: -p + +#... +[0-9a-f]+ C __gnu_lto_v.* +#pass diff --git a/ld/testsuite/ld-plugin/lto-5.d b/ld/testsuite/ld-plugin/lto-5.d new file mode 100644 index 00000000000..c3a9a167c35 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-5.d @@ -0,0 +1,4 @@ +#failif +#... +[0-9a-f]+ T foo +#... diff --git a/ld/testsuite/ld-plugin/lto-5.out b/ld/testsuite/ld-plugin/lto-5.out new file mode 100644 index 00000000000..dfbb2158026 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-5.out @@ -0,0 +1 @@ +hello foo diff --git a/ld/testsuite/ld-plugin/lto-5a.c b/ld/testsuite/ld-plugin/lto-5a.c new file mode 100644 index 00000000000..2d07cf585da --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-5a.c @@ -0,0 +1,7 @@ +extern void foo(void); + +int main(void) +{ + foo(); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-5b.c b/ld/testsuite/ld-plugin/lto-5b.c new file mode 100644 index 00000000000..c24f6d47b92 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-5b.c @@ -0,0 +1,6 @@ +#include + +void foo(void) +{ + printf ("hello foo\n"); +} diff --git a/ld/testsuite/ld-plugin/lto-5r.d b/ld/testsuite/ld-plugin/lto-5r.d new file mode 100644 index 00000000000..43e9a5c5a3c --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-5r.d @@ -0,0 +1,7 @@ +#ld: -r tmpdir/lto-5a.o tmpdir/lto-5b.o +#source: dummy.s +#nm: -p + +#... +[0-9a-f]+ C __gnu_lto_v.* +#pass diff --git a/ld/testsuite/ld-plugin/lto-6.c b/ld/testsuite/ld-plugin/lto-6.c new file mode 100644 index 00000000000..749e4e02f41 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-6.c @@ -0,0 +1,9 @@ +#include + +extern char _etext[]; + +int main(void) +{ + printf ("%p: %d\n", _etext, _etext[0]); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-7.out b/ld/testsuite/ld-plugin/lto-7.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-7.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-plugin/lto-7a.c b/ld/testsuite/ld-plugin/lto-7a.c new file mode 100644 index 00000000000..d277a43da27 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-7a.c @@ -0,0 +1,14 @@ +#include +#include + +int foo = -1; + +extern void bar (); + +int +main (int argc, char **argv) +{ + bar (); + printf ("OK\n"); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-7b.c b/ld/testsuite/ld-plugin/lto-7b.c new file mode 100644 index 00000000000..179813004fa --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-7b.c @@ -0,0 +1,8 @@ +extern int foo; + +static void +__attribute__ ((unused, constructor)) +set_foo (void) +{ + foo = 30; +} diff --git a/ld/testsuite/ld-plugin/lto-7c.c b/ld/testsuite/ld-plugin/lto-7c.c new file mode 100644 index 00000000000..5236f5764ba --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-7c.c @@ -0,0 +1,9 @@ +extern int foo; +extern int foo2; + +static void +__attribute__ ((unused, constructor)) +set_foo (void) +{ + foo = foo2; +} diff --git a/ld/testsuite/ld-plugin/lto-7d.c b/ld/testsuite/ld-plugin/lto-7d.c new file mode 100644 index 00000000000..7fc1ff1d08d --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-7d.c @@ -0,0 +1,11 @@ +#include + +extern int foo; +int foo2 = 2; + +void +bar (void) +{ + if (foo != 30) + abort (); +} diff --git a/ld/testsuite/ld-plugin/lto-8.out b/ld/testsuite/ld-plugin/lto-8.out new file mode 100644 index 00000000000..35c5d69ab03 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-8.out @@ -0,0 +1 @@ +baz: 42 diff --git a/ld/testsuite/ld-plugin/lto-8a.c b/ld/testsuite/ld-plugin/lto-8a.c new file mode 100644 index 00000000000..0bdeb2723f7 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-8a.c @@ -0,0 +1,14 @@ +#include + +extern void foo(char); + +void baz(int i) +{ + printf ("baz: %d\n", i); +} + +int main(void) +{ + foo(42); + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-8b.c b/ld/testsuite/ld-plugin/lto-8b.c new file mode 100644 index 00000000000..3b6db5fbe49 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-8b.c @@ -0,0 +1,14 @@ +extern int bar(void) __attribute__((__visibility__("hidden"), __const__)); +extern void baz(int); + +void foo(char c) +{ + int i; + + if (bar()) + i = c; + else + i = c; + + baz(i); +} diff --git a/ld/testsuite/ld-plugin/lto-9.cc b/ld/testsuite/ld-plugin/lto-9.cc new file mode 100644 index 00000000000..2a4dcde3a79 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-9.cc @@ -0,0 +1,9 @@ +struct Foooo { + virtual ~Foooo () { } +}; + +int main(void) +{ + Foooo t; + return 0; +} diff --git a/ld/testsuite/ld-plugin/lto-9.d b/ld/testsuite/ld-plugin/lto-9.d new file mode 100644 index 00000000000..4b5bcf8d87b --- /dev/null +++ b/ld/testsuite/ld-plugin/lto-9.d @@ -0,0 +1,4 @@ +#failif +#... +[0-9a-f]+ . .*Foooo::Foooo.* +#... diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp new file mode 100644 index 00000000000..b5cb1b402e9 --- /dev/null +++ b/ld/testsuite/ld-plugin/lto.exp @@ -0,0 +1,304 @@ +# Expect script for ld-plugin LTO tests +# Copyright 2011 +# Free Software Foundation, Inc. +# +# This file is part of the GNU Binutils. +# +# 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. + +# These tests require plugin and LTO. +if { ![check_plugin_api_available] + || ![check_lto_available] } { + return +} + +global CFLAGS +global CXXFLAGS +set saved_CFLAGS "$CFLAGS" +set saved_CXXFLAGS "$CXXFLAGS" +regsub -all "\\-Wp,-D_FORTIFY_SOURCE=\[0-9\]+" $CFLAGS "" CFLAGS +regsub -all "\\-Wp,-D_FORTIFY_SOURCE=\[0-9\]+" $CXXFLAGS "" CXXFLAGS + +proc restore_notify { } { + global saved_CFLAGS + global saved_CXXFLAGS + set CFLAGS "$saved_CFLAGS" + set CXXFLAGS "$saved_CXXFLAGS" +} + +# Simple LTO tests and generate input files for complex LTO tests. +set lto_link_tests { + {"LTO 1" + "-O2 -flto -fuse-linker-plugin" "-flto -fuse-linker-plugin" + {lto-1a.c lto-1b.c} {} "lto-1.exe"} + {"Build libdummy.a 2" + "" "-O2 -flto -fuse-linker-plugin" + {lto-2.c} {} "libdummy.a"} + {"LTO 2" + "-static -O2 -flto -fuse-linker-plugin tmpdir/lto-2.o -lm" "" + {dummy.c} {} "lto-2.exe"} + {"Build libdummy.a 3a" + "" "-flto" + {lto-3a.c} {} "libdummy.a"} + {"Build libdummy.a 3c" + "" "-O2" + {lto-3c.c} {} "libdummy.a"} + {"Build liblto-3.a" + "" "-flto" + {lto-3b.c} {} "liblto-3.a"} + {"Build libdummy.a 5a" + "" "-flto" + {lto-5a.c} {} "libdummy.a"} + {"Build libdummy.a 5b" + "" "-flto" + {lto-5b.c} {} "libdummy.a"} + {"LTO 6" + "-O2 -flto -fuse-linker-plugin" "" + {lto-6.c} {} "lto-6.exe" "c"} + {"Build libdummy.a 9" + "" "-O2 -flto" + {lto-9.cc} {} "libdummy.a"} + {"Build libdummy.a 11a" + "" "-O -flto" + {lto-11a.c} {} "libdummy.a"} + {"Build libdummy.a 11b" + "" "-O -flto" + {lto-11b.c} {} "libdummy.a"} + {"Build libdummy.a 11c" + "" "-O" + {lto-11c.c} {} "libdummy.a"} + {"Build liblto-12.a" + "" "-O2 -flto" + {lto-12c.c} {} "liblto-12.a"} + {"Build libdummy.a 12" + "" "-O2 -flto" + {lto-12a.c lto-12b.c} {} "libdummy.a"} + {"Build libdummy.a 13" + "" "-O2 -flto" + {lto-13a.c lto-13b.c} {} "libdummy.a"} + {"Build liblto-13.a" + "" "-O2" + {lto-13c.c} {} "liblto-13.a"} + {"Build libdummy.a 14a" + "" "-flto" + {lto-14a.c lto-14b.c} {} "libdummy.a"} + {"Build liblto-14.a" + "" "-flto" + {lto-14c.c} {} "liblto-14.a"} + {"Build libdummy.a 15a" + "" "-flto" + {lto-15a.c} {} "libdummy.a"} + {"Build liblto-15.a" + "" "-flto" + {lto-15b.c} {} "liblto-15.a"} + {"PR ld/12696" + "-O2 -flto -fuse-linker-plugin -r -nostdlib" "-O2 -flto" + {pr12696-1.cc} {} "pr12696-1r.o" "c"} + {"Build libdummy.a PR ld/12758" + "" "" + {pr12758a.s} {} "libdummy.a"} + {"Build libpr12758.a" + "" "-flto -O2" + {pr12758b.c} {} "libpr12758.a"} + {"PR ld/12758" + "-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12758a.o -Wl,--start-group tmpdir/libpr12758.a -Wl,--end-group" "" + {dummy.c} {} "pr12758.exe"} + {"Build libdummy.a PR ld/12760" + "" "" + {pr12760a.c} {} "libdummy.a"} + {"Build libpr12760.a" + "" "-flto -O2" + {pr12760b.c} {} "libpr12760.a"} + {"PR ld/12760" + "-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12760a.o -Wl,--start-group tmpdir/libpr12760.a -Wl,--end-group" "" + {dummy.c} {} "pr12760.exe" "c" "warning: Bad bar"} + {"Build libdummy.a PR ld/12942 (1)" + "" "-flto -O2" + {pr12942a.cc pr12942c.cc} {} "libdummy.a" "c++"} + {"Build libdummy.a PR ld/12942 (2)" + "" "-O0" + {pr12942b.cc} {} "libdummy.a" "c++"} + {"Build libpr13183.a" + "-T" "-flto -O2" + {pr13183a.c} {} "libpr13183.a"} + {"Build libdummy.a PR ld/13183" + "" "-flto -O2" + {pr13183b.c} {} "libdummy.a"} + {"Build libdummy.a PR ld/13201" + "" "-flto -O2" + {pr13201.c} {} "libdummy.a"} + {"PR ld/13287" + "-flto -fuse-linker-plugin -Wl,--as-needed" "-flto" + {pr13287.cc} {} "pr13287.exe" "c++"} +} + +# Generate input files for complex LTO tests for ELF. +set lto_link_elf_tests { + {"Build libdummy.a 7" + "" "-flto -O2" + {lto-7a.c lto-7b.c lto-7c.c} {} "libdummy.a"} + {"Build liblto-7.so" + "-shared" "-O2 -fpic" + {lto-7d.c} {} "liblto-7.so" "c"} + {"Build libdummy.a 8a" + "" "-O2" + {lto-8a.c} {} "libdummy.a"} + {"Build libdummy.a 8b" + "" "-flto -O2" + {lto-8b.c} {} "libdummy.a"} + {"Build liblto-17a.so" + "-shared -O2 -fpic -flto -fuse-linker-plugin" "-O2 -fpic -flto" + {lto-17a.c} {{"nm" {} "lto-17a.d"}} "liblto-17a.so" "c"} + {"Build liblto-17b.so 1" + "-shared -O2 -fpic -flto -fuse-linker-plugin tmpdir/lto-17a.o" "-O2 -fpic -flto" + {lto-17b.c} {{"nm" {} "lto-17b-1.d"}} "liblto-17b.so"} + {"Build liblto-17b.so 2" + "-shared -O2 -fpic -flto -fuse-linker-plugin tmpdir/lto-17a.o" "-O2 -fpic -flto" + {lto-17b.c} {{"nm" {} "lto-17b-2.d"}} "liblto-17b.so"} + {"PR ld/12982" + "-O2 -flto -fuse-linker-plugin" "-O2 -flto" + {pr12982.c} {{"readelf" {-l --wide} "pr12982.d"}} "pr12982.exe"} + {"PR ld/12975" + "-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib -Wl,-version-script,pr12975.t" "-O2 -flto" + {pr12975.c} {{"readelf" {-s --wide} "pr12975.d"}} "pr12975.so" "c"} + {"PR ld/13229" + "-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib" "-O2 -fno-early-inlining -flto" + {pr13229.cc} {{"readelf" {-s --wide} "pr13229.d"}} "pr13229.so" "c++"} + {"PR ld/13244" + "-shared -O2 -fPIC -flto -fuse-linker-plugin -nostdlib" "-O2 -fno-early-inlining -flto" + {pr13244.c} {{"readelf" {-s --wide} "pr13244.d"}} "pr13244.so" "c"} +} + +# Check final symbols in executables. +set lto_link_symbol_tests { + {"LTO 3 symbol" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/liblto-3.a" "" + {dummy.c} {{"nm" {} "lto-3.d"}} "lto-3.exe" "c"} + {"LTO 5 symbol" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-5.o" "" + {dummy.c} {{"nm" {} "lto-5.d"}} "lto-5.exe" "c"} + {"LTO 9 symbol" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-9.o" "" + {dummy.c} {{"nm" {-C} "lto-9.d"}} "lto-9.exe" "c++"} + {"LTO 16a symbol" + "-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin" "-flto" + {lto-16a.c} {{"nm" {} "lto-16a.d"}} "lto-16.exe" "c"} + {"LTO 16b symbol" + "-O2 -Wl,-e,foo -u bar -nostdlib -flto -fuse-linker-plugin" "-flto" + {lto-16a.c lto-16b.c} {{"nm" {} "lto-16b.d"}} "lto-16b.exe" "c"} + {"PR ld/13183" + "-O2 -flto -fuse-linker-plugin tmpdir/pr13183b.o tmpdir/libpr13183.a" "" + {dummy.c} {{"nm" {} "pr13183.d"}} "pr13183.exe" "c"} +} + +# LTO run-time tests. +set lto_run_tests { + {"LTO 3a" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/liblto-3.a" "" + {dummy.c} "lto-3b.exe" "lto-3.out" "" "c"} + {"LTO 3b" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o tmpdir/lto-3.o" "" + {dummy.c} "lto-3c.exe" "lto-3.out" "" "c"} + {"LTO 3c" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o -Wl,--whole-archive tmpdir/liblto-3.a -Wl,--no-whole-archive tmpdir/liblto-3.a" "" + {dummy.c} "lto-3d.exe" "lto-3.out" "" "c"} + {"LTO 5" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-5.o" "" + {dummy.c} "lto-5.exe" "lto-5.out" "" "c"} + {"LTO 11" + "-O -flto -fuse-linker-plugin tmpdir/liblto-11.a" "" + {dummy.c} "lto-11.exe" "lto-11.out" "" "c"} + {"LTO 12a" + "-O -flto -fuse-linker-plugin tmpdir/lto-12a.o tmpdir/liblto-12.a tmpdir/lto-12b.o" "" + {dummy.c} "lto-12a.exe" "lto-12.out" "" "c"} + {"LTO 12b" + "-O -flto -fuse-linker-plugin tmpdir/lto-12a.o tmpdir/lto-12b.o tmpdir/liblto-12.a" "" + {dummy.c} "lto-12b.exe" "lto-12.out" "" "c"} + {"LTO 13" + "-O -flto -fuse-linker-plugin tmpdir/lto-13a.o tmpdir/liblto-13.a tmpdir/lto-13b.o" "" + {dummy.c} "lto-13.exe" "lto-13.out" "" "c"} + {"LTO 14" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-14a.o -Wl,--whole-archive tmpdir/liblto-14.a -Wl,--no-whole-archive tmpdir/lto-14b.o" "" + {dummy.c} "lto-14.exe" "lto-14.out" "" "c"} + {"LTO 15" + "-O2 -flto -fuse-linker-plugin -Wl,--start-group tmpdir/liblto-15.a tmpdir/lto-15a.o -Wl,--end-group" "" + {dummy.c} "lto-15.exe" "lto-15.out" "" "c"} + {"PR ld/12942 (1)" + "-O2 -flto -fuse-linker-plugin tmpdir/pr12942a.o tmpdir/pr12942b.o" "" + {dummy.c} "pr12942a.exe" "pr12942.out" "" "c++"} + {"PR ld/12942 (2)" + "-O2 -flto -fuse-linker-plugin tmpdir/pr12942a.o tmpdir/pr12942c.o" "" + {dummy.c} "pr12942c.exe" "pr12942.out" "" "c++"} + {"PR ld/13066" + "-O2 -flto -fuse-linker-plugin" "" + {pr13066.cc} "pr13066.exe" "pr13066.out" "" "c++"} + {"PR ld/13201" + "-O2 -flto -fuse-linker-plugin -Wl,--as-needed tmpdir/pr13201.o -lm" "" + {dummy.c} "pr13201.exe" "pr13201.out" "" "c"} +} + +# LTO run-time tests for ELF +set lto_run_elf_tests { + {"LTO 7" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-7b.o tmpdir/lto-7c.o tmpdir/lto-7a.o tmpdir/liblto-7.so" "" + {dummy.c} "lto-7.exe" "lto-7.out" "" "c"} + {"LTO 8" + "-O2 -flto -fuse-linker-plugin tmpdir/lto-8b.o tmpdir/lto-8a.o" "" + {dummy.c} "lto-8.exe" "lto-8.out" "" "c"} + {"LTO TLS IE" + "-O2 -flto -fuse-linker-plugin" "" + {run-ie.c} "run-ie.exe" "run-ie.out" "" "c"} +} + +run_cc_link_tests $lto_link_tests + +if { [is_elf_format] } { + run_cc_link_tests $lto_link_elf_tests +} + +set testname "Build liblto-11.a" +remote_file host delete "tmpdir/liblto-11.a" +set catch_output [run_host_cmd "$ar" "rc tmpdir/liblto-11.a tmpdir/lto-11a.o tmpdir/lto-11b.o tmpdir/lto-11c.o"] +if {![string match "" $catch_output]} { + unresolved $testname + restore_notify + return +} + +# Check expected LTO linker errors. +set testname "PR ld/12942 (3)" +set exec_output [run_host_cmd "$CXX" "$gcc_gas_flag $gcc_ld_flag -O2 -flto -fuse-linker-plugin tmpdir/pr12942b.o tmpdir/pr12942a.o"] +if { [ regexp "pr12942a.h:7: undefined reference to `link_error\\(\\)'" $exec_output ] } { + pass $testname +} { + fail $testname +} + +# Run "ld -r" to generate inputs for complex LTO tests. +run_dump_test "lto-3r" +remote_exec host "mv" "tmpdir/dump tmpdir/lto-3.o" +run_dump_test "lto-5r" +remote_exec host "mv" "tmpdir/dump tmpdir/lto-5.o" + +run_cc_link_tests $lto_link_symbol_tests + +run_ld_link_exec_tests [] $lto_run_tests + +if { [is_elf_format] } { + run_ld_link_exec_tests [] $lto_run_elf_tests +} + +restore_notify diff --git a/ld/testsuite/ld-plugin/pr12696-1.cc b/ld/testsuite/ld-plugin/pr12696-1.cc new file mode 100644 index 00000000000..084c07f0814 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12696-1.cc @@ -0,0 +1,7 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-ftoplevel-reorder -flto -flto-partition=none} {-ftoplevel-reorder -flto -flto-partition=1to1}} } */ +/* { dg-extra-ld-options {-r -nostdlib} } */ + +struct Foo { virtual ~Foo(); }; +struct Bar:public Foo { Bar() { } }; +void Func() { new Bar(); } diff --git a/ld/testsuite/ld-plugin/pr12758a.s b/ld/testsuite/ld-plugin/pr12758a.s new file mode 100644 index 00000000000..04409d09665 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12758a.s @@ -0,0 +1,4 @@ + .text + .globl foo +foo: + .dc.a memcmp diff --git a/ld/testsuite/ld-plugin/pr12758b.c b/ld/testsuite/ld-plugin/pr12758b.c new file mode 100644 index 00000000000..5bcf116bc9c --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12758b.c @@ -0,0 +1,12 @@ +#include + +int memcmp(const void *cs, const void *ct, size_t count) +{ + const unsigned char *su1, *su2; + int res = 0; + + for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) + if ((res = *su1 - *su2) != 0) + break; + return res; +} diff --git a/ld/testsuite/ld-plugin/pr12760a.c b/ld/testsuite/ld-plugin/pr12760a.c new file mode 100644 index 00000000000..6169c26716d --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12760a.c @@ -0,0 +1,7 @@ +extern void bar (); + +void +foo () +{ + bar (); +} diff --git a/ld/testsuite/ld-plugin/pr12760b.c b/ld/testsuite/ld-plugin/pr12760b.c new file mode 100644 index 00000000000..29a9fd89ef1 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12760b.c @@ -0,0 +1,7 @@ +#define linker_warning(x, msg) \ + static const char __warn_##x[] \ + __attribute__((used, section(".gnu.warning." #x))) \ + = msg + +void bar (void) {} +linker_warning(bar, "Bad bar"); diff --git a/ld/testsuite/ld-plugin/pr12942.out b/ld/testsuite/ld-plugin/pr12942.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12942.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-plugin/pr12942a.cc b/ld/testsuite/ld-plugin/pr12942a.cc new file mode 100644 index 00000000000..1a18404ca40 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12942a.cc @@ -0,0 +1,16 @@ +#include +#include "pr12942a.h" + +extern "C" void abort (); + +test_t b(void); + +int +main(void) +{ + if (test != b ()) + abort (); + + printf ("OK\n"); + return 0; +} diff --git a/ld/testsuite/ld-plugin/pr12942a.h b/ld/testsuite/ld-plugin/pr12942a.h new file mode 100644 index 00000000000..760929b1119 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12942a.h @@ -0,0 +1,12 @@ +extern void link_error (); + +inline int test (void) +{ + int exp = -1; + if ((exp < 2 ? 2U : (unsigned int) exp) != 2) + link_error (); + + return 0; +} + +typedef int (*test_t) (void); diff --git a/ld/testsuite/ld-plugin/pr12942b.cc b/ld/testsuite/ld-plugin/pr12942b.cc new file mode 100644 index 00000000000..387954e4185 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12942b.cc @@ -0,0 +1,7 @@ +#include +#include "pr12942a.h" + +test_t b(void) +{ + return test; +} diff --git a/ld/testsuite/ld-plugin/pr12942c.cc b/ld/testsuite/ld-plugin/pr12942c.cc new file mode 100644 index 00000000000..9b07231e600 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12942c.cc @@ -0,0 +1 @@ +#include "pr12942b.cc" diff --git a/ld/testsuite/ld-plugin/pr12975.c b/ld/testsuite/ld-plugin/pr12975.c new file mode 100644 index 00000000000..909af976c2a --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12975.c @@ -0,0 +1,7 @@ +int foo() { return 42; } + +int bar() { return 0; } + +#pragma GCC visibility push(hidden) +int baz() { return 1; } +#pragma GCC visibility pop diff --git a/ld/testsuite/ld-plugin/pr12975.d b/ld/testsuite/ld-plugin/pr12975.d new file mode 100644 index 00000000000..7fcff8012e9 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12975.d @@ -0,0 +1,4 @@ +#failif +#... + +[0-9]+: +[0-9a-f]+ +[0-9]+ +FUNC +LOCAL +DEFAULT +[1-9]+ bar +#... diff --git a/ld/testsuite/ld-plugin/pr12975.t b/ld/testsuite/ld-plugin/pr12975.t new file mode 100644 index 00000000000..902c1f70bf9 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12975.t @@ -0,0 +1,6 @@ +{ +global: + foo; +local: + *; +}; diff --git a/ld/testsuite/ld-plugin/pr12982.c b/ld/testsuite/ld-plugin/pr12982.c new file mode 100644 index 00000000000..398ec675a07 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12982.c @@ -0,0 +1,5 @@ +int +main (void) +{ + return 0; +} diff --git a/ld/testsuite/ld-plugin/pr12982.d b/ld/testsuite/ld-plugin/pr12982.d new file mode 100644 index 00000000000..f536d5b640b --- /dev/null +++ b/ld/testsuite/ld-plugin/pr12982.d @@ -0,0 +1,3 @@ +#... +[ \t]+GNU_STACK[ \t]+0x[0-9a-f]+ +0x[0-9a-f]+ +0x[0-9a-f]+ +0x[0-9a-f]+ +0x[0-9a-f]+ +RW +0x[0-9a-f]+ +#pass diff --git a/ld/testsuite/ld-plugin/pr13066.cc b/ld/testsuite/ld-plugin/pr13066.cc new file mode 100644 index 00000000000..b2c73f2d8ea --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13066.cc @@ -0,0 +1,85 @@ +#include + +template struct S +{ + V *f, *l; + __attribute__ ((noinline)) S (void) { f = 0, l = 0; } + void foo (V *x) + { + if (x->p != 0) + x->p->n = x->n; + else + f = x->n; + if (x->n != 0) + x->n->p = x->p; + else + l = x->p; + } + __attribute__ ((noinline)) void bar (V *x) + { + x->n = 0; + x->p = l; + if (l != 0) + l->n = x; + else + f = x; + l = x; + } +}; + +struct H; + +struct A +{ + S k; +}; + +struct H +{ + A *a; + H *p, *n; + __attribute__ ((noinline)) H (void) { p = 0, n = 0, a = 0; } + __attribute__ ((noinline)) H (A *b) : a (b) + { + p = 0; + n = 0; + if (a != 0) + a->k.bar (this); + } + __attribute__ ((noinline)) H (const H &h) : a (h.a) + { + p = 0; + n = 0; + if (a != 0) + a->k.bar (this); + } + ~H (void) { if (a != 0) a->k.foo (this); } + H &operator= (const H &o) + { + if (a != 0 || &o == this) + __builtin_abort (); + a = o.a; + if (a != 0) + a->k.bar (this); + return *this; + } +}; + +__attribute__ ((noinline)) +H baz (void) +{ + return H (new A); +} + +H g; + +int +main (void) +{ + g = baz (); + if (g.a->k.f != &g) + __builtin_abort (); + printf ("OK\n"); + return 0; +} + diff --git a/ld/testsuite/ld-plugin/pr13066.out b/ld/testsuite/ld-plugin/pr13066.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13066.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-plugin/pr13183.d b/ld/testsuite/ld-plugin/pr13183.d new file mode 100644 index 00000000000..a390282e4b5 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13183.d @@ -0,0 +1,4 @@ +#failif +#... +[0-9a-f]+ . foo +#... diff --git a/ld/testsuite/ld-plugin/pr13183a.c b/ld/testsuite/ld-plugin/pr13183a.c new file mode 100644 index 00000000000..c83d85699cc --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13183a.c @@ -0,0 +1,4 @@ +int foo(void) +{ + return 0; +} diff --git a/ld/testsuite/ld-plugin/pr13183b.c b/ld/testsuite/ld-plugin/pr13183b.c new file mode 100644 index 00000000000..93d57b520cb --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13183b.c @@ -0,0 +1,6 @@ +extern int foo(void); + +int main(void) +{ + return foo(); +} diff --git a/ld/testsuite/ld-plugin/pr13201.c b/ld/testsuite/ld-plugin/pr13201.c new file mode 100644 index 00000000000..3bea10c813c --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13201.c @@ -0,0 +1,17 @@ +#include +#include +#include + +int +main(int argc, char **argv) +{ + double x; + if (argc > 1) + x = atof (argv[1]); + else + x = 3; + x = sin (x); + if (x > 0) + printf("OK\n"); + return 0; +} diff --git a/ld/testsuite/ld-plugin/pr13201.out b/ld/testsuite/ld-plugin/pr13201.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13201.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-plugin/pr13229.cc b/ld/testsuite/ld-plugin/pr13229.cc new file mode 100644 index 00000000000..14083624edf --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13229.cc @@ -0,0 +1,15 @@ +void call_something (int); +inline void optimize_me_out (void) +{ + call_something(0); +} +__attribute__ ((visibility("hidden"))) +void optimize_me_out2 (int param) +{ + if ((void *)optimize_me_out != (void *)call_something) + call_something(0); +} +void test2 (void) +{ + optimize_me_out(); +} diff --git a/ld/testsuite/ld-plugin/pr13229.d b/ld/testsuite/ld-plugin/pr13229.d new file mode 100644 index 00000000000..017a716d352 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13229.d @@ -0,0 +1,4 @@ +#failif +#... +.*optimize_me_out.* +#... diff --git a/ld/testsuite/ld-plugin/pr13244.c b/ld/testsuite/ld-plugin/pr13244.c new file mode 100644 index 00000000000..efe93bfcd5d --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13244.c @@ -0,0 +1,14 @@ +extern __attribute__ ((visibility("hidden"))) int fooblah; + +static void +do_nothing (int param) +{ + if (param) + fooblah = 1; +} + +void +bar () +{ + do_nothing (0); +} diff --git a/ld/testsuite/ld-plugin/pr13244.d b/ld/testsuite/ld-plugin/pr13244.d new file mode 100644 index 00000000000..59bbe4d8928 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13244.d @@ -0,0 +1,4 @@ +#failif +#... +.*fooblah.* +#... diff --git a/ld/testsuite/ld-plugin/pr13287.cc b/ld/testsuite/ld-plugin/pr13287.cc new file mode 100644 index 00000000000..67e85062bdd --- /dev/null +++ b/ld/testsuite/ld-plugin/pr13287.cc @@ -0,0 +1 @@ +int main() {return 0; } diff --git a/ld/testsuite/ld-plugin/run-ie.c b/ld/testsuite/ld-plugin/run-ie.c new file mode 100644 index 00000000000..32afa0a2492 --- /dev/null +++ b/ld/testsuite/ld-plugin/run-ie.c @@ -0,0 +1,32 @@ +#include + +extern void abort (void); + +__thread int tls_ie __attribute__((tls_model("initial-exec"))) = 4; + +int get_ie (void) +{ + return tls_ie; +} + +int *get_iep (void) +{ + return &tls_ie; +} + +int main (void) +{ + int val; + + val = get_ie (); + if (val != 4) + abort (); + + val = *get_iep (); + if (val != 4) + abort (); + + printf ("IE: %d\n", val); + + return 0; +} diff --git a/ld/testsuite/ld-plugin/run-ie.out b/ld/testsuite/ld-plugin/run-ie.out new file mode 100644 index 00000000000..7edca6d3b20 --- /dev/null +++ b/ld/testsuite/ld-plugin/run-ie.out @@ -0,0 +1 @@ +IE: 4