This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Fix DW_CFA_expression & co. CFA initial push


Hi Roland,

On Mon, 08 Oct 2012 21:45:42 +0200, Roland McGrath wrote:
> I think it would be cleaner and less error-prone to just push another
> 'struct loclist' on the front for the cfap case like the valuep case does.

OK for check-in?


Thanks,
Jan


libdw/
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.

diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c
index dfaa742..cda98a9 100644
--- a/libdw/dwarf_getlocation.c
+++ b/libdw/dwarf_getlocation.c
@@ -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.  */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]