From 4882ad24284f8afbccb21d5015da11ff39d18de9 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Wed, 8 Sep 2004 01:34:03 +0000 Subject: [PATCH] builtins.c (std_gimplify_va_arg_expr): Mark INDIRECT_REF nodes generated from standard va_arg expansion. 2004-09-07 Frank Ch. Eigler * 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. From-SVN: r87170 --- gcc/ChangeLog | 9 +++++++++ gcc/builtins.c | 12 ++++++++++-- gcc/tree-mudflap.c | 32 +++++++++++++++++++++++++------- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2935df70922..6e0408f4656 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2004-09-07 Frank Ch. Eigler + + * 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 * c-decl.c (groktypename_in_parm_context): Remove function. diff --git a/gcc/builtins.c b/gcc/builtins.c index 50965228f91..6d4cd8fbbc1 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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 diff --git a/gcc/tree-mudflap.c b/gcc/tree-mudflap.c index a03ae879d28..55263e880d0 100644 --- a/gcc/tree-mudflap.c +++ b/gcc/tree-mudflap.c @@ -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); -- 2.30.2