OSDN Git Service

* dwarf2loc.c (find_location_expression): Retrieve beginning and
authoruweigand <uweigand>
Mon, 20 Jul 2009 15:06:13 +0000 (15:06 +0000)
committeruweigand <uweigand>
Mon, 20 Jul 2009 15:06:13 +0000 (15:06 +0000)
ending address offsets in location list entries as integers,
not as addresses.

gdb/ChangeLog
gdb/dwarf2loc.c

index 9b8e9f9..f07defa 100644 (file)
@@ -1,5 +1,11 @@
 2009-07-20  Ulrich Weigand  <uweigand@de.ibm.com>
 
+       * dwarf2loc.c (find_location_expression): Retrieve beginning and
+       ending address offsets in location list entries as integers,
+       not as addresses.
+
+2009-07-20  Ulrich Weigand  <uweigand@de.ibm.com>
+
        * infrun.c (wait_for_inferior): Invalidate registers and overlay
        cache every time before calling target_wait.
        (handle_inferior_event): Make static. Always reset waiton_ptid.
index b163231..071b5ac 100644 (file)
@@ -70,22 +70,28 @@ find_location_expression (struct dwarf2_loclist_baton *baton,
 
   while (1)
     {
-      low = dwarf2_read_address (gdbarch, loc_ptr, buf_end, addr_size);
-      loc_ptr += addr_size;
-      high = dwarf2_read_address (gdbarch, loc_ptr, buf_end, addr_size);
-      loc_ptr += addr_size;
+      if (buf_end - loc_ptr < 2 * addr_size)
+       error (_("find_location_expression: Corrupted DWARF expression."));
 
-      /* An end-of-list entry.  */
-      if (low == 0 && high == 0)
-       return NULL;
+      low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
+      loc_ptr += addr_size;
 
       /* A base-address-selection entry.  */
-      if ((low & base_mask) == base_mask)
+      if (low == base_mask)
        {
-         base_address = high;
+         base_address = dwarf2_read_address (gdbarch,
+                                             loc_ptr, buf_end, addr_size);
+         loc_ptr += addr_size;
          continue;
        }
 
+      high = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
+      loc_ptr += addr_size;
+
+      /* An end-of-list entry.  */
+      if (low == 0 && high == 0)
+       return NULL;
+
       /* Otherwise, a location expression entry.  */
       low += base_address;
       high += base_address;