From: Stan Cox Date: Fri, 6 Jun 2008 18:35:29 +0000 (-0400) Subject: Add .statement("function@file.c+N") X-Git-Tag: release-0.7-rc1~86 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=0c8b7d37152767709273c0e3de0f881f0d13b1b2;p=systemtap.git Add .statement("function@file.c+N") --- diff --git a/ChangeLog b/ChangeLog index dc3202c99..14adb3708 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-06-06 Stan Cox + + * tapsets.cxx (dwflpp::iterate_over_srcfile_lines): + Add parameter line_type_relative. + (enum line_t): New. + (dwarf_query::line_type): New. + (dwarf_query::parse_function_spec): Set line_type. + 2008-06-06 David Smith * NEWS: Updated utrace probes descriptions. diff --git a/tapsets.cxx b/tapsets.cxx index ef7015649..527272fac 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -1156,6 +1156,7 @@ struct dwflpp void iterate_over_srcfile_lines (char const * srcfile, int lineno, bool need_single_match, + bool line_type_relative, void (* callback) (Dwarf_Line * line, void * arg), void *data) { @@ -1165,6 +1166,19 @@ struct dwflpp get_module_dwarf(); + if (line_type_relative) + { + Dwarf_Addr addr; + Dwarf_Line *line; + int line_number; + + dwarf_assert ("dwarf_entrypc", dwarf_entrypc (this->function, &addr)); + line = dwarf_getsrc_die (this->cu, addr); + dwarf_assert ("dwarf_getsrc_die", line == NULL); + dwarf_assert ("dwarf_lineno", dwarf_lineno (line, &line_number)); + lineno += line_number; + } + dwarf_assert ("dwarf_getsrc_file", dwarf_getsrc_file (module_dwarf, srcfile, lineno, 0, @@ -2349,6 +2363,8 @@ base_query::get_number_param(map const & params, } +enum line_t { ABSOLUTE, RELATIVE }; + struct dwarf_query : public base_query { dwarf_query(systemtap_session & sess, @@ -2415,6 +2431,7 @@ struct dwarf_query : public base_query function_spec_type spec_type; string function; string file; + line_t line_type; int line; bool query_done; // Found exact match @@ -2886,7 +2903,7 @@ dwarf_query::parse_function_spec(string & spec) while (i != e && *i != '@') { - if (*i == ':') + if (*i == ':' || *i == '+') goto bad; function += *i++; } @@ -2903,8 +2920,12 @@ dwarf_query::parse_function_spec(string & spec) if (i++ == e) goto bad; - while (i != e && *i != ':') + while (i != e && *i != ':' && *i != '+') file += *i++; + if (*i == ':') + line_type = ABSOLUTE; + else if (*i == '+') + line_type = RELATIVE; if (i == e) { @@ -3508,7 +3529,7 @@ query_cu (Dwarf_Die * cudie, void * arg) for (set::const_iterator i = q->filtered_srcfiles.begin(); i != q->filtered_srcfiles.end(); ++i) q->dw.iterate_over_srcfile_lines (*i, q->line, q->has_statement_str, - query_srcfile_line, q); + q->line_type, query_srcfile_line, q); } else {