diff options
author | Ian Lance Taylor <ian@airs.com> | 2008-04-17 07:12:00 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2008-04-17 07:12:00 +0000 |
commit | 155a0dd76368c9a61a2d640df534d25216963e86 (patch) | |
tree | 862282bb64498a494f4f5109d9e2175e643bb203 /gold/symtab.cc | |
parent | 32b769e114e262a41fcbb64d8c1f891b19bc09f1 (diff) | |
download | gdb-155a0dd76368c9a61a2d640df534d25216963e86.zip gdb-155a0dd76368c9a61a2d640df534d25216963e86.tar.gz gdb-155a0dd76368c9a61a2d640df534d25216963e86.tar.bz2 |
* common.cc (Symbol_table::allocate_commons): Remove options
parameter. Change caller.
(Symbol_table::do_allocate_commons): Remove options parameter.
Change caller. Just call do_allocate_commons_list twice.
(Symbol_table::do_allocate_commons_list): New function, broken out
of do_allocate_commons.
* common.h (class Allocate_commons_task): Remove options_ field.
Update constructor.
* symtab.cc (Symbol_table::Symbol_table): Initialize
tls_commons_.
(Symbol_table::add_from_object): Put TLS common symbols on
tls_commons_ list.
(Symbol_table::sized_finalize_symbol): Handle STT_TLS symbols
which are IN_OUTPUT_DATA.
* symtab.h (class Symbol_table): Add tls_commons_ field. Update
allocate_commons and do_allocate_commons declarations. Declare
do_allocate_commons_list.
* gold.cc (queue_middle_tasks): Update creation of
Allocate_commons_task to not pass options.
* testsuite/Makefile.am (INCLUDES): Add -I.. .
(TLS_TEST_C_FLAGS): New variable.
(tls_test_c_pic.o): New target.
(tls_test_shared.so): Link in tls_test_c_pic.o.
(tls_test_c_pic_ie.o): New target.
(tls_test_ie_shared.so): Link in tls_test_c_pic_ie.o.
(tls_test_DEPENDENCIES, tls_test_LDADD): Add tls_test_c.o.
(tls_test_c.o): New target.
(tls_pic_test_DEPENDENCIES): Add tls_test_c_pic.o.
(tls_pic_test_LDADD): Likewise.
(tls_shared_gd_to_ie_test_DEPENDENCIES): Add tls_test_c_pic.o.
(tls_shared_gd_to_ie_test_LDADD): Likewise.
(tls_test_c_gnu2.o): New target.
(tls_shared_gnu2_gd_to_ie_test_DEPENDENCIES): Add
tls_test_c_gnu2.o.
(tls_shared_gnu2_gd_to_ie_test_LDADD): Likewise.
(tls_test_gnu2_shared.so): Link in tls_test_c_gnu2.o.
(tls_test_shared_nonpic.so): Link in tls_test_c.o.
* testsuite/tls_test.cc: Include "config.h".
(t_last): Call t11_last.
* testsuite/tls_test.h (t11, t11_last): Declare.
* testsuite/tls_test_c.c: New file.
* testsuite/tls_test_main.cc (thread_routine): Call t11.
* configure.ac: Check for OpenMP support.
* configure, config.in, Makefile.in: Rebuild.
* testsuite/Makefile.in: Rebuild.
Diffstat (limited to 'gold/symtab.cc')
-rw-r--r-- | gold/symtab.cc | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/gold/symtab.cc b/gold/symtab.cc index 9b23790..dc86582 100644 --- a/gold/symtab.cc +++ b/gold/symtab.cc @@ -360,7 +360,7 @@ Symbol::set_output_section(Output_section* os) Symbol_table::Symbol_table(unsigned int count, const Version_script_info& version_script) : saw_undefined_(0), offset_(0), table_(count), namepool_(), - forwarders_(), commons_(), forced_locals_(), warnings_(), + forwarders_(), commons_(), tls_commons_(), forced_locals_(), warnings_(), version_script_(version_script) { namepool_.reserve(count); @@ -715,7 +715,12 @@ Symbol_table::add_from_object(Object* object, // Keep track of common symbols, to speed up common symbol // allocation. if (!was_common && ret->is_common()) - this->commons_.push_back(ret); + { + if (ret->type() != elfcpp::STT_TLS) + this->commons_.push_back(ret); + else + this->tls_commons_.push_back(ret); + } if (def) ret->set_is_default(); @@ -1830,7 +1835,15 @@ Symbol_table::sized_finalize_symbol(Symbol* unsized_sym) case Symbol::IN_OUTPUT_DATA: { Output_data* od = sym->output_data(); - value = sym->value() + od->address(); + value = sym->value(); + if (sym->type() != elfcpp::STT_TLS) + value += od->address(); + else + { + Output_section* os = od->output_section(); + gold_assert(os != NULL); + value += os->tls_offset() + (od->address() - os->address()); + } if (sym->offset_is_from_end()) value += od->data_size(); } |