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 <[email protected]> * 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. */ _______________________________________________ elfutils-devel mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/elfutils-devel
