public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [gold patch] Incremental 12/18: Add end-to-end test cases for incremental update
@ 2011-04-01 21:50 Cary Coutant
  2011-05-21 16:56 ` Ian Lance Taylor
  0 siblings, 1 reply; 5+ messages in thread
From: Cary Coutant @ 2011-04-01 21:50 UTC (permalink / raw)
  To: Ian Lance Taylor, Binutils

[-- Attachment #1: Type: text/plain, Size: 431 bytes --]

This patch adds three end-to-end test case for incremental update.

(I removed the Makefile.in diffs from the patch.)

-cary


	* testsuite/Makefile.am: Add incremental_test_2, incremental_test_3,
	incremental_test_4.
	* testsuite/Makefile.in: Regenerate.
	* testsuite/two_file_test_1_v1.cc: New test source file.
	* testsuite/two_file_test_1b_v1.cc: New test source file.
	* testsuite/two_file_test_2_v1.cc: New test source file.

[-- Attachment #2: incr-patch-12.txt --]
[-- Type: text/plain, Size: 13713 bytes --]

Add end-to-end incremental test cases.


2011-04-01 Cary Coutant  <ccoutant@google.com>

	* testsuite/Makefile.am: Add incremental_test_2, incremental_test_3,
	incremental_test_4.
	* testsuite/Makefile.in: Regenerate.
	* testsuite/two_file_test_1_v1.cc: New test source file.
	* testsuite/two_file_test_1b_v1.cc: New test source file.
	* testsuite/two_file_test_2_v1.cc: New test source file.


diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
index 2675763..90860f1 100644
--- a/gold/testsuite/Makefile.am
+++ b/gold/testsuite/Makefile.am
@@ -1815,6 +1815,41 @@ memory_test: memory_test.o gcctestdir/ld $(srcdir)/memory_test.t
 memory_test.stdout: memory_test
 	$(TEST_READELF) -lWS  $< > $@
 
+# End-to-end incremental linking tests.
+# Incremental linking is currently supported only on the x86_64 target.
+
+if DEFAULT_TARGET_X86_64
+
+check_PROGRAMS += incremental_test_2
+MOSTLYCLEANFILES += two_file_test_tmp.o
+incremental_test_2: two_file_test_1_v1.o two_file_test_1.o two_file_test_1b.o \
+		    two_file_test_2.o two_file_test_main.o gcctestdir/ld
+	cp -f two_file_test_1_v1.o two_file_test_tmp.o
+	$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_tmp.o two_file_test_1b.o two_file_test_2.o two_file_test_main.o
+	@sleep 1
+	cp -f two_file_test_1.o two_file_test_tmp.o
+	$(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ two_file_test_tmp.o two_file_test_1b.o two_file_test_2.o two_file_test_main.o
+
+check_PROGRAMS += incremental_test_3
+incremental_test_3: two_file_test_1.o two_file_test_1b_v1.o two_file_test_1b.o \
+		    two_file_test_2.o two_file_test_main.o gcctestdir/ld
+	cp -f two_file_test_1b_v1.o two_file_test_tmp.o
+	$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_1.o two_file_test_tmp.o two_file_test_2.o two_file_test_main.o
+	@sleep 1
+	cp -f two_file_test_1b.o two_file_test_tmp.o
+	$(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ two_file_test_1.o two_file_test_tmp.o two_file_test_2.o two_file_test_main.o
+
+check_PROGRAMS += incremental_test_4
+incremental_test_4: two_file_test_1.o two_file_test_1b.o two_file_test_2_v1.o \
+		    two_file_test_2.o two_file_test_main.o gcctestdir/ld
+	cp -f two_file_test_2_v1.o two_file_test_tmp.o
+	$(CXXLINK) -Wl,--incremental-full -Bgcctestdir/ two_file_test_1.o two_file_test_1b.o two_file_test_tmp.o two_file_test_main.o
+	@sleep 1
+	cp -f two_file_test_2.o two_file_test_tmp.o
+	$(CXXLINK) -Wl,--incremental-update -Bgcctestdir/ two_file_test_1.o two_file_test_1b.o two_file_test_tmp.o two_file_test_main.o
+
+endif DEFAULT_TARGET_X86_64
+
 endif GCC
 endif NATIVE_LINKER
 
diff --git a/gold/testsuite/two_file_test_1_v1.cc b/gold/testsuite/two_file_test_1_v1.cc
new file mode 100644
index 0000000..6a43d9b
--- /dev/null
+++ b/gold/testsuite/two_file_test_1_v1.cc
@@ -0,0 +1,243 @@
+// two_file_test_1_v1.cc -- a two file test case for gold, file 1 of 2
+
+// Copyright 2006, 2007, 2008, 2011 Free Software Foundation, Inc.
+// Written by Ian Lance Taylor <iant@google.com>.
+
+// This file is part of gold.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+// This is an alternate version of the source file two_file_test_1.cc,
+// used to test incremental linking.  We build a binary first using this
+// source file, then do an incremental link with the primary version of
+// the file.
+
+// This tests references between files.  This is file 1, and
+// two_file_test_2.cc is file 2.  We test in several different ways:
+
+// Files 1 and 2 linked together in executable.
+// File 1 in executable, file 2 in shared library.
+// File 1 in shared library, file 2 in executable.
+// Files 1 and 2 linked together in shared library.
+// Files 1 and 2 in different shared libraries.
+
+// We test the following cases.
+
+// 1  Code in file 1 calls code in file 2.
+// 2  Code in file 1 refers to global data in file 2.
+// 3  Code in file 1 referes to common symbol in file 2.
+// 4  Code in file 1 refers to offset within global data in file 2.
+// 5  Code in file 1 refers to offset within common symbol in file 2.
+// 6  Data in file 1 refers to global data in file 2.
+// 7  Data in file 1 refers to common symbol in file 2.
+// 8  Data in file 1 refers to offset within global data in file 2.
+// 9  Data in file 1 refers to offset within common symbol in file 2.
+// 10 Data in file 1 refers to function in file 2.
+// 11 Pass function pointer from file 1 to file 2.
+// 12 Compare address of function for equality in both files.
+// 13 Compare address of inline function for equality in both files.
+// 14 Compare string constants in file 1 and file 2.
+// 15 Compare wide string constants in file 1 and file 2.
+// 16 Call a function directly after its address has been taken.
+// 17 File 1 checks array of string constants defined in file 2.
+// 18 File 1 checks string constants referenced in code in file 2.
+
+#include "two_file_test.h"
+
+// 1  Code in file 1 calls code in file 2.
+
+bool
+t1()
+{
+  return t1_2() == 0;
+}
+
+// 2  Code in file 1 refers to global data in file 2.
+
+bool
+t2()
+{
+  return v2 == 0;
+}
+
+// 3  Code in file 1 referes to common symbol in file 2.
+
+bool
+t3()
+{
+  return v3 == 0;
+}
+
+// 4  Code in file 1 refers to offset within global data in file 2.
+
+bool
+t4()
+{
+  return v4[5] == ',';
+}
+
+// 5  Code in file 1 refers to offset within common symbol in file 2.
+
+bool
+t5()
+{
+  return v5[7] == 'w';
+}
+
+// 6  Data in file 1 refers to global data in file 2.
+
+int* p6 = &v2;
+
+bool
+t6()
+{
+  return *p6 == 456;
+}
+
+// 7  Data in file 1 refers to common symbol in file 2.
+
+int* p7 = &v3;
+
+bool
+t7()
+{
+  return *p7 == 789;
+}
+
+// 8  Data in file 1 refers to offset within global data in file 2.
+
+char* p8 = &v4[6];
+
+bool
+t8()
+{
+  return *p8 == ' ';
+}
+
+// 9  Data in file 1 refers to offset within common symbol in file 2.
+
+char* p9 = &v5[8];
+
+bool
+t9()
+{
+  return *p9 == 'o';
+}
+
+// 10 Data in file 1 refers to function in file 2.
+
+int (*pfn)() = &f10;
+
+bool
+t10()
+{
+  return (*pfn)() == 135;
+}
+
+// 11 Pass function pointer from file 1 to file 2.
+
+int
+f11a()
+{
+  return 246;
+}
+
+bool
+t11()
+{
+  return f11b(&f11a) == 246;
+}
+
+// 12 Compare address of function for equality in both files.
+
+bool
+t12()
+{
+  return &t12 == f12();
+}
+
+// 13 Compare address of inline function for equality in both files.
+
+bool
+t13()
+{
+  return &f13i == f13();
+}
+
+// 14 Compare string constants in file 1 and file 2.
+
+bool
+t14()
+{
+  const char* s1 = TEST_STRING_CONSTANT;
+  const char* s2 = f14();
+  while (*s1 != '\0')
+    if (*s1++ != *s2++)
+      return false;
+  return *s2 == '\0';
+}
+
+// 15 Compare wide string constants in file 1 and file 2.
+
+bool
+t15()
+{
+  const wchar_t* s1 = TEST_WIDE_STRING_CONSTANT;
+  const wchar_t* s2 = f15();
+  while (*s1 != '\0')
+    if (*s1++ != *s2++)
+      return false;
+  return *s2 == '\0';
+}
+
+// 16 Call a function directly after its address has been taken.
+
+bool
+t16()
+{
+  return f10() == 135;
+}
+
+// 17 File 1 checks array of string constants defined in file 2.
+
+bool
+t17()
+{
+  char c = 'a';
+  for (int i = 0; i < T17_COUNT; ++i)
+    {
+      if (t17data[i][0] != c || t17data[i][1] != '\0')
+	return false;
+      ++c;
+    }
+  return true;
+}
+
+// 18 File 1 checks string constants referenced in code in file 2.
+
+bool
+t18()
+{
+  char c = 'a';
+  for (int i = 0; i < T17_COUNT; ++i)
+    {
+      const char* s = f18(i);
+      if (s[0] != c || s[1] != '\0')
+        return false;
+      ++c;
+    }
+  return true;
+}
diff --git a/gold/testsuite/two_file_test_1b_v1.cc b/gold/testsuite/two_file_test_1b_v1.cc
new file mode 100644
index 0000000..0adaf84
--- /dev/null
+++ b/gold/testsuite/two_file_test_1b_v1.cc
@@ -0,0 +1,46 @@
+// two_file_test_1b_v1.cc -- supplementary file for a three-file test case
+// for gold.
+
+// Copyright 2008, 2011 Free Software Foundation, Inc.
+// Written by Cary Coutant <ccoutant@google.com>.
+
+// This file is part of gold.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+// This is an alternate version of the source file two_file_test_1b.cc,
+// used to test incremental linking.  We build a binary first using this
+// source file, then do an incremental link with the primary version of
+// the file.
+
+// This file is used as part of a mixed PIC/non-PIC test.
+// Files 1 and 1b are linked together in a shared library.
+// File 1 is compiled non-PIC, and file 1a is compiled PIC.
+// File 2 is compiled PIC and linked in a second shared library.
+// This tests that a non-PIC call does not accidentally get
+// bound to a PIC PLT entry.
+
+// We test the following cases.
+
+#include "two_file_test.h"
+
+// 16 Call a function directly after its address has been taken.
+
+bool
+t16a()
+{
+  return f10() == 125;
+}
diff --git a/gold/testsuite/two_file_test_2_v1.cc b/gold/testsuite/two_file_test_2_v1.cc
new file mode 100644
index 0000000..b97a677
--- /dev/null
+++ b/gold/testsuite/two_file_test_2_v1.cc
@@ -0,0 +1,150 @@
+// two_file_test_2_v1.cc -- a two file test case for gold, file 2 of 2
+
+// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+// Written by Ian Lance Taylor <iant@google.com>.
+
+// This file is part of gold.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+// This is an alternate version of the source file two_file_test_2.cc,
+// used to test incremental linking.  We build a binary first using this
+// source file, then do an incremental link with the primary version of
+// the file.
+
+// This tests references between files.  This is file 2, and
+// two_file_test_1.cc is file 1.  See file 1 for details.
+
+#include "two_file_test.h"
+
+// 1  Code in file 1 calls code in file 2.
+
+int
+t1_2()
+{
+  return 0;
+}
+
+bool
+t1a()
+{
+  return t1_2() == 0;
+}
+
+// 2  Code in file 1 refers to global data in file 2.
+
+int v2 = 0;
+
+// 3 Code in file 1 referes to common symbol in file 2.  This is
+// initialized at runtime to 789.
+
+int v3;
+
+// 4  Code in file 1 refers to offset within global data in file 2.
+
+char v4[] = "World, hello";
+
+// 5 Code in file 1 refers to offset within common symbol in file 2.
+// This is initialized at runtime to a copy of v4.
+
+char v5[13];
+
+// 6  Data in file 1 refers to global data in file 2.  This reuses v2.
+
+// 7  Data in file 1 refers to common symbol in file 2.  This reuses v3.
+
+// 8 Data in file 1 refers to offset within global data in file 2.
+// This reuses v4.
+
+// 9 Data in file 1 refers to offset within common symbol in file 2.
+// This reuses v5.
+
+// 10 Data in file 1 refers to function in file 2.
+
+int
+f10()
+{
+  return 0;
+}
+
+// 11 Pass function pointer from file 1 to file 2.
+
+int
+f11b(int (*pfn)())
+{
+  return (*pfn)();
+}
+
+// 12 Compare address of function for equality in both files.
+
+bool
+(*f12())()
+{
+  return &t12;
+}
+
+// 13 Compare address of inline function for equality in both files.
+
+void
+(*f13())()
+{
+  return &f13i;
+}
+
+// 14 Compare string constants in file 1 and file 2.
+
+const char*
+f14()
+{
+  return TEST_STRING_CONSTANT;
+}
+
+// 15 Compare wide string constants in file 1 and file 2.
+
+const wchar_t*
+f15()
+{
+  return TEST_WIDE_STRING_CONSTANT;
+}
+
+// 17 File 1 checks array of string constants defined in file 2.
+
+const char* t17data[T17_COUNT] =
+{
+  "0", "1", "2", "3", "4"
+};
+
+// 18 File 1 checks string constants referenced directly in file 2.
+
+const char*
+f18(int i)
+{
+  switch (i)
+    {
+    case 0:
+      return "0";
+    case 1:
+      return "1";
+    case 2:
+      return "2";
+    case 3:
+      return "3";
+    case 4:
+      return "4";
+    default:
+      return 0;
+    }
+}

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [gold patch] Incremental 12/18: Add end-to-end test cases for incremental update
  2011-04-01 21:50 [gold patch] Incremental 12/18: Add end-to-end test cases for incremental update Cary Coutant
@ 2011-05-21 16:56 ` Ian Lance Taylor
  2011-05-24  1:02   ` Cary Coutant
  0 siblings, 1 reply; 5+ messages in thread
From: Ian Lance Taylor @ 2011-05-21 16:56 UTC (permalink / raw)
  To: Cary Coutant; +Cc: Binutils

Cary Coutant <ccoutant@google.com> writes:

> 	* testsuite/Makefile.am: Add incremental_test_2, incremental_test_3,
> 	incremental_test_4.
> 	* testsuite/Makefile.in: Regenerate.
> 	* testsuite/two_file_test_1_v1.cc: New test source file.
> 	* testsuite/two_file_test_1b_v1.cc: New test source file.
> 	* testsuite/two_file_test_2_v1.cc: New test source file.

This is OK.

Thanks.

Ian

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [gold patch] Incremental 12/18: Add end-to-end test cases for incremental update
  2011-05-21 16:56 ` Ian Lance Taylor
@ 2011-05-24  1:02   ` Cary Coutant
  2011-05-24 22:03     ` Cary Coutant
  0 siblings, 1 reply; 5+ messages in thread
From: Cary Coutant @ 2011-05-24  1:02 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: Binutils

>>       * testsuite/Makefile.am: Add incremental_test_2, incremental_test_3,
>>       incremental_test_4.
>>       * testsuite/Makefile.in: Regenerate.
>>       * testsuite/two_file_test_1_v1.cc: New test source file.
>>       * testsuite/two_file_test_1b_v1.cc: New test source file.
>>       * testsuite/two_file_test_2_v1.cc: New test source file.
>
> This is OK.

Oops, I'm going to hold this one until after patch 14. Without support
for tracking sonames -- in some configurations -- these tests try to
generate a much bigger .dynstr section during the incremental link and
run out of patch space.

-cary

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [gold patch] Incremental 12/18: Add end-to-end test cases for incremental update
  2011-05-24  1:02   ` Cary Coutant
@ 2011-05-24 22:03     ` Cary Coutant
  2011-05-25 13:15       ` H.J. Lu
  0 siblings, 1 reply; 5+ messages in thread
From: Cary Coutant @ 2011-05-24 22:03 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: Binutils

>>>       * testsuite/Makefile.am: Add incremental_test_2, incremental_test_3,
>>>       incremental_test_4.
>>>       * testsuite/Makefile.in: Regenerate.
>>>       * testsuite/two_file_test_1_v1.cc: New test source file.
>>>       * testsuite/two_file_test_1b_v1.cc: New test source file.
>>>       * testsuite/two_file_test_2_v1.cc: New test source file.
>>
>> This is OK.
>
> Oops, I'm going to hold this one until after patch 14. Without support
> for tracking sonames -- in some configurations -- these tests try to
> generate a much bigger .dynstr section during the incremental link and
> run out of patch space.

Now that patches 13 and 14 are in, these tests now pass, and I've
committed this patch.

-cary

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [gold patch] Incremental 12/18: Add end-to-end test cases for incremental update
  2011-05-24 22:03     ` Cary Coutant
@ 2011-05-25 13:15       ` H.J. Lu
  0 siblings, 0 replies; 5+ messages in thread
From: H.J. Lu @ 2011-05-25 13:15 UTC (permalink / raw)
  To: Cary Coutant; +Cc: Ian Lance Taylor, Binutils

On Tue, May 24, 2011 at 3:02 PM, Cary Coutant <ccoutant@google.com> wrote:
>>>>       * testsuite/Makefile.am: Add incremental_test_2, incremental_test_3,
>>>>       incremental_test_4.
>>>>       * testsuite/Makefile.in: Regenerate.
>>>>       * testsuite/two_file_test_1_v1.cc: New test source file.
>>>>       * testsuite/two_file_test_1b_v1.cc: New test source file.
>>>>       * testsuite/two_file_test_2_v1.cc: New test source file.
>>>
>>> This is OK.
>>
>> Oops, I'm going to hold this one until after patch 14. Without support
>> for tracking sonames -- in some configurations -- these tests try to
>> generate a much bigger .dynstr section during the incremental link and
>> run out of patch space.
>
> Now that patches 13 and 14 are in, these tests now pass, and I've
> committed this patch.
>

This caused:

http://sourceware.org/bugzilla/show_bug.cgi?id=12804

-- 
H.J.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-05-25 13:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-01 21:50 [gold patch] Incremental 12/18: Add end-to-end test cases for incremental update Cary Coutant
2011-05-21 16:56 ` Ian Lance Taylor
2011-05-24  1:02   ` Cary Coutant
2011-05-24 22:03     ` Cary Coutant
2011-05-25 13:15       ` H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).