+2008-06-06 Stan Cox <scox@redhat.com>
+
+ * 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 <dsmith@redhat.com>
* NEWS: Updated utrace probes descriptions.
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)
{
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,
}
+enum line_t { ABSOLUTE, RELATIVE };
+
struct dwarf_query : public base_query
{
dwarf_query(systemtap_session & sess,
function_spec_type spec_type;
string function;
string file;
+ line_t line_type;
int line;
bool query_done; // Found exact match
while (i != e && *i != '@')
{
- if (*i == ':')
+ if (*i == ':' || *i == '+')
goto bad;
function += *i++;
}
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)
{
for (set<char const *>::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
{