From 9e35dae42503f6cef9a1f87e31a6f1111f3cb508 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Tue, 10 Oct 2006 03:17:53 +0000 Subject: 2006-10-09 Jan Kratochvil Daniel Jacobowitz * 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 * gdb.threads/tls-nodebug.c, gdb.threads/tls-nodebug.exp: New test. --- gdb/parse.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'gdb/parse.c') diff --git a/gdb/parse.c b/gdb/parse.c index 5d949fd..b0edaf4 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -53,6 +53,7 @@ #include "gdb_assert.h" #include "block.h" #include "source.h" +#include "objfiles.h" /* Standard set of definitions for printing, dumping, prefixifying, * and evaluating expressions. */ @@ -219,6 +220,15 @@ write_exp_elt_block (struct block *b) } void +write_exp_elt_objfile (struct objfile *objfile) +{ + union exp_element tmp; + memset (&tmp, 0, sizeof (union exp_element)); + tmp.objfile = objfile; + write_exp_elt (tmp); +} + +void write_exp_elt_longcst (LONGEST expelt) { union exp_element tmp; @@ -378,6 +388,7 @@ write_exp_bitstring (struct stoken str) static struct type *msym_text_symbol_type; static struct type *msym_data_symbol_type; static struct type *msym_unknown_symbol_type; +static struct type *msym_tls_symbol_type; void write_exp_msymbol (struct minimal_symbol *msymbol, @@ -397,6 +408,22 @@ write_exp_msymbol (struct minimal_symbol *msymbol, write_exp_elt_opcode (OP_LONG); + if (SYMBOL_BFD_SECTION (msymbol)->flags & SEC_THREAD_LOCAL) + { + bfd *bfd = SYMBOL_BFD_SECTION (msymbol)->owner; + struct objfile *ofp; + + ALL_OBJFILES (ofp) + if (ofp->obfd == bfd) + break; + + write_exp_elt_opcode (UNOP_MEMVAL_TLS); + write_exp_elt_objfile (ofp); + write_exp_elt_type (msym_tls_symbol_type); + write_exp_elt_opcode (UNOP_MEMVAL_TLS); + return; + } + write_exp_elt_opcode (UNOP_MEMVAL); switch (msymbol->type) { @@ -904,6 +931,11 @@ operator_length_standard (struct expression *expr, int endpos, args = 1; break; + case UNOP_MEMVAL_TLS: + oplen = 4; + args = 1; + break; + case UNOP_ABS: case UNOP_CAP: case UNOP_CHR: @@ -1341,6 +1373,10 @@ build_parse (void) init_type (TYPE_CODE_INT, 1, 0, "", NULL); + + msym_tls_symbol_type = + init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0, + "", NULL); } /* This function avoids direct calls to fprintf -- cgit v1.1