This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Ping2! [PATCH, revised]: Track uninitialized variables



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>



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]