diff options
author | Mark Wielaard <mjw@redhat.com> | 2010-02-02 13:47:19 +0100 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2010-02-02 13:54:19 +0100 |
commit | 87748e2b87e574d3c83866ccd0d83678c3c68d93 (patch) | |
tree | f3db83626aa63188c6cf0f41489f6908d78a1255 /dwflpp.cxx | |
parent | 42eca8cc5a5b1073332596dd3fc0ecfe98394f60 (diff) | |
download | systemtap-steved-87748e2b87e574d3c83866ccd0d83678c3c68d93.tar.gz systemtap-steved-87748e2b87e574d3c83866ccd0d83678c3c68d93.tar.xz systemtap-steved-87748e2b87e574d3c83866ccd0d83678c3c68d93.zip |
Make sure cfa_ops are always retrieved through dwfl global address.
dwflpp::translate_location() works on the dw address space, but
get_cfa_ops() starts out with dwfl calls (only dwarf_cfi_addrframe()
needs to be adjusted for bias).
* dwflpp.cxx (translate_location): Pass pc plus module bias through to
get_cfa_ops.
(get_cfa_ops): Adjust for bias when calling dwarf_cfi_addrframe(),
add frame start/end address when found if verbose logging.
* testsuite/systemtap.exelib/lib.stp: Add $foo and $bar variables to
process.function probes.
* testsuite/systemtap.exelib/libmarkunamestack.stp: Likewise.
* testsuite/systemtap.exelib/lib.tcl: Expect correct values for
process.function probe variables.
* testsuite/systemtap.exelib/libmarkunamestack.tcl: Likewise.
Diffstat (limited to 'dwflpp.cxx')
-rw-r--r-- | dwflpp.cxx | 34 |
1 files changed, 24 insertions, 10 deletions
@@ -1726,9 +1726,10 @@ dwflpp::translate_location(struct obstack *pool, e->tok); } - // pc is relative to current module, which is what get_cfa_ops - // and c_translate_location expects. - Dwarf_Op *cfa_ops = get_cfa_ops (pc); + // pc is in the dw address space of the current module, which is what + // c_translate_location expects. get_cfa_ops wants the global dwfl address. + Dwarf_Addr addr = pc + module_bias; + Dwarf_Op *cfa_ops = get_cfa_ops (addr); return c_translate_location (pool, &loc2c_error, this, &loc2c_emit_address, 1, 0 /* PR9768 */, @@ -2783,17 +2784,17 @@ dwflpp::get_cfa_ops (Dwarf_Addr pc) clog << "get_cfa_ops @0x" << hex << pc << dec << ", module_start @0x" << hex << module_start << dec << endl; -#if _ELFUTILS_PREREQ(0,142) // Try debug_frame first, then fall back on eh_frame. - size_t cfa_nops; - Dwarf_Addr bias; + size_t cfa_nops = 0; + Dwarf_Addr bias = 0; + Dwarf_Frame *frame = NULL; +#if _ELFUTILS_PREREQ(0,142) Dwarf_CFI *cfi = dwfl_module_dwarf_cfi (module, &bias); if (cfi != NULL) { if (sess.verbose > 3) clog << "got dwarf cfi bias: 0x" << hex << bias << dec << endl; - Dwarf_Frame *frame = NULL; - if (dwarf_cfi_addrframe (cfi, pc, &frame) == 0) + if (dwarf_cfi_addrframe (cfi, pc - bias, &frame) == 0) dwarf_frame_cfa (frame, &cfa_ops, &cfa_nops); else if (sess.verbose > 3) clog << "dwarf_cfi_addrframe failed: " << dwarf_errmsg(-1) << endl; @@ -2809,7 +2810,7 @@ dwflpp::get_cfa_ops (Dwarf_Addr pc) if (sess.verbose > 3) clog << "got eh cfi bias: 0x" << hex << bias << dec << endl; Dwarf_Frame *frame = NULL; - if (dwarf_cfi_addrframe (cfi, pc, &frame) == 0) + if (dwarf_cfi_addrframe (cfi, pc - bias, &frame) == 0) dwarf_frame_cfa (frame, &cfa_ops, &cfa_nops); else if (sess.verbose > 3) clog << "dwarf_cfi_addrframe failed: " << dwarf_errmsg(-1) << endl; @@ -2821,7 +2822,20 @@ dwflpp::get_cfa_ops (Dwarf_Addr pc) #endif if (sess.verbose > 2) - clog << (cfa_ops == NULL ? "not " : " ") << "found cfa" << endl; + { + if (cfa_ops == NULL) + clog << "not found cfa" << endl; + else + { + Dwarf_Addr frame_start, frame_end; + bool frame_signalp; + int info = dwarf_frame_info (frame, &frame_start, &frame_end, + &frame_signalp); + clog << "found cfa, info:" << info << " [start: 0x" << hex + << frame_start << dec << ", end: 0x" << hex << frame_end + << dec << "), nops: " << cfa_nops << endl; + } + } return cfa_ops; } |