]> sourceware.org Git - systemtap.git/commitdiff
Add .statement("function@file.c+N")
authorStan Cox <scox@redhat.com>
Fri, 6 Jun 2008 18:35:29 +0000 (14:35 -0400)
committerStan Cox <scox@redhat.com>
Fri, 6 Jun 2008 18:35:29 +0000 (14:35 -0400)
ChangeLog
tapsets.cxx

index dc3202c99c6d68283893aa6a6f234dcf62d0b1c0..14adb3708eaa02eec3d685444990aa9e515298af 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+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.
index ef7015649a098efbef4b3f2b2b6e17450abd0c05..527272fac7a4047c309b6eddeeb6cb59dcdeb196 100644 (file)
@@ -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<string, literal *> 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<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
            {
This page took 0.046399 seconds and 5 git commands to generate.