Add LTO tests
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 7 Dec 2012 19:23:50 +0000 (19:23 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 7 Dec 2012 19:23:50 +0000 (19:23 +0000)
* 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.

86 files changed:
ld/testsuite/ChangeLog
ld/testsuite/ld-plugin/dummy.c [new file with mode: 0644]
ld/testsuite/ld-plugin/dummy.s [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-11.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-11a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-11b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-11c.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-12.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-12a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-12b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-12c.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-13.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-13a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-13b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-13c.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-14.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-14a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-14b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-14c.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-15.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-15a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-15b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-16a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-16a.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-16b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-16b.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-17a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-17a.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-17b-1.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-17b-2.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-17b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-1a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-1b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-2.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-3.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-3.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-3a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-3b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-3c.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-3r.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-5.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-5.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-5a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-5b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-5r.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-6.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-7.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-7a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-7b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-7c.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-7d.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-8.out [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-8a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-8b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-9.cc [new file with mode: 0644]
ld/testsuite/ld-plugin/lto-9.d [new file with mode: 0644]
ld/testsuite/ld-plugin/lto.exp [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12696-1.cc [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12758a.s [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12758b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12760a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12760b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12942.out [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12942a.cc [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12942a.h [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12942b.cc [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12942c.cc [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12975.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12975.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12975.t [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12982.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr12982.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13066.cc [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13066.out [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13183.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13183a.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13183b.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13201.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13201.out [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13229.cc [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13229.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13244.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13244.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr13287.cc [new file with mode: 0644]
ld/testsuite/ld-plugin/run-ie.c [new file with mode: 0644]
ld/testsuite/ld-plugin/run-ie.out [new file with mode: 0644]

index 3a1d4371f0002ffea80fc6ccff323022a2cbdedd..d6a37fc7432a0ee2f0c554d66558d886fc66c894 100644 (file)
@@ -1,3 +1,91 @@
+2012-12-07  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * 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  <hongjiu.lu@intel.com>
 
        * 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 (file)
index 0000000..5c03287
--- /dev/null
@@ -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 (file)
index 0000000..8b13789
--- /dev/null
@@ -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 (file)
index 0000000..899682a
--- /dev/null
@@ -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 (file)
index 0000000..5193972
--- /dev/null
@@ -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 (file)
index 0000000..62d61ec
--- /dev/null
@@ -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 (file)
index 0000000..8cd40b9
--- /dev/null
@@ -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 (file)
index 0000000..d86bac9
--- /dev/null
@@ -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 (file)
index 0000000..30ff3d9
--- /dev/null
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+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 (file)
index 0000000..c2b00e4
--- /dev/null
@@ -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 (file)
index 0000000..ecd1bd4
--- /dev/null
@@ -0,0 +1,15 @@
+#include <string.h>
+
+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 (file)
index 0000000..3bd1f0e
--- /dev/null
@@ -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 (file)
index 0000000..5193972
--- /dev/null
@@ -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 (file)
index 0000000..7c87a5e
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..4859019
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..7ef22e9
--- /dev/null
@@ -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 (file)
index 0000000..d61437b
--- /dev/null
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..5d3eb75
--- /dev/null
@@ -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 (file)
index 0000000..a01e0f9
--- /dev/null
@@ -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 (file)
index 0000000..7ef22e9
--- /dev/null
@@ -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 (file)
index 0000000..c4ce5e9
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..0ae748d
--- /dev/null
@@ -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 (file)
index 0000000..aa1cbe2
--- /dev/null
@@ -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 (file)
index 0000000..76ff1f6
--- /dev/null
@@ -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 (file)
index 0000000..31781e8
--- /dev/null
@@ -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 (file)
index 0000000..5c0e148
--- /dev/null
@@ -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 (file)
index 0000000..7de81b3
--- /dev/null
@@ -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 (file)
index 0000000..5c0e148
--- /dev/null
@@ -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 (file)
index 0000000..c8f4339
--- /dev/null
@@ -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 (file)
index 0000000..76ff1f6
--- /dev/null
@@ -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 (file)
index 0000000..f129c90
--- /dev/null
@@ -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 (file)
index 0000000..b775d0a
--- /dev/null
@@ -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 (file)
index 0000000..8a961ef
--- /dev/null
@@ -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 (file)
index 0000000..f0eacf4
--- /dev/null
@@ -0,0 +1,11 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+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 (file)
index 0000000..c3a9a16
--- /dev/null
@@ -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 (file)
index 0000000..a69f8f3
--- /dev/null
@@ -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 (file)
index 0000000..5193972
--- /dev/null
@@ -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 (file)
index 0000000..c24f6d4
--- /dev/null
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..95b3bc0
--- /dev/null
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..1d1befe
--- /dev/null
@@ -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 (file)
index 0000000..c3a9a16
--- /dev/null
@@ -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 (file)
index 0000000..dfbb215
--- /dev/null
@@ -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 (file)
index 0000000..2d07cf5
--- /dev/null
@@ -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 (file)
index 0000000..c24f6d4
--- /dev/null
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..43e9a5c
--- /dev/null
@@ -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 (file)
index 0000000..749e4e0
--- /dev/null
@@ -0,0 +1,9 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..d86bac9
--- /dev/null
@@ -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 (file)
index 0000000..d277a43
--- /dev/null
@@ -0,0 +1,14 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+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 (file)
index 0000000..1798130
--- /dev/null
@@ -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 (file)
index 0000000..5236f57
--- /dev/null
@@ -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 (file)
index 0000000..7fc1ff1
--- /dev/null
@@ -0,0 +1,11 @@
+#include <stdlib.h>
+
+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 (file)
index 0000000..35c5d69
--- /dev/null
@@ -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 (file)
index 0000000..0bdeb27
--- /dev/null
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..3b6db5f
--- /dev/null
@@ -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 (file)
index 0000000..2a4dcde
--- /dev/null
@@ -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 (file)
index 0000000..4b5bcf8
--- /dev/null
@@ -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 (file)
index 0000000..b5cb1b4
--- /dev/null
@@ -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 (file)
index 0000000..084c07f
--- /dev/null
@@ -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 (file)
index 0000000..04409d0
--- /dev/null
@@ -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 (file)
index 0000000..5bcf116
--- /dev/null
@@ -0,0 +1,12 @@
+#include <string.h>
+
+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 (file)
index 0000000..6169c26
--- /dev/null
@@ -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 (file)
index 0000000..29a9fd8
--- /dev/null
@@ -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 (file)
index 0000000..d86bac9
--- /dev/null
@@ -0,0 +1 @@
+OK
diff --git a/ld/testsuite/ld-plugin/pr12942a.cc b/ld/testsuite/ld-plugin/pr12942a.cc
new file mode 100644 (file)
index 0000000..1a18404
--- /dev/null
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#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 (file)
index 0000000..760929b
--- /dev/null
@@ -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 (file)
index 0000000..387954e
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+#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 (file)
index 0000000..9b07231
--- /dev/null
@@ -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 (file)
index 0000000..909af97
--- /dev/null
@@ -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 (file)
index 0000000..7fcff80
--- /dev/null
@@ -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 (file)
index 0000000..902c1f7
--- /dev/null
@@ -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 (file)
index 0000000..398ec67
--- /dev/null
@@ -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 (file)
index 0000000..f536d5b
--- /dev/null
@@ -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 (file)
index 0000000..b2c73f2
--- /dev/null
@@ -0,0 +1,85 @@
+#include <stdio.h>
+
+template <typename V> 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 <H> 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 (file)
index 0000000..d86bac9
--- /dev/null
@@ -0,0 +1 @@
+OK
diff --git a/ld/testsuite/ld-plugin/pr13183.d b/ld/testsuite/ld-plugin/pr13183.d
new file mode 100644 (file)
index 0000000..a390282
--- /dev/null
@@ -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 (file)
index 0000000..c83d856
--- /dev/null
@@ -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 (file)
index 0000000..93d57b5
--- /dev/null
@@ -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 (file)
index 0000000..3bea10c
--- /dev/null
@@ -0,0 +1,17 @@
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+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 (file)
index 0000000..d86bac9
--- /dev/null
@@ -0,0 +1 @@
+OK
diff --git a/ld/testsuite/ld-plugin/pr13229.cc b/ld/testsuite/ld-plugin/pr13229.cc
new file mode 100644 (file)
index 0000000..1408362
--- /dev/null
@@ -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 (file)
index 0000000..017a716
--- /dev/null
@@ -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 (file)
index 0000000..efe93bf
--- /dev/null
@@ -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 (file)
index 0000000..59bbe4d
--- /dev/null
@@ -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 (file)
index 0000000..67e8506
--- /dev/null
@@ -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 (file)
index 0000000..32afa0a
--- /dev/null
@@ -0,0 +1,32 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..7edca6d
--- /dev/null
@@ -0,0 +1 @@
+IE: 4