[rfa] mudflap vs varargs

Frank Ch. Eigler fche@redhat.com
Tue Sep 7 21:50:00 GMT 2004


Hi -

The following patch fixes a bug in the mudflap instrumentation
that I discussed in <http://gcc.gnu.org/ml/gcc/2004-08/msg01343.html>.
Or rather, it works around the problem by pretending that va_arg()
uses don't need to be protected.  Can someone approve the few lines
of changes to builtins.c?  

The tree-mudflap.c hunks also include some bonus testing opportunities
for Per Bothner's nearly-done USE_MAPPED_LOCATION code.

- FChE


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.

Index: builtins.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/builtins.c,v
retrieving revision 1.377
diff -u -w -p -s -r1.377 builtins.c
--- builtins.c	7 Sep 2004 10:22:39 -0000	1.377
+++ builtins.c	7 Sep 2004 21:02:40 -0000
@@ -4349,9 +4349,17 @@ std_gimplify_va_arg_expr (tree valist, t
   addr = fold_convert (build_pointer_type (type), addr);
 
   if (indirect)
+    {
+      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: tree-mudflap.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-mudflap.c,v
retrieving revision 2.20
diff -u -w -p -s -r2.20 tree-mudflap.c
--- tree-mudflap.c	6 Sep 2004 10:08:01 -0000	2.20
+++ tree-mudflap.c	7 Sep 2004 21:02:40 -0000
@@ -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 l
 {
   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 l
 
   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 *
   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);



More information about the Gcc-patches mailing list