]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2003-07-22 Elena Zannoni <ezannoni@redhat.com>
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>
Tue, 22 Jul 2003 15:44:10 +0000 (15:44 +0000)
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>
Tue, 22 Jul 2003 15:44:10 +0000 (15:44 +0000)
* findvar.c (read_var_value): Remove case for thread local storage
variables.  It is now entirely handled by the dwarf2 location
expression code.
* printcmd.c (address_info): Ditto.
* symtab.h (address_class): Remove LOC_THREAD_LOCAL_STATIC
enumeration value.
(struct symbol): Remove objfile field, which was used by
LOC_THREAD_LOCAL_STATIC only.
* dwarf2read.c (decode_locdesc): Remove is_thread_local variable.
* dwarf2loc.h (struct dwarf2_loclist_baton): Add comment about
usage of objfile pointer.
* dwarf2loc.c (locexpr_describe_location): Add case to handle
thread local variables.
Add include of objfiles.h.
* dwarf2expr.c (execute_stack_op): Add comments about thread local
storage variables.
* Makefile.in (dwarf2loc.o): Update dependencies.

gdb/ChangeLog
gdb/Makefile.in
gdb/dwarf2expr.c
gdb/dwarf2loc.c
gdb/dwarf2loc.h
gdb/dwarf2read.c
gdb/findvar.c
gdb/printcmd.c
gdb/symtab.h

index 286d6799948c7cf964168546ec2d11199ff89029..34ce8826e3ac6d6d10e563213e6098689680f998 100644 (file)
@@ -1,3 +1,23 @@
+2003-07-22  Elena Zannoni  <ezannoni@redhat.com>
+
+       * findvar.c (read_var_value): Remove case for thread local storage
+       variables.  It is now entirely handled by the dwarf2 location
+       expression code.
+       * printcmd.c (address_info): Ditto.
+       * symtab.h (address_class): Remove LOC_THREAD_LOCAL_STATIC
+       enumeration value.
+       (struct symbol): Remove objfile field, which was used by
+       LOC_THREAD_LOCAL_STATIC only.
+       * dwarf2read.c (decode_locdesc): Remove is_thread_local variable.
+       * dwarf2loc.h (struct dwarf2_loclist_baton): Add comment about
+       usage of objfile pointer.
+       * dwarf2loc.c (locexpr_describe_location): Add case to handle
+       thread local variables.
+       Add include of objfiles.h.
+       * dwarf2expr.c (execute_stack_op): Add comments about thread local
+       storage variables.
+       * Makefile.in (dwarf2loc.o): Update dependencies.
+
 2003-07-21  Andrew Cagney  <cagney@redhat.com>
 
        * dwarf2-frame.h (dwarf2_frame_sniffer): Replace "dwarf2_frame_p".
index e014ff2f3bae942f2cf7863482192306aa6162cc..8adbff1a88cee7d4c2d66c06ba163258dcf009df 100644 (file)
@@ -1676,7 +1676,8 @@ dwarf2expr.o: dwarf2expr.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(value_h) \
         $(gdbcore_h) $(dwarf2expr_h)
 dwarf2loc.o: dwarf2loc.c $(defs_h) $(ui_out_h) $(value_h) $(frame_h) \
        $(gdbcore_h) $(target_h) $(inferior_h) $(dwarf2expr_h) \
-       $(dwarf2loc_h) $(ax_h) $(ax_gdb_h) $(regcache_h) $(gdb_string_h)
+       $(dwarf2loc_h) $(ax_h) $(ax_gdb_h) $(regcache_h) $(objfiles_h) \
+       $(gdb_string_h)
 dwarf2-frame.o: $(defs_h) $(dwarf2expr_h) $(elf_dwarf2_h) $(frame_h) \
        $(frame_base_h) $(frame_unwind_h) $(gdbcore_h) $(gdbtypes_h) \
        $(symtab_h) $(objfiles_h) $(regcache_h) $(gdb_assert_h) \
index aa391ebd6a5e0b698ee7e808351fdb16daaeec2d..3d1523b601009508f8b0d1a3e6d956b0eeb5b469 100644 (file)
@@ -641,6 +641,14 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
          break;
 
        case DW_OP_GNU_push_tls_address:
+         /* Variable is at a constant offset in the thread-local
+         storage block into the objfile for the current thread and
+         the dynamic linker module containing this expression. Here
+         we return returns the offset from that base.  The top of the
+         stack has the offset from the beginning of the thread
+         control block at which the variable is located.  Nothing
+         should follow this operator, so the top of stack would be
+         returned.  */
          result = dwarf_expr_fetch (ctx, 0);
          dwarf_expr_pop (ctx);
          result = (ctx->get_tls_address) (ctx->baton, result);
index 9ed6b7e9665c64a700c0ff61dda44460fbb5c841..01a2ddac940879f41eda3a2d2c1c6e80edec3f82 100644 (file)
@@ -29,6 +29,7 @@
 #include "ax.h"
 #include "ax-gdb.h"
 #include "regcache.h"
+#include "objfiles.h"
 
 #include "elf/dwarf2.h"
 #include "dwarf2expr.h"
@@ -185,6 +186,8 @@ dwarf_expr_tls_address (void *baton, CORE_ADDR offset)
     addr = target_get_thread_local_address (inferior_ptid,
                                            debaton->objfile,
                                            offset);
+  /* 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");
 
@@ -406,6 +409,34 @@ locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
       return 1;
     }
 
+  /* The location expression for a TLS variable looks like this (on a
+     64-bit LE machine):
+
+     DW_AT_location    : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
+                        (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
+     
+     0x3 is the encoding for DW_OP_addr, which has an operand as long
+     as the size of an address on the target machine (here is 8
+     bytes).  0xe0 is the encoding for DW_OP_GNU_push_tls_address.
+     The operand represents the offset at which the variable is within
+     the thread local storage.  */
+
+  if (dlbaton->size > 1 
+      && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address)
+    if (dlbaton->data[0] == DW_OP_addr)
+      {
+       int bytes_read;
+       CORE_ADDR offset = dwarf2_read_address (&dlbaton->data[1],
+                                               &dlbaton->data[dlbaton->size - 2],
+                                               &bytes_read);
+       fprintf_filtered (stream, 
+                         "a thread-local variable at offset %s in the"
+                         "thread-local storage for `%s'",
+                         paddr_nz (offset), dlbaton->objfile->name);
+       return 1;
+      }
+  
+
   fprintf_filtered (stream,
                    "a variable with complex or multiple locations (DWARF2)");
   return 1;
index b6b4d3325e1a9cc53fd2033bb51c0f565b954e74..321cb037528019e85e3ba03a3a5861e42c6cd018 100644 (file)
@@ -55,6 +55,10 @@ struct dwarf2_loclist_baton
   unsigned short size;
 
   /* The objfile containing the symbol whose location we're computing.  */
+  /* Used (only???) by thread local variables.  The objfile in which
+     this symbol is defined.  To find a thread-local variable (e.g., a
+     variable declared with the `__thread' storage class), we may need
+     to know which object file it's in.  */
   struct objfile *objfile;
 };
 
index 1d68efffbd31c44d259ce4da3122ca1ce4bc2d4d..115d8db96458c509fdceab0c70ca96daa29b5801 100644 (file)
@@ -438,12 +438,6 @@ static int islocal;                /* Variable is at the returned offset
                                   this function, so we can't say
                                   which register it's relative to;
                                   use LOC_LOCAL.  */
-static int is_thread_local;     /* Variable is at a constant offset in the
-                                   thread-local storage block for the
-                                   current thread and the dynamic linker
-                                   module containing this expression.
-                                   decode_locdesc returns the offset from
-                                   that base.  */
 
 /* DW_AT_frame_base values for the current function.
    frame_base_reg is -1 if DW_AT_frame_base is missing, otherwise it
@@ -6788,7 +6782,6 @@ decode_locdesc (struct dwarf_block *blk, struct objfile *objfile,
   offreg = 0;
   isderef = 0;
   islocal = 0;
-  is_thread_local = 0;
   optimized_out = 1;
 
   while (i < size)
@@ -7014,7 +7007,6 @@ decode_locdesc (struct dwarf_block *blk, struct objfile *objfile,
          break;
 
         case DW_OP_GNU_push_tls_address:
-          is_thread_local = 1;
          /* The top of the stack has the offset from the beginning
             of the thread control block at which the variable is located.  */
          /* Nothing should follow this operator, so the top of stack would
index 933146a78bc646194ef621cc6a2f26c3e998a91b..6602c39b7fe3680c5b9cbfcdba9913ef5a77fea7 100644 (file)
@@ -512,20 +512,6 @@ addresses have not been bound by the dynamic loader. Try again when executable i
        break;
       }
 
-    case LOC_THREAD_LOCAL_STATIC:
-      {
-        if (target_get_thread_local_address_p ())
-          addr = target_get_thread_local_address (inferior_ptid,
-                                                  SYMBOL_OBJFILE (var),
-                                                  SYMBOL_VALUE_ADDRESS (var));
-        /* 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");
-        break;
-      }
-
     case LOC_TYPEDEF:
       error ("Cannot look up value of a typedef");
       break;
index 410b950fe33821e63fc127262e021ccd9f96143d..3f0bc3c21a8abf7cf331af4183c7fff8d0961bba 100644 (file)
@@ -1262,12 +1262,6 @@ address_info (char *exp, int from_tty)
                        val, REGISTER_NAME (basereg));
       break;
 
-    case LOC_THREAD_LOCAL_STATIC:
-      printf_filtered ("a thread-local variable at offset %ld in the "
-                       "thread-local storage for `%s'",
-                       val, SYMBOL_OBJFILE (sym)->name);
-      break;
-
     case LOC_OPTIMIZED_OUT:
       printf_filtered ("optimized out");
       break;
index 771675a7dc069e5cb1963000548f7ac67b807eba..b6309ebd35f51280bf7a955f1f44481e89d1958d 100644 (file)
@@ -481,14 +481,6 @@ enum address_class
 
   LOC_HP_THREAD_LOCAL_STATIC,
 
-  /* Value is at a thread-specific location calculated by a
-     target-specific method.  SYMBOL_OBJFILE gives the object file
-     in which the symbol is defined; the symbol's value is the
-     offset into that objfile's thread-local storage for the current
-     thread.  */
-      
-  LOC_THREAD_LOCAL_STATIC,
-
   /* The variable does not actually exist in the program.
      The value is ignored.  */
 
@@ -605,12 +597,6 @@ struct symbol
     /* Used by LOC_BASEREG and LOC_BASEREG_ARG.  */
     short basereg;
 
-    /* Used by LOC_THREAD_LOCAL_STATIC.  The objfile in which this
-       symbol is defined.  To find a thread-local variable (e.g., a
-       variable declared with the `__thread' storage class), we may
-       need to know which object file it's in.  */
-    struct objfile *objfile;
-
     /* For a LOC_COMPUTED or LOC_COMPUTED_ARG symbol, this is the
        baton and location_funcs structure to find its location.  For a
        LOC_BLOCK symbol for a function in a compilation unit compiled