This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, revised]: Track uninitialized variables
- From: Caroline Tice <ctice at apple dot com>
- To: "gcc-patches at gcc dot gnu dot org Patches" <gcc-patches at gcc dot gnu dot org>
- Cc: Caroline Tice <ctice at apple dot com>
- Date: Fri, 11 May 2007 12:13:18 -0700
- Subject: [PATCH, revised]: Track uninitialized variables
- References: <F7F88B21-DF14-478D-A8C3-35CC1EF3C6C2@apple.com>
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.
Attachment:
fsf-gcc-patch.v2.txt
Description: Text document