* testsuite/debug_msg.sh: Test mixed weak/strong symbol behavior.
authorIan Lance Taylor <ian@airs.com>
Tue, 27 Jul 2010 08:22:49 +0000 (08:22 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 27 Jul 2010 08:22:49 +0000 (08:22 +0000)
* gold/testsuite/debug_msg.cc: Likewise.
* gold/testsuite/odr_violation1.cc
* gold/testsuite/odr_violation2.cc

gold/ChangeLog
gold/testsuite/debug_msg.cc
gold/testsuite/debug_msg.sh
gold/testsuite/odr_violation1.cc
gold/testsuite/odr_violation2.cc

index c6741b68a211b17bdf74a939b96f00b2d57a8b82..ac14538983824c4f24150d8c202d87cefe022519 100644 (file)
@@ -1,3 +1,10 @@
+2010-07-27  Jeffrey Yasskin  <jyasskin@google.com>
+
+       * testsuite/debug_msg.sh: Test mixed weak/strong symbol behavior.
+       * gold/testsuite/debug_msg.cc: Likewise.
+       * gold/testsuite/odr_violation1.cc
+       * gold/testsuite/odr_violation2.cc
+
 2010-07-21  Cary Coutant  <ccoutant@google.com>
 
        * merge.h (Output_merge_string::Merged_string): Remove object, shndx,
index 9a951f963bdf6f3f7f402fd52620d1e02a785301..1d77bc91c296713cde525fe243088a303d81061d 100644 (file)
@@ -59,6 +59,13 @@ class Derived : public Base
 void SortAscending(int array[], int size);   // in odr_violation1.cc
 void SortDescending(int array[], int size);  // in odr_violation2.cc
 
+extern "C" int OverriddenCFunction(int i);  // in odr_violation*.cc
+
+inline int SometimesInlineFunction(int i) {  // strong in odr_violation2.cc.
+  return i;
+}
+
+
 int main()
 {
   testfn(5);
@@ -75,5 +82,8 @@ int main()
   int kSize2 = sizeof(kInput2) / sizeof(int);
   SortDescending(kInput2, kSize2);
 
+  OverriddenCFunction(3);
+  SometimesInlineFunction(3);
+
   return 0;
 }
index 750261ef0957bf3df34ae8dbd83464c3b7d8eb1b..74b4b05cde95955db80f3cdc8514513fb9446939 100755 (executable)
@@ -75,6 +75,16 @@ check debug_msg.err "debug_msg.o: in function int testfn<double>(double):.*/debu
 check debug_msg.err ": symbol 'Ordering::operator()(int, int)' defined in multiple places (possible ODR violation):"
 check debug_msg.err "odr_violation1.cc:5"
 check debug_msg.err "odr_violation2.cc:5"
+# We block ODR detection for combinations of C weak and strong
+# symbols, to allow people to use the linker to override things.  We
+# still flag it for C++ symbols since those are more likely to be
+# unintentional.
+check_missing debug_msg.err ": symbol 'OverriddenCFunction' defined in multiple places (possible ODR violation):"
+check_missing debug_msg.err "odr_violation1.cc:15"
+check_missing debug_msg.err "odr_violation2.cc:17"
+check debug_msg.err ": symbol 'SometimesInlineFunction(int)' defined in multiple places (possible ODR violation):"
+check debug_msg.err "debug_msg.cc:64"
+check debug_msg.err "odr_violation2.cc:21"
 
 # When linking together .so's, we don't catch the line numbers, but we
 # still find all the undefined variables, and the ODR violation.
@@ -84,6 +94,12 @@ check debug_msg_so.err "debug_msg.so: error: undefined reference to 'undef_int'"
 check debug_msg_so.err ": symbol 'Ordering::operator()(int, int)' defined in multiple places (possible ODR violation):"
 check debug_msg_so.err "odr_violation1.cc:5"
 check debug_msg_so.err "odr_violation2.cc:5"
+check_missing debug_msg.err ": symbol 'OverriddenCFunction' defined in multiple places (possible ODR violation):"
+check_missing debug_msg.err "odr_violation1.cc:15"
+check_missing debug_msg.err "odr_violation2.cc:17"
+check debug_msg.err ": symbol 'SometimesInlineFunction(int)' defined in multiple places (possible ODR violation):"
+check debug_msg.err "debug_msg.cc:64"
+check debug_msg.err "odr_violation2.cc:21"
 
 # These messages shouldn't need any debug info to detect:
 check debug_msg_ndebug.err "debug_msg_ndebug.so: error: undefined reference to 'undef_fn1()'"
index 7f6f6d935b5c55c1d3ae307976999d4f6457528e..6c404964c1e4201d43da312d33dac3f4b5861713 100644 (file)
@@ -10,3 +10,8 @@ class Ordering {
 void SortAscending(int array[], int size) {
   std::sort(array, array + size, Ordering());
 }
+
+extern "C" int OverriddenCFunction(int i) __attribute__ ((weak));
+extern "C" int OverriddenCFunction(int i) {
+  return i;
+}
index d56927901ddc22220b2d85fa56670b7feb146000..09940d4fb434211b70cdfdfc94167a0727b83a07 100644 (file)
@@ -12,3 +12,12 @@ class Ordering {
 void SortDescending(int array[], int size) {
   std::sort(array, array + size, Ordering());
 }
+
+// This is weak in odr_violation1.cc.
+extern "C" int OverriddenCFunction(int i) {
+  return i * i;
+}
+// This is inline in debug_msg.cc, which makes it a weak symbol too.
+int SometimesInlineFunction(int i) {
+  return i * i;
+}