* dwarf2read.c (dwarf2_fetch_die_loc_sect_off): New function.
authorTom Tromey <tromey@redhat.com>
Mon, 10 Dec 2012 17:17:29 +0000 (17:17 +0000)
committerTom Tromey <tromey@redhat.com>
Mon, 10 Dec 2012 17:17:29 +0000 (17:17 +0000)
(dwarf2_fetch_die_loc_cu_off): Rename from
dwarf2_fetch_die_location_block.  Rewrite to use
dwarf2_fetch_die_loc_sect_off.
* dwarf2loc.h (dwarf2_fetch_die_loc_sect_off): Declare.
(dwarf2_fetch_die_loc_cu_off): Rename.
* dwarf2loc.c (indirect_pieced_value): Use
dwarf2_fetch_die_loc_sect_off.
* dwarf2expr.h (struct dwarf_expr_context) <len, data>: Update
comment.
(struct dwarf_expr_piece) <v.ptr.die>: Now a sect_offset.
* dwarf2expr.c (add_piece): Update.
(execute_stack_op) <DW_OP_GNU_implicit_pointer>: Update comment.
testsuite
* gdb.dwarf2/implptr-64bit.exp: Run tests with two CUs as well.
(test): Add "two_cu" argument.
* gdb.dwarf2/implptr-64bit.S: Move subprogram later; use ref_addr
for types; allow two CUs.

gdb/ChangeLog
gdb/dwarf2expr.c
gdb/dwarf2expr.h
gdb/dwarf2loc.c
gdb/dwarf2loc.h
gdb/dwarf2read.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/implptr-64bit.S
gdb/testsuite/gdb.dwarf2/implptr-64bit.exp

index fc2678a10e730886f8ff926096ba6243a4b0d1d2..fc84e6864784a2e48303110e9ef1a4704a2227e3 100644 (file)
@@ -1,3 +1,19 @@
+2012-12-10  Tom Tromey  <tromey@redhat.com>
+
+       * dwarf2read.c (dwarf2_fetch_die_loc_sect_off): New function.
+       (dwarf2_fetch_die_loc_cu_off): Rename from
+       dwarf2_fetch_die_location_block.  Rewrite to use
+       dwarf2_fetch_die_loc_sect_off.
+       * dwarf2loc.h (dwarf2_fetch_die_loc_sect_off): Declare.
+       (dwarf2_fetch_die_loc_cu_off): Rename.
+       * dwarf2loc.c (indirect_pieced_value): Use
+       dwarf2_fetch_die_loc_sect_off.
+       * dwarf2expr.h (struct dwarf_expr_context) <len, data>: Update
+       comment.
+       (struct dwarf_expr_piece) <v.ptr.die>: Now a sect_offset.
+       * dwarf2expr.c (add_piece): Update.
+       (execute_stack_op) <DW_OP_GNU_implicit_pointer>: Update comment.
+
 2012-12-10  Tom Tromey  <tromey@redhat.com>
 
        * buildsym.c (struct pending_block): Move from buildsym.h.
index 214b371e569f083bdf9cf98a3cca120e299a4f58..877add44d83364e71f411d5e9886125962584c43 100644 (file)
@@ -342,7 +342,7 @@ add_piece (struct dwarf_expr_context *ctx, ULONGEST size, ULONGEST offset)
     }
   else if (p->location == DWARF_VALUE_IMPLICIT_POINTER)
     {
-      p->v.ptr.die.cu_off = ctx->len;
+      p->v.ptr.die.sect_off = ctx->len;
       p->v.ptr.offset = value_as_long (dwarf_expr_fetch (ctx, 0));
     }
   else if (p->location == DWARF_VALUE_REGISTER)
@@ -872,7 +872,7 @@ execute_stack_op (struct dwarf_expr_context *ctx,
              error (_("DWARF-2 expression error: DW_OP_GNU_implicit_pointer "
                       "is not allowed in frame context"));
 
-           /* The referred-to DIE of cu_offset kind.  */
+           /* The referred-to DIE of sect_offset kind.  */
            ctx->len = extract_unsigned_integer (op_ptr, ctx->ref_addr_size,
                                                 byte_order);
            op_ptr += ctx->ref_addr_size;
index 19efbfd78bbbce4f2857ac522f5c8ad4e0c59416..1b890dcf5704cc91c571db03d17300a8e9bb3e79 100644 (file)
@@ -165,7 +165,7 @@ struct dwarf_expr_context
 
   /* For DWARF_VALUE_LITERAL, the current literal value's length and
      data.  For DWARF_VALUE_IMPLICIT_POINTER, LEN is the offset of the
-     target DIE of cu_offset kind.  */
+     target DIE of sect_offset kind.  */
   ULONGEST len;
   const gdb_byte *data;
 
@@ -236,7 +236,7 @@ struct dwarf_expr_piece
     struct
     {
       /* The referent DIE from DW_OP_GNU_implicit_pointer.  */
-      cu_offset die;
+      sect_offset die;
       /* The byte offset into the resulting data.  */
       LONGEST offset;
     } ptr;
index 0f8e9af66764b211ebda8624a882254212a9ba63..0a5200a8a90e8d7b64360c45914ff5bfef2b49a2 100644 (file)
@@ -429,8 +429,7 @@ per_cu_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset,
 {
   struct dwarf2_locexpr_baton block;
 
-  block = dwarf2_fetch_die_location_block (die_offset, per_cu,
-                                          get_frame_pc, baton);
+  block = dwarf2_fetch_die_loc_cu_off (die_offset, per_cu, get_frame_pc, baton);
 
   /* DW_OP_call_ref is currently not supported.  */
   gdb_assert (block.per_cu == per_cu);
@@ -2038,9 +2037,10 @@ indirect_pieced_value (struct value *value)
   byte_offset = value_as_address (value);
 
   gdb_assert (piece);
-  baton = dwarf2_fetch_die_location_block (piece->v.ptr.die, c->per_cu,
-                                          get_frame_address_in_block_wrapper,
-                                          frame);
+  baton
+    = dwarf2_fetch_die_loc_sect_off (piece->v.ptr.die, c->per_cu,
+                                    get_frame_address_in_block_wrapper,
+                                    frame);
 
   return dwarf2_evaluate_loc_desc_full (TYPE_TARGET_TYPE (type), frame,
                                        baton.data, baton.size, baton.per_cu,
@@ -3205,8 +3205,8 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc,
            op_ptr += size;
 
            offset.cu_off = uoffset;
-           block = dwarf2_fetch_die_location_block (offset, per_cu,
-                                                    get_ax_pc, expr);
+           block = dwarf2_fetch_die_loc_cu_off (offset, per_cu,
+                                                get_ax_pc, expr);
 
            /* DW_OP_call_ref is currently not supported.  */
            gdb_assert (block.per_cu == per_cu);
index 0f1076798c8709270034bcb32850d5ab931bb3fb..6a8b3c8c7b982c5cee9932606f7311b512d346b5 100644 (file)
@@ -62,7 +62,12 @@ const gdb_byte *dwarf2_find_location_expression
    size_t *locexpr_length,
    CORE_ADDR pc);
 
-struct dwarf2_locexpr_baton dwarf2_fetch_die_location_block
+struct dwarf2_locexpr_baton dwarf2_fetch_die_loc_sect_off
+  (sect_offset offset_in_cu, struct dwarf2_per_cu_data *per_cu,
+   CORE_ADDR (*get_frame_pc) (void *baton),
+   void *baton);
+
+struct dwarf2_locexpr_baton dwarf2_fetch_die_loc_cu_off
   (cu_offset offset_in_cu, struct dwarf2_per_cu_data *per_cu,
    CORE_ADDR (*get_frame_pc) (void *baton),
    void *baton);
index 6eea17e69817a0971b8e647dbe9ee5b4611d8cbf..2168c69ef2d51b5f2a552d4ce79a7dc25ab2ea0e 100644 (file)
@@ -17334,12 +17334,11 @@ follow_die_ref (struct die_info *src_die, struct attribute *attr,
    dwarf2_locexpr_baton->data has lifetime of PER_CU->OBJFILE.  */
 
 struct dwarf2_locexpr_baton
-dwarf2_fetch_die_location_block (cu_offset offset_in_cu,
-                                struct dwarf2_per_cu_data *per_cu,
-                                CORE_ADDR (*get_frame_pc) (void *baton),
-                                void *baton)
+dwarf2_fetch_die_loc_sect_off (sect_offset offset,
+                              struct dwarf2_per_cu_data *per_cu,
+                              CORE_ADDR (*get_frame_pc) (void *baton),
+                              void *baton)
 {
-  sect_offset offset = { per_cu->offset.sect_off + offset_in_cu.cu_off };
   struct dwarf2_cu *cu;
   struct die_info *die;
   struct attribute *attr;
@@ -17394,6 +17393,20 @@ dwarf2_fetch_die_location_block (cu_offset offset_in_cu,
   return retval;
 }
 
+/* Like dwarf2_fetch_die_loc_sect_off, but take a CU
+   offset.  */
+
+struct dwarf2_locexpr_baton
+dwarf2_fetch_die_loc_cu_off (cu_offset offset_in_cu,
+                            struct dwarf2_per_cu_data *per_cu,
+                            CORE_ADDR (*get_frame_pc) (void *baton),
+                            void *baton)
+{
+  sect_offset offset = { per_cu->offset.sect_off + offset_in_cu.cu_off };
+
+  return dwarf2_fetch_die_loc_sect_off (offset, per_cu, get_frame_pc, baton);
+}
+
 /* Return the type of the DIE at DIE_OFFSET in the CU named by
    PER_CU.  */
 
index de29aa386aa6db53351e04fc33194b4bc21c6f9c..9f38c8d38a29b4f8665cdf6c9cd56b32e084ba92 100644 (file)
@@ -1,3 +1,10 @@
+2012-12-10  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.dwarf2/implptr-64bit.exp: Run tests with two CUs as well.
+       (test): Add "two_cu" argument.
+       * gdb.dwarf2/implptr-64bit.S: Move subprogram later; use ref_addr
+       for types; allow two CUs.
+
 2012-12-09  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.dwarf2/dw2-compdir-oldgcc.S: New file.
index be8db5c182c48098cf2ad9d006746f3f4e412b09..d0d870ac880a36794642eed4787b5d217976a757 100644 (file)
@@ -18,11 +18,12 @@ d:
        /* Length of Compilation Unit Info */
 #if OFFSET_SIZE == 4
 # define OFFSET .4byte
-       .4byte  debug_end - 1f
+# define HEADER_LINE1
+# define HEADER_LINE2(END) .4byte      END - 1f
 #elif OFFSET_SIZE == 8
 # define OFFSET .8byte
-       .4byte  0xffffffff
-       .8byte  debug_end - 1f
+# define HEADER_LINE1 .4byte   0xffffffff
+# define HEADER_LINE2(END) .8byte      END - 1f
 #else
 # error
 #endif
@@ -40,6 +41,16 @@ d:
 #else
 # error
 #endif
+       
+#if TWO_CU
+# define END1 .Lcu_end_1
+#else
+# define END1 debug_end
+#endif
+
+       HEADER_LINE1
+       HEADER_LINE2(END1)
+
 1:
        .2byte  DWARF_VERSION   /* DWARF version number */
        OFFSET  .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
@@ -68,13 +79,6 @@ d:
 
        .byte   0x0     /* end of children of DW_TAG_structure_type */
 
-       .uleb128        6                       /* Abbrev: DW_TAG_subprogram */
-       .ascii          "main\0"                /* DW_AT_name */
-       ADDR            main                    /* DW_AT_low_pc */
-       ADDR            main + 0x100            /* DW_AT_high_pc */
-       .4byte          .Ltype_int - d          /* DW_AT_type */
-       .byte           1                       /* DW_AT_external */
-
 .Ltype_structptr:
        .uleb128 0x5    /* DW_TAG_pointer_type */
        .byte   ADDR_SIZE       /* DW_AT_byte_size */
@@ -90,7 +94,32 @@ d:
 3:
        .byte   1, 1, 1, 1
 2:
-       .4byte  .Ltype_struct - d       /* DW_AT_type */
+       REF_ADDR        .Ltype_struct - d       /* DW_AT_type */
+
+#if TWO_CU
+       .byte   0x0     /* end of children of CU */
+.Lcu_end_1:
+
+       HEADER_LINE1
+       HEADER_LINE2 (debug_end)
+
+1:
+       .2byte  DWARF_VERSION   /* DWARF version number */
+       OFFSET  .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+       .byte   ADDR_SIZE       /* Pointer Size (in bytes) */
+
+       .uleb128 0x1    /* (DIE (0xb) DW_TAG_compile_unit) */
+       .ascii "GNU C 4.4.3\0"  /* DW_AT_producer */
+       .byte   0x1     /* DW_AT_language */
+       .ascii "1.c\0"  /* DW_AT_name */
+#endif
+
+       .uleb128        6                       /* Abbrev: DW_TAG_subprogram */
+       .ascii          "main\0"                /* DW_AT_name */
+       ADDR            main                    /* DW_AT_low_pc */
+       ADDR            main + 0x100            /* DW_AT_high_pc */
+       REF_ADDR        .Ltype_int - d          /* DW_AT_type */
+       .byte           1                       /* DW_AT_external */
 
        .uleb128 0x4    /* (DW_TAG_variable) */
        .ascii "p\0"    /* DW_AT_name */
@@ -100,7 +129,7 @@ d:
        REF_ADDR        .Lvar_out - d   /* referenced DIE */
        .sleb128        0       /* offset */
 2:
-       .4byte  .Ltype_structptr - d    /* DW_AT_type */
+       REF_ADDR        .Ltype_structptr - d    /* DW_AT_type */
 
        .byte   0x0     /* end of children of main */
 
@@ -152,7 +181,7 @@ debug_end:
        .uleb128 0x02   /* (DW_AT_location) */
        .uleb128 0xa    /* (DW_FORM_block1) */
        .uleb128 0x49   /* (DW_AT_type) */
-       .uleb128 0x13   /* (DW_FORM_ref4) */
+       .uleb128 0x10   /* (DW_FORM_ref_addr) */
        .byte   0x0
        .byte   0x0
 
@@ -176,7 +205,7 @@ debug_end:
        .uleb128        0x12                    /* DW_AT_high_pc */
        .uleb128        0x1                     /* DW_FORM_addr */
        .uleb128        0x49                    /* DW_AT_type */
-       .uleb128        0x13                    /* DW_FORM_ref4 */
+       .uleb128        0x10                    /* DW_FORM_ref_addr */
        .uleb128        0x3f                    /* DW_AT_external */
        .uleb128        0xc                     /* DW_FORM_flag */
        .byte           0x0                     /* Terminator */
index 78f1594d1e68362a987bc5ce8ed73133e33b9518..066cf782d1bed5286130a72213e3d4c8315e15c2 100644 (file)
@@ -22,16 +22,16 @@ if {![dwarf2_support]} {
 standard_testfile .S
 set mainfile main.c
 
-proc test { dwarf_version offset_size addr_size ref_addr_size } {
+proc test { dwarf_version offset_size addr_size ref_addr_size two_cu } {
     global testfile srcfile mainfile
 
     # 32-bit targets do not support any of the testcases; keep quiet there.
     set opts {quiet}
-    foreach n { dwarf_version offset_size addr_size ref_addr_size } {
+    foreach n { dwarf_version offset_size addr_size ref_addr_size two_cu } {
        lappend opts "additional_flags=-D[string toupper $n]=[expr "\$$n"]"
     }
 
-    set name "d${dwarf_version}o${offset_size}a${addr_size}r${ref_addr_size}"
+    set name "d${dwarf_version}o${offset_size}a${addr_size}r${ref_addr_size}t${two_cu}"
     set executable ${testfile}-${name}
     if [prepare_for_testing ${testfile}.exp $executable "${srcfile} ${mainfile}" $opts] {
        return -1
@@ -44,8 +44,12 @@ proc test { dwarf_version offset_size addr_size ref_addr_size } {
     gdb_test "p/x p->f" " = 0x1010101" $name
 }
 
-#    DWARF_VERSION OFFSET_SIZE ADDR_SIZE REF_ADDR_SIZE
-test 2 8 4 4
-test 2 4 8 8
-test 3 8 4 8
-test 3 4 8 4
+#    DWARF_VERSION OFFSET_SIZE ADDR_SIZE REF_ADDR_SIZE TWO_CU
+test 2 8 4 4 0
+test 2 4 8 8 0
+test 3 8 4 8 0
+test 3 4 8 4 0
+test 2 8 4 4 1
+test 2 4 8 8 1
+test 3 8 4 8 1
+test 3 4 8 4 1