2009-01-08 Kai Tietz <kai.tietz@onevision.com>
[binutils-gdb.git] / gdb / findvar.c
index a39c8ff7eeffe253417ca2b2e78a9b90b6713a3b..a56650df4fd88a96bdc433705c4e0e6a3454e104 100644 (file)
@@ -1,7 +1,7 @@
 /* Find a variable's value in memory, for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008
+   1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008, 2009
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -34,6 +34,7 @@
 #include "regcache.h"
 #include "user-regs.h"
 #include "block.h"
+#include "objfiles.h"
 
 /* Basic byte-swapping routines.  GDB has needed these for a long time...
    All extract a target-format integer at ADDR which is LEN bytes long.  */
@@ -424,7 +425,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
        {
          CORE_ADDR addr
            = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var),
-                                       SYMBOL_BFD_SECTION (var));
+                                       SYMBOL_OBJ_SECTION (var));
          store_typed_address (value_contents_raw (v), type, addr);
        }
       else
@@ -443,7 +444,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
     case LOC_STATIC:
       if (overlay_debugging)
        addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var),
-                                        SYMBOL_BFD_SECTION (var));
+                                        SYMBOL_OBJ_SECTION (var));
       else
        addr = SYMBOL_VALUE_ADDRESS (var);
       break;
@@ -486,7 +487,7 @@ read_var_value (struct symbol *var, struct frame_info *frame)
     case LOC_BLOCK:
       if (overlay_debugging)
        VALUE_ADDRESS (v) = symbol_overlayed_address
-         (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_BFD_SECTION (var));
+         (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (var));
       else
        VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (var));
       return v;
@@ -536,15 +537,21 @@ read_var_value (struct symbol *var, struct frame_info *frame)
     case LOC_UNRESOLVED:
       {
        struct minimal_symbol *msym;
+       struct obj_section *obj_section;
 
        msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL);
        if (msym == NULL)
          return 0;
        if (overlay_debugging)
          addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (msym),
-                                          SYMBOL_BFD_SECTION (msym));
+                                          SYMBOL_OBJ_SECTION (msym));
        else
          addr = SYMBOL_VALUE_ADDRESS (msym);
+
+       obj_section = SYMBOL_OBJ_SECTION (msym);
+       if (obj_section
+           && (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
+         addr = target_translate_tls_address (obj_section->objfile, addr);
       }
       break;