Ping3! [PATCH, revised]: Track uninitialized variables
Manuel López-Ibáñez
lopezibanez@gmail.com
Fri Jun 1 17:13:00 GMT 2007
Hi Caroline,
I think that giving a link to the original mail in the archives will
increase the chances of getting a reviewer. And as a rule of thumb,
anything that makes easier the life of a reviewer will increase the
chances of getting a patch reviewed.
Cheers,
Manuel.
On 01/06/07, Caroline Tice <ctice@apple.com> wrote:
>
> Still waiting to be reviewed...
>
> On May 25, 2007, at 1:53 PM, Caroline Tice wrote:
>
> >
> > On May 18, 2007, at 12:48 PM, Caroline Tice wrote:
> >
> >> As a point of interest: The GDB side of this patch has been
> >> accepted and
> >> committed to FSF GDB.
> >>
> >> -- Caroline
> >>
> >> On May 11, 2007, at 12:13 PM, Caroline Tice wrote:
> >>
> >>> Here is a revised version of my patch for tracking uninitialized
> >>> variables (see description in original posting copied below). I
> >>> added
> >>> the comments Ian asked for, and I changed the way it is turned on/
> >>> off.
> >>> Instead of the macro in my previous patch, it is now controlled by a
> >>> command line option, -fvar-tracking-uninit, which turns on
> >>> var-tracking, just like -fvar-tracking, but also turns on the
> >>> uninitialized variable tracking. I added the same feasibility
> >>> checks to
> >>> it that are used for -fvar-tracking. I also turned it on by default
> >>> on darwin systems running 10.5 or later (when var-tracking is on).
> >>>
> >>> I tested this patch by bootstrapping it and running the dejagnu
> >>> testsuite without any regressions, on a ppc running apple-darwin, an
> >>> x86 running apple-darwin, and an x86 64 running 64-bit linux. I
> >>> also
> >>> ran it on a small test case containing uninitialized variables, to
> >>> verify that it turns on when the command line option is passed, or
> >>> when running on the correct version of darwin, and is off at all
> >>> other
> >>> times.
> >>>
> >>> Is this patch okay to commit to mainline?
> >>>
> >>> --Caroline Tice
> >>> ctice@apple.com
> >>>
> >>>
> >>> On May 1, 2007, at 5:02 PM, Caroline Tice wrote:
> >>>
> >>>>
> >>>> As part of some work I've been doing on improving debugging of
> >>>> optimized code, I have developed the following patch which, while
> >>>> tracking the locations of variables, also keeps track of whether
> >>>> the
> >>>> variables are initialized or not (it makes conservative assumptions
> >>>> where it can't be sure). For those places where it is sure the
> >>>> variables are unintialized, it adds an annotation to the
> >>>> var_location_note, which the dwarf writer later translates to a new
> >>>> DW_OP (an extension) that indicates a variable is uninitialized
> >>>> (DW_OP_GNU_uninit).
> >>>
> >>>> Since this work requires that GDB be able to read and do something
> >>>> reasonable with the new DW_OP, I have also created a GDB patch to
> >>>> deal
> >>>> with the new op, and to inform the user that a particular value is
> >>>> unintialized when the user asks to see it. As the two patches
> >>>> really
> >>>> go together, I am attaching both of them to this message. (I will
> >>>> also be sending the GDB patch to the gdb patches list).
> >>>
> >>>> Because using the new DW_OP is sensitive to whether or not the user
> >>>> has a version of GDB that can handle it, I have added a macro,
> >>>> TARGET_DWARF_UNINIT_VARS, which defaults to 0, and which controls
> >>>> whether the uninitialized variable tracking is done.
> >>>
> >>>> I have bootstrapped and run the dejagnu testsuite on this patch,
> >>>> with
> >>>> no regressions, on a ppc running apple-darwin, an x86 running
> >>>> apple-darwin, and an x86 64 running 64-bit linux.
> >>>
> >>>> Is this patch okay to commit to mainline?
> >>>> -- Caroline Tice
> >>>> ctice@apple.com
> >>>>
> >>>
> >>> 2007-05-11 Caroline Tice <ctice@apple.com>
> >>>
> >>> * toplev.c (process_options): Turn flag_var_tracking_uninit
> >>> off when
> >>> flag_var_tracking is explicitly turned off (i.e. when variable
> >>> tracking is not feasible); otherwise, turn flag_var_tracking
> >>> on when
> >>> flag_var_tracking_uninit is on.
> >>> * rtl.def (VAR_LOCATION): Add a new integer subfield to
> >>> VAR_LOCATION
> >>> note definitions, to allow recording of initialization status
> >>> in the
> >>> notes.
> >>> * dwarf2out.c (dwarf_stack_op_name): Add case for
> >>> DW_OP_GNU_uninit.
> >>> (add_var_loc_to_decl): Add comparison of
> >>> NOTE_VAR_LOCATION_STATUS to
> >>> determine if two note locations are equal.
> >>> (output_loc_list): Don't output list entries whose start &
> >>> end labels
> >>> are the same.
> >>> (reg_loc_descriptor): Add parameter for initialization
> >>> status; pass it
> >>> to other loc descriptor functions.
> >>> (one_reg_loc_descriptor): Add parameter for initialization
> >>> status;
> >>> check its value and add DW_OP_GNU_uninit to returned loc
> >>> descr if
> >>> appropriate.
> >>> (multiple_reg_loc_descriptor): Add parameter for initialization
> >>> status;
> >>> pass init status argument to other loc descriptor functions;
> >>> check
> >>> value of intialization parameter and add DW_OP_GNU_uninit to
> >>> returned
> >>> loc descr if appropriate.
> >>> (based_loc_descr): Add parameter for initialization status;
> >>> add new
> >>> variable for return value; check value of initialization
> >>> parameter and
> >>> add DW_OP_GNU_uninit to returned loc descr if appropriate.
> >>> (concatn_mem_loc_descriptor): Add parameter for
> >>> initialization status;
> >>> pass init status argument to other loc descriptor functions;
> >>> check
> >>> value of intialization parameter and add DW_OP_GNU_uninit to
> >>> returned
> >>> loc descr if appropriate.
> >>> (mem_loc_descriptor): Likewise.
> >>> (concat_loc_descriptor): Likewise.
> >>> (concatn_loc_descriptor): Likewise.
> >>> (loc_descriptor): Add parameter for initialization status;
> >>> pass it as
> >>> argument to other loc descriptor function calls.
> >>> (loc_descriptor_from_tree_1): Add appropriate initialization
> >>> status
> >>> to loc descriptor function calls.
> >>> (add_location_or_const_value_attribute): Get initialization
> >>> status
> >>> from VAR_LOCATION note; add initialization status to loc
> >>> descriptor
> >>> function calls.
> >>> * dwarf2.h (enum dwarf_location_atom): New op,
> >>> DW_OP_GNU_uninit.
> >>> * print-rtl.c (print_rtx): When printing a VAR_LOCATION note,
> >>> if
> >>> status is uninitialized, add "[uninint]" to output.
> >>> * common.opt (fvar-tracking-uninit): New option, similar to
> >>> fvar-tracking, to turn on tracking of uninitialized
> >>> variables; creates
> >>> a new global flag, flag_var_tracking_uninit.
> >>> * rtl.h (NOTE_VAR_LOCATION_STATUS): New macro for accessing
> >>> new field.
> >>> (enum var_init_status): New type, for var initialization
> >>> status field.
> >>> * var-tracking.c (struct location_chain_def): Two new fields,
> >>> init,
> >>> for initialization status, and set_src for the assignment
> >>> value expr.
> >>> (unshare_variable): New parameter for initialization status;
> >>> initialize new init and set_src fields.
> >>> (var_reg_set): New parameters for initialization status and
> >>> value;
> >>> pass them to set_variable_part.
> >>> (var_mem_set): Likewise.
> >>> (get_init_value): New function.
> >>> (var_reg_delete_and_set): New initialization status & value
> >>> parameters; add call to get_init_value if status is unknown;
> >>> pass new
> >>> parameters to clobber_variable_part and var_reg_set.
> >>> (var_mem_delete_and_set): Likewise.
> >>> (var_reg_delete): Pass null set_src value to
> >>> clobber_variable_part.
> >>> (var_mem_delete): Likewise.
> >>> (variable_union): Pass status to unshare_variable; initialize
> >>> new init
> >>> and set_src fields. If flag_var_tracking_uninit is not set,
> >>> force
> >>> status to initialized.
> >>> (add_stores): Store insn, rather than NEXT_INSN(insn), so it
> >>> can be
> >>> used later to get the set_src value.
> >>> (find_src_status): New function.
> >>> (find_src_set_src): New function.
> >>> (compute_bb_dataflow): Pass init status to calls to
> >>> var_reg_set,
> >>> var_mem_set, var_reg_delete_and_set and
> >>> var_mem_delete_and_set; for
> >>> MO_SET, get set_src value and pass it to
> >>> var_reg_delete_and_set
> >>> and var_mem_delete_and_set.
> >>> (dump_variable): Print out "[uninit]" if appropriate.
> >>> (set_variable_part): Add new initialization and set_src
> >>> parameters;
> >>> pass status to unshare_variable; set node->init and node-
> >>> >set_src
> >>> fields and modify slot in hash table appropriately; save the
> >>> init and
> >>> set_src values if appropriate and assign to the new node.
> >>> (clobber_variable_part): New set_src parameter; if two nodes
> >>> have
> >>> same variable and same location but different set_src
> >>> (assignment)
> >>> values, clobber old node.
> >>> (delete_variable_part): Pass init status to unshare_variable.
> >>> (emit_note_insn_var_location): Add initialized var; assign
> >>> var's init
> >>> status to new 'initialized'; pass new init status field to
> >>> calls to
> >>> gen_rtx_VAR_LOCATION. If flag_var_tracking_uninit is not
> >>> set, force
> >>> status to initialized.
> >>> (emit_notes_in_bb): Pass initialization status to calls to
> >>> var_reg_set, var_mem_set, var_reg_delete_and_set and
> >>> var_mem_delete_and_set; for MO_SET, get set_src value and
> >>> pass it to
> >>> var_reg_delete_and_set and var_mem_delete_and_set; call
> >>> emit_notes_for_changes on NEXT_INSN(insn) rather than on
> >>> insn, to
> >>> make up for change in add_stores.
> >>> (vt_add_function_parameters): Add status to calls to
> >>> set_variable_part.
> >>> * config/darwin.c (darwin_override_options): Turn on
> >>> uninitialized
> >>> tracking automatically, if var_tracking is on and the system is
> >>> 10.5 or higher.
> >>>
> >>>
> >>> <fsf-gcc-patch.v2.txt>
> >>
> >
>
>
More information about the Gcc-patches
mailing list