OSDN Git Service

2004-09-07 Frank Ch. Eigler <fche@redhat.com>
authorfche <fche@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Sep 2004 01:34:03 +0000 (01:34 +0000)
committerfche <fche@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Sep 2004 01:34:03 +0000 (01:34 +0000)
* builtins.c (std_gimplify_va_arg_expr): Mark INDIRECT_REF nodes
generated from standard va_arg expansion.
* tree-mudflap.c (mx_xform_derefs_1): Omit instrumentation from
marked nodes.
(mf_varname_tree, mf_file_function_line_tree): Add some support
for column numbers if compiled with USE_MAPPED_LOCATION.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87170 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/builtins.c
gcc/tree-mudflap.c

index 2935df7..6e0408f 100644 (file)
@@ -1,3 +1,12 @@
+2004-09-07  Frank Ch. Eigler  <fche@redhat.com>
+
+       * builtins.c (std_gimplify_va_arg_expr): Mark INDIRECT_REF nodes
+       generated from standard va_arg expansion.
+       * tree-mudflap.c (mx_xform_derefs_1): Omit instrumentation from
+       marked nodes.
+       (mf_varname_tree, mf_file_function_line_tree): Add some support
+       for column numbers if compiled with USE_MAPPED_LOCATION.
+
 2004-09-07  Ziemowit Laski  <zlaski@apple.com>
 
        * c-decl.c (groktypename_in_parm_context): Remove function.
index 5096522..6d4cd8f 100644 (file)
@@ -4349,9 +4349,17 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
   addr = fold_convert (build_pointer_type (type), addr);
 
   if (indirect)
-    addr = build_fold_indirect_ref (addr);
+    {
+      addr = build_fold_indirect_ref (addr);
+      if (flag_mudflap) /* Don't instrument va_arg INDIRECT_REF.  */
+        mf_mark (addr);
+    }
+
+  addr = build_fold_indirect_ref (addr);
+  if (flag_mudflap) /* Don't instrument va_arg INDIRECT_REF.  */
+    mf_mark (addr);
 
-  return build_fold_indirect_ref (addr);
+  return addr;
 }
 
 /* Return a dummy expression of type TYPE in order to keep going after an
index a03ae87..55263e8 100644 (file)
@@ -112,12 +112,15 @@ mf_varname_tree (tree decl)
     }
   pp_clear_output_area (buf);
 
-  /* Add FILENAME[:LINENUMBER].  */
+  /* Add FILENAME[:LINENUMBER[:COLUMNNUMBER]].  */
   {
     expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (decl));
     const char *sourcefile;
     unsigned sourceline = xloc.line;
-
+    unsigned sourcecolumn = 0;
+#ifdef USE_MAPPED_LOCATION
+    sourcecolumn = xloc.column;
+#endif
     sourcefile = xloc.file;
     if (sourcefile == NULL && current_function_decl != NULL_TREE)
       sourcefile = DECL_SOURCE_FILE (current_function_decl);
@@ -130,12 +133,18 @@ mf_varname_tree (tree decl)
       {
         pp_string (buf, ":");
         pp_decimal_int (buf, sourceline);
+
+        if (sourcecolumn != 0)
+          {
+            pp_string (buf, ":");
+            pp_decimal_int (buf, sourcecolumn);
+          }
       }
   }
 
   if (current_function_decl != NULL_TREE)
     {
-      /* Add (FUNCTION): */
+      /* Add (FUNCTION) */
       pp_string (buf, " (");
       {
         const char *funcname = NULL;
@@ -189,11 +198,11 @@ mf_file_function_line_tree (location_t location)
 {
   expanded_location xloc = expand_location (location);
   const char *file = NULL, *colon, *line, *op, *name, *cp;
-  char linebuf[18];
+  char linecolbuf[30]; /* Enough for two decimal numbers plus a colon.  */
   char *string;
   tree result;
 
-  /* Add FILENAME[:LINENUMBER].  */
+  /* Add FILENAME[:LINENUMBER[:COLUMNNUMBER]].  */
   file = xloc.file;
   if (file == NULL && current_function_decl != NULL_TREE)
     file = DECL_SOURCE_FILE (current_function_decl);
@@ -202,9 +211,14 @@ mf_file_function_line_tree (location_t location)
 
   if (xloc.line > 0)
     {
-      sprintf (linebuf, "%d", xloc.line);
+#ifdef USE_MAPPED_LOCATION
+      if (xloc.column > 0)
+        sprintf (linecolbuf, "%d:%d", xloc.line, xloc.column);
+      else
+#endif
+        sprintf (linecolbuf, "%d", xloc.line);
       colon = ":";
-      line = linebuf;
+      line = linecolbuf;
     }
   else
     colon = line = "";
@@ -676,6 +690,10 @@ mf_xform_derefs_1 (block_stmt_iterator *iter, tree *tp,
   if (dirflag == integer_zero_node && flag_mudflap_ignore_reads)
     return;
 
+  /* Don't instrument marked nodes.  */
+  if (mf_marked_p (*tp))
+    return;
+
   t = *tp;
   type = TREE_TYPE (t);
   size = TYPE_SIZE_UNIT (type);