From 83b3ac74ff2da9b9409624386aa779430b740d71 Mon Sep 17 00:00:00 2001 From: ccoutant Date: Fri, 15 Aug 2008 04:57:46 +0000 Subject: [PATCH] 2008-08-14 Cary Coutant * 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. --- gold/ChangeLog | 12 ++++++++++++ gold/testsuite/tls_test.cc | 20 ++++++++++++++++++++ gold/testsuite/tls_test.h | 2 ++ gold/testsuite/tls_test_main.cc | 1 + gold/x86_64.cc | 6 +++--- 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index aec50a59f0..21867d2197 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,15 @@ +2008-08-14 Cary Coutant + + * 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 * 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 e859f8c45c..880bf23830 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 0aaec73c32..1c98b176d0 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 993cc7e9ba..0ff02c6bc1 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 cbbd5ccf36..2daa9bf44c 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; } } -- 2.11.0