* dec-thread.c (dec_thread_wait): Add options parameter. Use it
[deliverable/binutils-gdb.git] / gdb / dwarf2loc.c
index 4f4c0cab6b187314646c93f7733178c0e3bc6cc2..cad3db802292905b1120eba4e2e31d0313c07ae4 100644 (file)
@@ -1,6 +1,6 @@
 /* DWARF 2 location expression support for GDB.
 
-   Copyright (C) 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
 
    Contributed by Daniel Jacobowitz, MontaVista Software, Inc.
 
@@ -55,6 +55,7 @@ find_location_expression (struct dwarf2_loclist_baton *baton,
   gdb_byte *loc_ptr, *buf_end;
   int length;
   struct objfile *objfile = dwarf2_per_cu_objfile (baton->per_cu);
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu);
   CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
   /* Adjust base_address for relocatable objects.  */
@@ -67,9 +68,9 @@ find_location_expression (struct dwarf2_loclist_baton *baton,
 
   while (1)
     {
-      low = dwarf2_read_address (loc_ptr, buf_end, addr_size);
+      low = dwarf2_read_address (gdbarch, loc_ptr, buf_end, addr_size);
       loc_ptr += addr_size;
-      high = dwarf2_read_address (loc_ptr, buf_end, addr_size);
+      high = dwarf2_read_address (gdbarch, loc_ptr, buf_end, addr_size);
       loc_ptr += addr_size;
 
       /* An end-of-list entry.  */
@@ -116,11 +117,12 @@ static CORE_ADDR
 dwarf_expr_read_reg (void *baton, int dwarf_regnum)
 {
   struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
+  struct gdbarch *gdbarch = get_frame_arch (debaton->frame);
   CORE_ADDR result;
   int regnum;
 
-  regnum = gdbarch_dwarf2_reg_to_regnum (current_gdbarch, dwarf_regnum);
-  result = address_from_register (builtin_type_void_data_ptr,
+  regnum = gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf_regnum);
+  result = address_from_register (builtin_type (gdbarch)->builtin_data_ptr,
                                  regnum, debaton->frame);
   return result;
 }
@@ -165,8 +167,13 @@ dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length)
     {
       struct dwarf2_locexpr_baton *symbaton;
       symbaton = SYMBOL_LOCATION_BATON (framefunc);
-      *length = symbaton->size;
-      *start = symbaton->data;
+      if (symbaton != NULL)
+       {
+         *length = symbaton->size;
+         *start = symbaton->data;
+       }
+      else
+       *start = NULL;
     }
 
   if (*start == NULL)
@@ -192,7 +199,6 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
                          gdb_byte *data, unsigned short size,
                          struct dwarf2_per_cu_data *per_cu)
 {
-  struct gdbarch *arch = get_frame_arch (frame);
   struct value *retval;
   struct dwarf_expr_baton baton;
   struct dwarf_expr_context *ctx;
@@ -209,6 +215,7 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
   baton.objfile = dwarf2_per_cu_objfile (per_cu);
 
   ctx = new_dwarf_expr_context ();
+  ctx->gdbarch = get_objfile_arch (baton.objfile);
   ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
   ctx->baton = &baton;
   ctx->read_reg = dwarf_expr_read_reg;
@@ -230,9 +237,9 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
          struct dwarf_expr_piece *p = &ctx->pieces[i];
          if (p->in_reg)
            {
+             struct gdbarch *arch = get_frame_arch (frame);
              bfd_byte regval[MAX_REGISTER_SIZE];
-             int gdb_regnum = gdbarch_dwarf2_reg_to_regnum
-                                (arch, p->value);
+             int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->value);
              get_frame_register (frame, gdb_regnum, regval);
              memcpy (contents + offset, regval, p->size);
            }
@@ -245,9 +252,9 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
     }
   else if (ctx->in_reg)
     {
+      struct gdbarch *arch = get_frame_arch (frame);
       CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
-      int gdb_regnum = gdbarch_dwarf2_reg_to_regnum
-                        (arch, dwarf_regnum);
+      int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
       retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame);
     }
   else
@@ -330,6 +337,7 @@ dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
   baton.needs_frame = 0;
 
   ctx = new_dwarf_expr_context ();
+  ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
   ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
   ctx->baton = &baton;
   ctx->read_reg = needs_frame_read_reg;
@@ -459,11 +467,13 @@ locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
       && dlbaton->data[0] >= DW_OP_reg0
       && dlbaton->data[0] <= DW_OP_reg31)
     {
-      int regno = gdbarch_dwarf2_reg_to_regnum
-                   (current_gdbarch, dlbaton->data[0] - DW_OP_reg0);
+      struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
+      struct gdbarch *gdbarch = get_objfile_arch (objfile);
+      int regno = gdbarch_dwarf2_reg_to_regnum (gdbarch,
+                                               dlbaton->data[0] - DW_OP_reg0);
       fprintf_filtered (stream,
                        "a variable in register %s",
-                       gdbarch_register_name (current_gdbarch, regno));
+                       gdbarch_register_name (gdbarch, regno));
       return 1;
     }
 
@@ -484,7 +494,9 @@ locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
     if (dlbaton->data[0] == DW_OP_addr)
       {
        struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
-       CORE_ADDR offset = dwarf2_read_address (&dlbaton->data[1],
+       struct gdbarch *gdbarch = get_objfile_arch (objfile);
+       CORE_ADDR offset = dwarf2_read_address (gdbarch,
+                                               &dlbaton->data[1],
                                                &dlbaton->data[dlbaton->size - 1],
                                                addr_size);
        fprintf_filtered (stream, 
This page took 0.025323 seconds and 4 git commands to generate.