From: Jan Kratochvil Date: Mon, 8 Oct 2012 21:08:01 +0000 (+0200) Subject: dwarf_getlocation.c (__libdw_intern_expression) : Make new loclist X-Git-Tag: elfutils-0.156~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96a9fc6ae246e2e03f9d82f136960691fa4a88fe;p=thirdparty%2Felfutils.git dwarf_getlocation.c (__libdw_intern_expression) : Make new loclist 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 --- diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 3500cf818..cc45d5992 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,9 @@ +2012-10-08 Jan Kratochvil + + * dwarf_getlocation.c (__libdw_intern_expression) : 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 Code cleanup. diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c index dfaa742c6..cda98a993 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. */