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.
This commit is contained in:
parent
a48251ed04
commit
9e35dae425
13 changed files with 267 additions and 82 deletions
87
gdb/target.c
87
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))
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue