aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2008-08-15 04:57:46 +0000
committerCary Coutant <ccoutant@google.com>2008-08-15 04:57:46 +0000
commitd85c80a35397436352e65447cc42e5a0cde9c51a (patch)
treedc027ecf78d4c7f25bf8a3cec0d33d63499e2fff
parent56c2003cdefd26149d2524efdf68cf51f5ed8c89 (diff)
downloadgdb-d85c80a35397436352e65447cc42e5a0cde9c51a.zip
gdb-d85c80a35397436352e65447cc42e5a0cde9c51a.tar.gz
gdb-d85c80a35397436352e65447cc42e5a0cde9c51a.tar.bz2
2008-08-14 Cary Coutant <ccoutant@google.com>
* x86_64.cc (Target_x86_64::Relocate::relocat_tls): Use addend for DTPOFF32, DTPOFF64, and TPOFF32 relocs. * testsuite/tls_test.cc (struct int128): 128-bit struct for testing TLS relocs with non-zero addend. (v12): New TLS variable. (t12): New test. (t_last): Add check for v12. * testsuite/tls_test.h (t12): New function. * testsuite/tls_test_main.cc (thread_routine): Call new test.
-rw-r--r--gold/ChangeLog12
-rw-r--r--gold/testsuite/tls_test.cc20
-rw-r--r--gold/testsuite/tls_test.h2
-rw-r--r--gold/testsuite/tls_test_main.cc1
-rw-r--r--gold/x86_64.cc6
5 files changed, 38 insertions, 3 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index aec50a5..21867d2 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,15 @@
+2008-08-14 Cary Coutant <ccoutant@google.com>
+
+ * x86_64.cc (Target_x86_64::Relocate::relocat_tls):
+ Use addend for DTPOFF32, DTPOFF64, and TPOFF32 relocs.
+ * testsuite/tls_test.cc (struct int128): 128-bit struct
+ for testing TLS relocs with non-zero addend.
+ (v12): New TLS variable.
+ (t12): New test.
+ (t_last): Add check for v12.
+ * testsuite/tls_test.h (t12): New function.
+ * testsuite/tls_test_main.cc (thread_routine): Call new test.
+
2008-08-13 Ian Lance Taylor <iant@google.com>
* layout.cc (Layout::attach_allocated_section_to_segment): Don't
diff --git a/gold/testsuite/tls_test.cc b/gold/testsuite/tls_test.cc
index e859f8c..880bf23 100644
--- a/gold/testsuite/tls_test.cc
+++ b/gold/testsuite/tls_test.cc
@@ -73,6 +73,14 @@ 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()
{
@@ -187,6 +195,16 @@ t10()
}
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);
@@ -195,6 +213,8 @@ t_last()
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);
diff --git a/gold/testsuite/tls_test.h b/gold/testsuite/tls_test.h
index 0aaec73..1c98b17 100644
--- a/gold/testsuite/tls_test.h
+++ b/gold/testsuite/tls_test.h
@@ -46,6 +46,8 @@ extern bool t10();
extern "C" int t11();
extern "C" int t11_last();
+extern bool t12();
+
extern bool t_last();
// These variables are defined in tls_test_file2.cc
diff --git a/gold/testsuite/tls_test_main.cc b/gold/testsuite/tls_test_main.cc
index 993cc7e..0ff02c6 100644
--- a/gold/testsuite/tls_test_main.cc
+++ b/gold/testsuite/tls_test_main.cc
@@ -100,6 +100,7 @@ thread_routine(void* arg)
f10b(f10a());
check("t10", t10());
check("t11", t11() != 0);
+ check("t12", t12());
check("t_last", t_last());
// Unlock the second mutex.
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index cbbd5cc..2daa9bf 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -2054,7 +2054,7 @@ Target_x86_64::Relocate::relocate_tls(const Relocate_info<64, false>* relinfo,
if (this->saw_tls_block_reloc_)
value -= tls_segment->memsz();
}
- Relocate_functions<64, false>::rela32(view, value, 0);
+ Relocate_functions<64, false>::rela32(view, value, addend);
break;
case elfcpp::R_X86_64_DTPOFF64:
@@ -2065,7 +2065,7 @@ Target_x86_64::Relocate::relocate_tls(const Relocate_info<64, false>* relinfo,
if (this->saw_tls_block_reloc_)
value -= tls_segment->memsz();
}
- Relocate_functions<64, false>::rela64(view, value, 0);
+ Relocate_functions<64, false>::rela64(view, value, addend);
break;
case elfcpp::R_X86_64_GOTTPOFF: // Initial-exec
@@ -2107,7 +2107,7 @@ Target_x86_64::Relocate::relocate_tls(const Relocate_info<64, false>* relinfo,
case elfcpp::R_X86_64_TPOFF32: // Local-exec
value -= tls_segment->memsz();
- Relocate_functions<64, false>::rela32(view, value, 0);
+ Relocate_functions<64, false>::rela32(view, value, addend);
break;
}
}