summaryrefslogtreecommitdiffstats
path: root/dwflpp.cxx
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2010-02-02 13:47:19 +0100
committerMark Wielaard <mjw@redhat.com>2010-02-02 13:54:19 +0100
commit87748e2b87e574d3c83866ccd0d83678c3c68d93 (patch)
treef3db83626aa63188c6cf0f41489f6908d78a1255 /dwflpp.cxx
parent42eca8cc5a5b1073332596dd3fc0ecfe98394f60 (diff)
downloadsystemtap-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.cxx34
1 files changed, 24 insertions, 10 deletions
diff --git a/dwflpp.cxx b/dwflpp.cxx
index e6fe017d..d16411c5 100644
--- a/dwflpp.cxx
+++ b/dwflpp.cxx
@@ -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;
}