From: Cary Coutant Date: Fri, 15 Aug 2008 04:57:46 +0000 (+0000) Subject: 2008-08-14 Cary Coutant X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d85c80a35397436352e65447cc42e5a0cde9c51a;p=binutils-gdb.git 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. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index aec50a59f01..21867d21979 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 e859f8c45cf..880bf238309 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() { @@ -186,6 +194,16 @@ t10() 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() { @@ -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 0aaec73c323..1c98b176d09 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 993cc7e9ba4..0ff02c6bc10 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 cbbd5ccf368..2daa9bf44c5 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; } }