This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
Re: [patch] Fix DW_CFA_expression & co. CFA initial push
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: elfutils-devel at lists dot fedorahosted dot org
- Date: Mon, 08 Oct 2012 23:01:35 +0200
- Subject: 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. */