From 96a9fc6ae246e2e03f9d82f136960691fa4a88fe Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 8 Oct 2012 23:08:01 +0200 Subject: [PATCH] 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 --- libdw/ChangeLog | 6 ++++++ libdw/dwarf_getlocation.c | 28 +++++++++++++++------------- 2 files changed, 21 insertions(+), 13 deletions(-) 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. */ -- 2.47.2