[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