summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-12-07 19:23:50 +0000
committerH.J. Lu <hjl.tools@gmail.com>2012-12-07 19:23:50 +0000
commitaf55061b181d122041b34ef1455fc379d83f9c5c (patch)
tree22957d437883bed8e2a6a499ae09b26d05a03152 /ld
parentc4139418925416279f6d3fbc454d3892d6b7fb76 (diff)
downloadbinutils-gdb-af55061b181d122041b34ef1455fc379d83f9c5c.tar.gz
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.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ChangeLog88
-rw-r--r--ld/testsuite/ld-plugin/dummy.c1
-rw-r--r--ld/testsuite/ld-plugin/dummy.s1
-rw-r--r--ld/testsuite/ld-plugin/lto-11.out2
-rw-r--r--ld/testsuite/ld-plugin/lto-11a.c9
-rw-r--r--ld/testsuite/ld-plugin/lto-11b.c6
-rw-r--r--ld/testsuite/ld-plugin/lto-11c.c6
-rw-r--r--ld/testsuite/ld-plugin/lto-12.out1
-rw-r--r--ld/testsuite/ld-plugin/lto-12a.c16
-rw-r--r--ld/testsuite/ld-plugin/lto-12b.c1
-rw-r--r--ld/testsuite/ld-plugin/lto-12c.c15
-rw-r--r--ld/testsuite/ld-plugin/lto-13.out2
-rw-r--r--ld/testsuite/ld-plugin/lto-13a.c9
-rw-r--r--ld/testsuite/ld-plugin/lto-13b.c7
-rw-r--r--ld/testsuite/ld-plugin/lto-13c.c7
-rw-r--r--ld/testsuite/ld-plugin/lto-14.out1
-rw-r--r--ld/testsuite/ld-plugin/lto-14a.c12
-rw-r--r--ld/testsuite/ld-plugin/lto-14b.c7
-rw-r--r--ld/testsuite/ld-plugin/lto-14c.c6
-rw-r--r--ld/testsuite/ld-plugin/lto-15.out1
-rw-r--r--ld/testsuite/ld-plugin/lto-15a.c7
-rw-r--r--ld/testsuite/ld-plugin/lto-15b.c7
-rw-r--r--ld/testsuite/ld-plugin/lto-16a.c1
-rw-r--r--ld/testsuite/ld-plugin/lto-16a.d3
-rw-r--r--ld/testsuite/ld-plugin/lto-16b.c4
-rw-r--r--ld/testsuite/ld-plugin/lto-16b.d3
-rw-r--r--ld/testsuite/ld-plugin/lto-17a.c4
-rw-r--r--ld/testsuite/ld-plugin/lto-17a.d3
-rw-r--r--ld/testsuite/ld-plugin/lto-17b-1.d4
-rw-r--r--ld/testsuite/ld-plugin/lto-17b-2.d3
-rw-r--r--ld/testsuite/ld-plugin/lto-17b.c6
-rw-r--r--ld/testsuite/ld-plugin/lto-1a.c4
-rw-r--r--ld/testsuite/ld-plugin/lto-1b.c8
-rw-r--r--ld/testsuite/ld-plugin/lto-2.c11
-rw-r--r--ld/testsuite/ld-plugin/lto-3.d4
-rw-r--r--ld/testsuite/ld-plugin/lto-3.out2
-rw-r--r--ld/testsuite/ld-plugin/lto-3a.c9
-rw-r--r--ld/testsuite/ld-plugin/lto-3b.c6
-rw-r--r--ld/testsuite/ld-plugin/lto-3c.c6
-rw-r--r--ld/testsuite/ld-plugin/lto-3r.d7
-rw-r--r--ld/testsuite/ld-plugin/lto-5.d4
-rw-r--r--ld/testsuite/ld-plugin/lto-5.out1
-rw-r--r--ld/testsuite/ld-plugin/lto-5a.c7
-rw-r--r--ld/testsuite/ld-plugin/lto-5b.c6
-rw-r--r--ld/testsuite/ld-plugin/lto-5r.d7
-rw-r--r--ld/testsuite/ld-plugin/lto-6.c9
-rw-r--r--ld/testsuite/ld-plugin/lto-7.out1
-rw-r--r--ld/testsuite/ld-plugin/lto-7a.c14
-rw-r--r--ld/testsuite/ld-plugin/lto-7b.c8
-rw-r--r--ld/testsuite/ld-plugin/lto-7c.c9
-rw-r--r--ld/testsuite/ld-plugin/lto-7d.c11
-rw-r--r--ld/testsuite/ld-plugin/lto-8.out1
-rw-r--r--ld/testsuite/ld-plugin/lto-8a.c14
-rw-r--r--ld/testsuite/ld-plugin/lto-8b.c14
-rw-r--r--ld/testsuite/ld-plugin/lto-9.cc9
-rw-r--r--ld/testsuite/ld-plugin/lto-9.d4
-rw-r--r--ld/testsuite/ld-plugin/lto.exp304
-rw-r--r--ld/testsuite/ld-plugin/pr12696-1.cc7
-rw-r--r--ld/testsuite/ld-plugin/pr12758a.s4
-rw-r--r--ld/testsuite/ld-plugin/pr12758b.c12
-rw-r--r--ld/testsuite/ld-plugin/pr12760a.c7
-rw-r--r--ld/testsuite/ld-plugin/pr12760b.c7
-rw-r--r--ld/testsuite/ld-plugin/pr12942.out1
-rw-r--r--ld/testsuite/ld-plugin/pr12942a.cc16
-rw-r--r--ld/testsuite/ld-plugin/pr12942a.h12
-rw-r--r--ld/testsuite/ld-plugin/pr12942b.cc7
-rw-r--r--ld/testsuite/ld-plugin/pr12942c.cc1
-rw-r--r--ld/testsuite/ld-plugin/pr12975.c7
-rw-r--r--ld/testsuite/ld-plugin/pr12975.d4
-rw-r--r--ld/testsuite/ld-plugin/pr12975.t6
-rw-r--r--ld/testsuite/ld-plugin/pr12982.c5
-rw-r--r--ld/testsuite/ld-plugin/pr12982.d3
-rw-r--r--ld/testsuite/ld-plugin/pr13066.cc85
-rw-r--r--ld/testsuite/ld-plugin/pr13066.out1
-rw-r--r--ld/testsuite/ld-plugin/pr13183.d4
-rw-r--r--ld/testsuite/ld-plugin/pr13183a.c4
-rw-r--r--ld/testsuite/ld-plugin/pr13183b.c6
-rw-r--r--ld/testsuite/ld-plugin/pr13201.c17
-rw-r--r--ld/testsuite/ld-plugin/pr13201.out1
-rw-r--r--ld/testsuite/ld-plugin/pr13229.cc15
-rw-r--r--ld/testsuite/ld-plugin/pr13229.d4
-rw-r--r--ld/testsuite/ld-plugin/pr13244.c14
-rw-r--r--ld/testsuite/ld-plugin/pr13244.d4
-rw-r--r--ld/testsuite/ld-plugin/pr13287.cc1
-rw-r--r--ld/testsuite/ld-plugin/run-ie.c32
-rw-r--r--ld/testsuite/ld-plugin/run-ie.out1
86 files changed, 1011 insertions, 0 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 3a1d4371f00..d6a37fc7432 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,5 +1,93 @@
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.
* ld-plugin/func2i.c: Likewise.
* ld-plugin/func3h.c: Likewise.
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 <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
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 <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
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 <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
index 00000000000..4859019056f
--- /dev/null
+++ b/ld/testsuite/ld-plugin/lto-13c.c
@@ -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
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 <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
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 <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
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 <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
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 <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
index 00000000000..95b3bc0a8f8
--- /dev/null
+++ b/ld/testsuite/ld-plugin/lto-3c.c
@@ -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
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 <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
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 <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
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 <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
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 <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
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 <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
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 <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
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 <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
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 <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
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 <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
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 <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
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 <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
index 00000000000..7edca6d3b20
--- /dev/null
+++ b/ld/testsuite/ld-plugin/run-ie.out
@@ -0,0 +1 @@
+IE: 4