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.
This commit is contained in:
Cary Coutant 2008-08-15 04:57:46 +00:00
parent 56c2003cde
commit d85c80a353
5 changed files with 38 additions and 3 deletions

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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.

View file

@ -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;
}
}