diff options
author | Daniel Jacobowitz <drow@false.org> | 2006-10-10 03:17:53 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2006-10-10 03:17:53 +0000 |
commit | 9e35dae42503f6cef9a1f87e31a6f1111f3cb508 (patch) | |
tree | e6cff422c66aa30f070da5269292b7dd67684bb4 /gdb/target.c | |
parent | a48251ed04471c0294aead9ee7be8ed9d3a9ad9e (diff) | |
download | gdb-9e35dae42503f6cef9a1f87e31a6f1111f3cb508.zip gdb-9e35dae42503f6cef9a1f87e31a6f1111f3cb508.tar.gz gdb-9e35dae42503f6cef9a1f87e31a6f1111f3cb508.tar.bz2 |
2006-10-09 Jan Kratochvil <jan.kratochvil@redhat.com>
Daniel Jacobowitz <dan@codesourcery.com>
* Makefile.in (expprint.o, parse.o, target.o): Update.
* dwarf2loc.c (dwarf_expr_tls_address): Move body to
target_translate_tls_address. Call it.
* eval.c (evaluate_subexp_standard): Handle UNOP_MEMVAL_TLS.
* expprint.c (print_subexp_standard): Likewise.
(op_name_standard, dump_subexp_body_standard): Likewise.
* expression.h (enum exp_opcode): Add UNOP_MEMVAL_TLS.
(union exp_element): Add objfile.
* parse.c (write_exp_elt_objfile): New function.
(msym_tls_symbol_type): New.
(write_exp_msymbol): Handle TLS.
(operator_length_standard): Handle UNOP_MEMVAL_TLS.
(build_parse): Initialize msym_tls_symbol_type.
* parser-defs.h (write_exp_elt_objfile): New prototype.
* target.c (target_translate_tls_address): New.
* target.h (target_translate_tls_address): Add prototype.
2006-10-09 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.threads/tls-nodebug.c, gdb.threads/tls-nodebug.exp: New test.
Diffstat (limited to 'gdb/target.c')
-rw-r--r-- | gdb/target.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/gdb/target.c b/gdb/target.c index 690e430..a757f53 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -39,6 +39,7 @@ #include "regcache.h" #include "gdb_assert.h" #include "gdbcore.h" +#include "exceptions.h" static void target_info (char *, int); @@ -758,6 +759,92 @@ pop_target (void) internal_error (__FILE__, __LINE__, _("failed internal consistency check")); } +/* Using the objfile specified in BATON, find the address for the + current thread's thread-local storage with offset OFFSET. */ +CORE_ADDR +target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) +{ + volatile CORE_ADDR addr = 0; + + if (target_get_thread_local_address_p () + && gdbarch_fetch_tls_load_module_address_p (current_gdbarch)) + { + ptid_t ptid = inferior_ptid; + volatile struct gdb_exception ex; + + TRY_CATCH (ex, RETURN_MASK_ALL) + { + CORE_ADDR lm_addr; + + /* Fetch the load module address for this objfile. */ + lm_addr = gdbarch_fetch_tls_load_module_address (current_gdbarch, + objfile); + /* If it's 0, throw the appropriate exception. */ + if (lm_addr == 0) + throw_error (TLS_LOAD_MODULE_NOT_FOUND_ERROR, + _("TLS load module not found")); + + addr = target_get_thread_local_address (ptid, lm_addr, offset); + } + /* If an error occurred, print TLS related messages here. Otherwise, + throw the error to some higher catcher. */ + if (ex.reason < 0) + { + int objfile_is_library = (objfile->flags & OBJF_SHARED); + + switch (ex.error) + { + case TLS_NO_LIBRARY_SUPPORT_ERROR: + error (_("Cannot find thread-local variables in this thread library.")); + break; + case TLS_LOAD_MODULE_NOT_FOUND_ERROR: + if (objfile_is_library) + error (_("Cannot find shared library `%s' in dynamic" + " linker's load module list"), objfile->name); + else + error (_("Cannot find executable file `%s' in dynamic" + " linker's load module list"), objfile->name); + break; + case TLS_NOT_ALLOCATED_YET_ERROR: + if (objfile_is_library) + error (_("The inferior has not yet allocated storage for" + " thread-local variables in\n" + "the shared library `%s'\n" + "for %s"), + objfile->name, target_pid_to_str (ptid)); + else + error (_("The inferior has not yet allocated storage for" + " thread-local variables in\n" + "the executable `%s'\n" + "for %s"), + objfile->name, target_pid_to_str (ptid)); + break; + case TLS_GENERIC_ERROR: + if (objfile_is_library) + error (_("Cannot find thread-local storage for %s, " + "shared library %s:\n%s"), + target_pid_to_str (ptid), + objfile->name, ex.message); + else + error (_("Cannot find thread-local storage for %s, " + "executable file %s:\n%s"), + target_pid_to_str (ptid), + objfile->name, ex.message); + break; + default: + throw_exception (ex); + break; + } + } + } + /* It wouldn't be wrong here to try a gdbarch method, too; finding + TLS is an ABI-specific thing. But we don't do that yet. */ + else + error (_("Cannot find thread-local variables on this target")); + + return addr; +} + #undef MIN #define MIN(A, B) (((A) <= (B)) ? (A) : (B)) |