]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gold/testsuite/tls_test.cc
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gold / testsuite / tls_test.cc
index a666433eb13d78e869c6ee64538c55d8f287cee5..fcc178ecf5212b965ac2767ce23916c7ae4e931b 100644 (file)
@@ -1,6 +1,6 @@
 // tls_test.cc -- test TLS variables for gold
 
-// Copyright 2006, 2007 Free Software Foundation, Inc.
+// Copyright (C) 2006-2021 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
 // 4  Access to an initialized static thread variable.
 // 5  Taking the address of a global thread variable.
 // 6  Taking the address of a static thread variable.
-// 7  Verify that the above tests left the variables set correctly.
+// 8  Like test 1, but with the thread variable defined in another file.
+// 9  Like test 3, but with the thread variable defined in another file.
+// 10 Like test 5, but with the thread variable defined in another file.
+// last  Verify that the above tests left the variables set correctly.
 
+
+#include "config.h"
+#include <cstdio>
 #include "tls_test.h"
 
+#define CHECK_EQ_OR_RETURN(var, expected)                              \
+  do                                                                   \
+    {                                                                  \
+      if ((var) != (expected))                                         \
+       {                                                               \
+         printf(#var ": expected %d, found %d\n", expected, var);      \
+         return false;                                                 \
+       }                                                               \
+    }                                                                  \
+  while (0)
+
 __thread int v1;
 static __thread int v2;
+
+// We don't use these pointers, but putting them in tests alignment on
+// a 64-bit target.
+__thread char* p1;
+char dummy;
+__thread char* p2 = &dummy;
+
 __thread int v3 = 3;
 static __thread int v4 = 4;
 __thread int v5;
 static __thread int v6;
 
+struct int128
+{
+  long long hi;
+  long long lo;
+};
+
+static __thread struct int128 v12 = { 115, 125 };
+
 bool
 t1()
 {
-  if (v1 != 0)
-    return false;
+  CHECK_EQ_OR_RETURN(v1, 0);
   v1 = 10;
   return true;
 }
@@ -61,8 +92,7 @@ t1()
 bool
 t2()
 {
-  if (v2 != 0)
-    return false;
+  CHECK_EQ_OR_RETURN(v2, 0);
   v2 = 20;
   return true;
 }
@@ -70,8 +100,7 @@ t2()
 bool
 t3()
 {
-  if (v3 != 3)
-    return false;
+  CHECK_EQ_OR_RETURN(v3, 3);
   v3 = 30;
   return true;
 }
@@ -79,8 +108,7 @@ t3()
 bool
 t4()
 {
-  if (v4 != 4)
-    return false;
+  CHECK_EQ_OR_RETURN(v4, 4);
   v4 = 40;
   return true;
 }
@@ -102,10 +130,11 @@ f5b(int* p)
 bool
 t5()
 {
-  return v5 == 50;
+  CHECK_EQ_OR_RETURN(v5, 50);
+  return true;
 }
 
-// For test 5 the main function calls f6b(f6a()), then calls t6().
+// For test 6 the main function calls f6b(f6a()), then calls t6().
 
 int*
 f6a()
@@ -122,16 +151,74 @@ f6b(int* p)
 bool
 t6()
 {
-  return v6 == 60;
+  CHECK_EQ_OR_RETURN(v6, 60);
+  return true;
 }
 
+// The slot for t7() is unused.
+
 bool
-t7()
-{
-  return (v1 == 10
-         && v2 == 20
-         && v3 == 30
-         && v4 == 40
-         && v5 == 50
-         && v6 == 60);
+t8()
+{
+  CHECK_EQ_OR_RETURN(o1, 0);
+  o1 = -10;
+  return true;
+}
+
+bool
+t9()
+{
+  CHECK_EQ_OR_RETURN(o2, -2);
+  o2 = -20;
+  return true;
+}
+
+// For test 10 the main function calls f10b(f10a()), then calls t10().
+
+int*
+f10a()
+{
+  return &o3;
+}
+
+void
+f10b(int* p)
+{
+  *p = -30;
+}
+
+bool
+t10()
+{
+  CHECK_EQ_OR_RETURN(o3, -30);
+  return true;
+}
+
+bool
+t12()
+{
+  struct int128 newval = { 335, 345 };
+  CHECK_EQ_OR_RETURN((int) v12.hi, 115);
+  CHECK_EQ_OR_RETURN((int) v12.lo, 125);
+  v12 = newval;
+  return true;
+}
+
+bool
+t_last()
+{
+  CHECK_EQ_OR_RETURN(v1, 10);
+  CHECK_EQ_OR_RETURN(v2, 20);
+  CHECK_EQ_OR_RETURN(v3, 30);
+  CHECK_EQ_OR_RETURN(v4, 40);
+  CHECK_EQ_OR_RETURN(v5, 50);
+  CHECK_EQ_OR_RETURN(v6, 60);
+  CHECK_EQ_OR_RETURN((int) v12.hi, 335);
+  CHECK_EQ_OR_RETURN((int) v12.lo, 345);
+  CHECK_EQ_OR_RETURN(o1, -10);
+  CHECK_EQ_OR_RETURN(o2, -20);
+  CHECK_EQ_OR_RETURN(o3, -30);
+  int check = t11_last();
+  CHECK_EQ_OR_RETURN(check, 1);
+  return true;
 }