dwarf_getlocation.c (__libdw_intern_expression) <cfap>: Make new loclist
authorJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 8 Oct 2012 21:08:01 +0000 (23:08 +0200)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 8 Oct 2012 21:08:01 +0000 (23:08 +0200)
element DW_OP_call_frame_cfa before decoding the opcodes.  Remove the later
DW_OP_call_frame_cfa push to RESULT.

Signed-off-by: Jan Kratochvil <jan.kratochvil@redhat.com>
libdw/ChangeLog
libdw/dwarf_getlocation.c

index 3500cf8..cc45d59 100644 (file)
@@ -1,5 +1,11 @@
 2012-10-08  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
+       * dwarf_getlocation.c (__libdw_intern_expression) <cfap>: Make new
+       loclist element DW_OP_call_frame_cfa before decoding the opcodes.
+       Remove the later DW_OP_call_frame_cfa push to RESULT.
+
+2012-10-08  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
        Code cleanup.
        * fde.c (binary_search_fde): Remove always true <address >= start>
        conditional.  Move L initialization upwards.
index dfaa742..cda98a9 100644 (file)
@@ -224,6 +224,21 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
 
   struct loclist *loclist = NULL;
   unsigned int n = 0;
+
+  if (cfap)
+    {
+      /* Synthesize the operation to push the CFA before the expression.  */
+      struct loclist *newloc;
+      newloc = (struct loclist *) alloca (sizeof (struct loclist));
+      newloc->atom = DW_OP_call_frame_cfa;
+      newloc->number = 0;
+      newloc->number2 = 0;
+      newloc->offset = -1;
+      newloc->next = loclist;
+      loclist = newloc;
+      ++n;
+    }
+
   /* Decode the opcodes.  It is possible in some situations to have a
      block of size zero.  */
   while (data < end_data)
@@ -434,9 +449,6 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
       ++n;
     }
 
-  if (cfap)
-    ++n;
-
   /* Allocate the array.  */
   Dwarf_Op *result;
   if (dbg != NULL)
@@ -456,16 +468,6 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
   *llbuf = result;
   *listlen = n;
 
-  if (cfap)
-    {
-      /* Synthesize the operation to push the CFA before the expression.  */
-      --n;
-      result[0].atom = DW_OP_call_frame_cfa;
-      result[0].number = 0;
-      result[0].number2 = 0;
-      result[0].offset = -1;
-    }
-
   do
     {
       /* We populate the array from the back since the list is backwards.  */