This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
corrections to recent profile-arcs change
- From: Richard Henderson <rth at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 10 May 2002 17:35:17 -0700
- Subject: corrections to recent profile-arcs change
The patch failed on all 64-bit parts because some integral
constants had type "int" instead of "long" as expected.
I replaced "nwords" with a plain sizeof, as frankly it makes
more sense than sizeof(bb)/sizeof(int).
We were saving profile data for the profile constructor.
Tested on alphaev6-linux.
r~
* final.c (end_final): Tidy whitespace. Don't honor flag_pack_struct.
Convert integers constants as needed. Replace "nwords" field with
"sizeof_bb".
(final): Save profile data if cfun->arc_profile, not profile_arc_flag.
* function.h: Fix typo in comment.
* libgcc2.c (struct bb): Replace "nwords" with "sizeof_bb".
Index: final.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/final.c,v
retrieving revision 1.248
diff -c -p -d -r1.248 final.c
*** final.c 9 May 2002 12:54:15 -0000 1.248
--- final.c 11 May 2002 00:26:57 -0000
*************** end_final (filename)
*** 258,271 ****
tree string_type, string_cst;
tree structure_decl, structure_value, structure_pointer_type;
tree field_decl, decl_chain, value_chain;
! tree nwords_field_value, domain_type;
/* Build types. */
string_type = build_pointer_type (char_type_node);
/* Libgcc2 bb structure. */
structure_decl = make_node (RECORD_TYPE);
- TYPE_PACKED (structure_decl) = flag_pack_struct;
structure_pointer_type = build_pointer_type (structure_decl);
/* Output the main header, of 7 words:
--- 258,270 ----
tree string_type, string_cst;
tree structure_decl, structure_value, structure_pointer_type;
tree field_decl, decl_chain, value_chain;
! tree sizeof_field_value, domain_type;
/* Build types. */
string_type = build_pointer_type (char_type_node);
/* Libgcc2 bb structure. */
structure_decl = make_node (RECORD_TYPE);
structure_pointer_type = build_pointer_type (structure_decl);
/* Output the main header, of 7 words:
*************** end_final (filename)
*** 284,379 ****
decl_chain =
build_decl (FIELD_DECL, get_identifier ("zero_word"),
long_integer_type_node);
! value_chain = build_tree_list (decl_chain, integer_zero_node);
/* Address of filename. */
{
! char *cwd = getpwd ();
! int da_filename_len = strlen (filename) + strlen (cwd) + 4 + 1;
! char *da_filename = (char *) alloca (da_filename_len);
strcpy (da_filename, cwd);
strcat (da_filename, "/");
strcat (da_filename, filename);
strip_off_ending (da_filename, da_filename_len - 3);
strcat (da_filename, ".da");
! field_decl =
! build_decl (FIELD_DECL, get_identifier ("filename"), string_type);
! string_cst = build_string (strlen (da_filename) + 1, da_filename);
! domain_type = build_index_type (build_int_2 (strlen (da_filename) + 1,
! 0));
! TREE_TYPE (string_cst) =
! build_array_type (char_type_node, domain_type);
value_chain = tree_cons (field_decl,
build1 (ADDR_EXPR, string_type, string_cst),
value_chain);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
}
/* Table of counts. */
{
tree gcov_type_type = make_unsigned_type (GCOV_TYPE_SIZE);
tree gcov_type_pointer_type = build_pointer_type (gcov_type_type);
! tree gcov_type_array_type, gcov_type_array_pointer_type;
! tree domain_tree = build_index_type (build_int_2
! (profile_info.
! count_instrumented_edges - 1,
! 0));
tree counts_table;
! gcov_type_array_type = build_array_type (gcov_type_type, domain_tree);
! gcov_type_array_pointer_type =
! build_pointer_type (gcov_type_array_type);
/* No values. */
! counts_table =
! build (VAR_DECL, gcov_type_array_type, NULL_TREE, NULL_TREE);
TREE_STATIC (counts_table) = 1;
ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 2);
DECL_NAME (counts_table) = get_identifier (name);
assemble_variable (counts_table, 0, 0, 0);
- field_decl =
- build_decl (FIELD_DECL, get_identifier ("counts"),
- gcov_type_pointer_type);
value_chain = tree_cons (field_decl,
build1 (ADDR_EXPR,
gcov_type_array_pointer_type,
counts_table), value_chain);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
}
/* Count of the # of instrumented arcs. */
! field_decl =
! build_decl (FIELD_DECL, get_identifier ("ncounts"),
! long_integer_type_node);
value_chain = tree_cons (field_decl,
convert (long_integer_type_node,
build_int_2 (profile_info.
count_instrumented_edges,
0)), value_chain);
TREE_CHAIN (field_decl) = decl_chain;
decl_chain = field_decl;
- /* Pointer to the next bb. */
- field_decl =
- build_decl (FIELD_DECL, get_identifier ("next"),
- structure_pointer_type);
value_chain = tree_cons (field_decl, null_pointer_node, value_chain);
- TREE_CHAIN (field_decl) = decl_chain;
- decl_chain = field_decl;
! /* Number of words. We'll set this after entire structure is laid out. */
! field_decl =
! build_decl (FIELD_DECL, get_identifier ("nwords"),
! long_integer_type_node);
! value_chain = nwords_field_value =
! tree_cons (field_decl, NULL, value_chain);
TREE_CHAIN (field_decl) = decl_chain;
decl_chain = field_decl;
/* struct bb_function []. */
{
struct function_list *item;
--- 283,385 ----
decl_chain =
build_decl (FIELD_DECL, get_identifier ("zero_word"),
long_integer_type_node);
! value_chain = build_tree_list (decl_chain,
! convert (long_integer_type_node,
! integer_zero_node));
/* Address of filename. */
{
! char *cwd, *da_filename;
! int da_filename_len;
!
! field_decl =
! build_decl (FIELD_DECL, get_identifier ("filename"), string_type);
! TREE_CHAIN (field_decl) = decl_chain;
! decl_chain = field_decl;
+ cwd = getpwd ();
+ da_filename_len = strlen (filename) + strlen (cwd) + 4 + 1;
+ da_filename = (char *) alloca (da_filename_len);
strcpy (da_filename, cwd);
strcat (da_filename, "/");
strcat (da_filename, filename);
strip_off_ending (da_filename, da_filename_len - 3);
strcat (da_filename, ".da");
! da_filename_len = strlen (da_filename);
! string_cst = build_string (da_filename_len + 1, da_filename);
! domain_type = build_index_type (build_int_2 (da_filename_len, 0));
! TREE_TYPE (string_cst)
! = build_array_type (char_type_node, domain_type);
value_chain = tree_cons (field_decl,
build1 (ADDR_EXPR, string_type, string_cst),
value_chain);
}
/* Table of counts. */
{
tree gcov_type_type = make_unsigned_type (GCOV_TYPE_SIZE);
tree gcov_type_pointer_type = build_pointer_type (gcov_type_type);
! tree domain_tree
! = build_index_type (build_int_2 (profile_info.
! count_instrumented_edges - 1, 0));
! tree gcov_type_array_type
! = build_array_type (gcov_type_type, domain_tree);
! tree gcov_type_array_pointer_type
! = build_pointer_type (gcov_type_array_type);
tree counts_table;
! field_decl =
! build_decl (FIELD_DECL, get_identifier ("counts"),
! gcov_type_pointer_type);
! TREE_CHAIN (field_decl) = decl_chain;
! decl_chain = field_decl;
/* No values. */
! counts_table
! = build (VAR_DECL, gcov_type_array_type, NULL_TREE, NULL_TREE);
TREE_STATIC (counts_table) = 1;
ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 2);
DECL_NAME (counts_table) = get_identifier (name);
assemble_variable (counts_table, 0, 0, 0);
value_chain = tree_cons (field_decl,
build1 (ADDR_EXPR,
gcov_type_array_pointer_type,
counts_table), value_chain);
}
/* Count of the # of instrumented arcs. */
! field_decl
! = build_decl (FIELD_DECL, get_identifier ("ncounts"),
! long_integer_type_node);
! TREE_CHAIN (field_decl) = decl_chain;
! decl_chain = field_decl;
!
value_chain = tree_cons (field_decl,
convert (long_integer_type_node,
build_int_2 (profile_info.
count_instrumented_edges,
0)), value_chain);
+ /* Pointer to the next bb. */
+ field_decl
+ = build_decl (FIELD_DECL, get_identifier ("next"),
+ structure_pointer_type);
TREE_CHAIN (field_decl) = decl_chain;
decl_chain = field_decl;
value_chain = tree_cons (field_decl, null_pointer_node, value_chain);
! /* sizeof(struct bb). We'll set this after entire structure
! is laid out. */
! field_decl
! = build_decl (FIELD_DECL, get_identifier ("sizeof_bb"),
! long_integer_type_node);
TREE_CHAIN (field_decl) = decl_chain;
decl_chain = field_decl;
+ sizeof_field_value = tree_cons (field_decl, NULL, value_chain);
+ value_chain = sizeof_field_value;
+
/* struct bb_function []. */
{
struct function_list *item;
*************** end_final (filename)
*** 388,403 ****
tree field_value, field_value_chain;
bb_fn_struct_type = make_node (RECORD_TYPE);
- TYPE_PACKED (bb_fn_struct_type) = flag_pack_struct;
checksum_field = build_decl (FIELD_DECL, get_identifier ("checksum"),
long_integer_type_node);
! arc_count_field =
! build_decl (FIELD_DECL, get_identifier ("arc_count"),
! integer_type_node);
TREE_CHAIN (checksum_field) = arc_count_field;
! name_field =
! build_decl (FIELD_DECL, get_identifier ("name"), string_type);
TREE_CHAIN (arc_count_field) = name_field;
TYPE_FIELDS (bb_fn_struct_type) = checksum_field;
--- 394,410 ----
tree field_value, field_value_chain;
bb_fn_struct_type = make_node (RECORD_TYPE);
checksum_field = build_decl (FIELD_DECL, get_identifier ("checksum"),
long_integer_type_node);
!
! arc_count_field
! = build_decl (FIELD_DECL, get_identifier ("arc_count"),
! integer_type_node);
TREE_CHAIN (checksum_field) = arc_count_field;
!
! name_field
! = build_decl (FIELD_DECL, get_identifier ("name"), string_type);
TREE_CHAIN (arc_count_field) = name_field;
TYPE_FIELDS (bb_fn_struct_type) = checksum_field;
*************** end_final (filename)
*** 411,420 ****
domain = build_index_type (build_int_2 (num_nodes, 0));
bb_fn_struct_pointer_type = build_pointer_type (bb_fn_struct_type);
! bb_fn_struct_array_type = build_array_type (bb_fn_struct_type,
! domain);
! bb_fn_struct_array_pointer_type =
! build_pointer_type (bb_fn_struct_array_type);
layout_type (bb_fn_struct_type);
layout_type (bb_fn_struct_pointer_type);
--- 418,427 ----
domain = build_index_type (build_int_2 (num_nodes, 0));
bb_fn_struct_pointer_type = build_pointer_type (bb_fn_struct_type);
! bb_fn_struct_array_type
! = build_array_type (bb_fn_struct_type, domain);
! bb_fn_struct_array_pointer_type
! = build_pointer_type (bb_fn_struct_array_type);
layout_type (bb_fn_struct_type);
layout_type (bb_fn_struct_pointer_type);
*************** end_final (filename)
*** 423,460 ****
for (item = functions_head; item != 0; item = item->next)
{
/* create constructor for structure. */
! field_value_chain = build_tree_list (checksum_field,
! convert
! (long_integer_type_node,
! build_int_2 (item->
! cfg_checksum,
! 0)));
! field_value_chain =
! tree_cons (arc_count_field,
! convert (integer_type_node,
! build_int_2 (item->count_edges, 0)),
! field_value_chain);
! string_cst = build_string (strlen (item->name) + 1, item->name);
! domain_type = build_index_type (build_int_2 (strlen (item->name) +
! 1, 0));
! TREE_TYPE (string_cst) = build_array_type (char_type_node,
! domain_type);
field_value_chain = tree_cons (name_field,
build1 (ADDR_EXPR, string_type,
string_cst),
field_value_chain);
/* Add to chain. */
!
! array_value_chain = tree_cons (NULL_TREE,
! build (CONSTRUCTOR,
! bb_fn_struct_type,
! NULL_TREE,
! nreverse
! (field_value_chain)),
! array_value_chain);
}
/* Add terminator. */
--- 430,464 ----
for (item = functions_head; item != 0; item = item->next)
{
+ size_t name_len;
+
/* create constructor for structure. */
! field_value_chain
! = build_tree_list (checksum_field,
! convert (long_integer_type_node,
! build_int_2 (item->cfg_checksum, 0)));
! field_value_chain
! = tree_cons (arc_count_field,
! convert (integer_type_node,
! build_int_2 (item->count_edges, 0)),
! field_value_chain);
! name_len = strlen (item->name);
! string_cst = build_string (name_len + 1, item->name);
! domain_type = build_index_type (build_int_2 (name_len, 0));
! TREE_TYPE (string_cst)
! = build_array_type (char_type_node, domain_type);
field_value_chain = tree_cons (name_field,
build1 (ADDR_EXPR, string_type,
string_cst),
field_value_chain);
/* Add to chain. */
! array_value_chain
! = tree_cons (NULL_TREE, build (CONSTRUCTOR,
! bb_fn_struct_type, NULL_TREE,
! nreverse (field_value_chain)),
! array_value_chain);
}
/* Add terminator. */
*************** end_final (filename)
*** 469,478 ****
/* Create constructor for array. */
!
! field_decl =
! build_decl (FIELD_DECL, get_identifier ("function_infos"),
! bb_fn_struct_pointer_type);
value_chain = tree_cons (field_decl,
build1 (ADDR_EXPR,
bb_fn_struct_array_pointer_type,
--- 473,481 ----
/* Create constructor for array. */
! field_decl
! = build_decl (FIELD_DECL, get_identifier ("function_infos"),
! bb_fn_struct_pointer_type);
value_chain = tree_cons (field_decl,
build1 (ADDR_EXPR,
bb_fn_struct_array_pointer_type,
*************** end_final (filename)
*** 486,522 ****
decl_chain = field_decl;
}
-
/* Finish structure. */
TYPE_FIELDS (structure_decl) = nreverse (decl_chain);
layout_type (structure_decl);
! structure_value =
! build (VAR_DECL, structure_decl, NULL_TREE, NULL_TREE);
! DECL_INITIAL (structure_value) =
! build (CONSTRUCTOR, structure_decl, NULL_TREE,
! nreverse (value_chain));
TREE_STATIC (structure_value) = 1;
ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 0);
DECL_NAME (structure_value) = get_identifier (name);
! /* Set number of words in this structure. */
! TREE_VALUE (nwords_field_value) =
! build_int_2 (TREE_INT_CST_LOW (TYPE_SIZE_UNIT (structure_decl)) /
! (INT_TYPE_SIZE / BITS_PER_UNIT), 0);
/* Build structure. */
assemble_variable (structure_value, 0, 0, 0);
-
- /* Offset to table of arc counters for thread-safe profiling. */
- {
- tree table_offset_var = make_node (VAR_DECL);
- TREE_TYPE (table_offset_var) = build_pointer_type (integer_type_node);
- DECL_INITIAL (table_offset_var) = integer_zero_node;
- DECL_NAME (table_offset_var) = get_identifier (".LPBF0");
- TREE_STATIC (table_offset_var) = 1;
- assemble_variable (table_offset_var, 0, 0, 0);
- }
}
}
--- 489,514 ----
decl_chain = field_decl;
}
/* Finish structure. */
TYPE_FIELDS (structure_decl) = nreverse (decl_chain);
layout_type (structure_decl);
! structure_value
! = build (VAR_DECL, structure_decl, NULL_TREE, NULL_TREE);
! DECL_INITIAL (structure_value)
! = build (CONSTRUCTOR, structure_decl, NULL_TREE,
! nreverse (value_chain));
TREE_STATIC (structure_value) = 1;
ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 0);
DECL_NAME (structure_value) = get_identifier (name);
! /* Size of this structure. */
! TREE_VALUE (sizeof_field_value)
! = convert (long_integer_type_node,
! build_int_2 (int_size_in_bytes (structure_decl), 0));
/* Build structure. */
assemble_variable (structure_value, 0, 0, 0);
}
}
*************** final (first, file, optimize, prescan)
*** 1931,1952 ****
}
/* Store function names for edge-profiling. */
! if (profile_arc_flag)
! {
! struct function_list *new_item = xmalloc (sizeof (struct function_list));
! /* Add function to linked list. */
! new_item->next = 0;
! *functions_tail = new_item;
! functions_tail = &new_item->next;
! /* Set values. */
! new_item->cfg_checksum = profile_info.current_function_cfg_checksum;
! new_item->count_edges = profile_info.count_edges_instrumented_now;
! new_item->name = xstrdup (current_function_name);
!
! }
free (line_note_exists);
line_note_exists = NULL;
--- 1923,1942 ----
}
/* Store function names for edge-profiling. */
+ /* ??? Probably should re-use the existing struct function. */
! if (cfun->arc_profile)
! {
! struct function_list *new_item = xmalloc (sizeof (struct function_list));
! *functions_tail = new_item;
! functions_tail = &new_item->next;
! new_item->next = 0;
! new_item->name = xstrdup (current_function_name);
! new_item->cfg_checksum = profile_info.current_function_cfg_checksum;
! new_item->count_edges = profile_info.count_edges_instrumented_now;
! }
free (line_note_exists);
line_note_exists = NULL;
Index: function.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/function.h,v
retrieving revision 1.79
diff -c -p -d -r1.79 function.h
*** function.h 9 May 2002 12:54:16 -0000 1.79
--- function.h 11 May 2002 00:26:57 -0000
*************** struct function
*** 437,443 ****
generated. */
unsigned int instrument_entry_exit : 1;
! /* Nonzero if no profiling should be done for the function. */
unsigned int arc_profile : 1;
/* Nonzero if profiling code should be generated. */
--- 437,443 ----
generated. */
unsigned int instrument_entry_exit : 1;
! /* Nonzero if arc profiling should be done for the function. */
unsigned int arc_profile : 1;
/* Nonzero if profiling code should be generated. */
Index: libgcc2.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/libgcc2.c,v
retrieving revision 1.138
diff -c -p -d -r1.138 libgcc2.c
*** libgcc2.c 9 May 2002 12:54:17 -0000 1.138
--- libgcc2.c 11 May 2002 00:26:57 -0000
*************** struct bb
*** 1254,1260 ****
struct bb *next;
/* Older GCC's did not emit these fields. */
! long nwords;
struct bb_function_info *function_infos;
};
--- 1254,1260 ----
struct bb *next;
/* Older GCC's did not emit these fields. */
! long sizeof_bb;
struct bb_function_info *function_infos;
};