final.c (end_final): Tidy whitespace.
* 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". From-SVN: r53374
This commit is contained in:
parent
dbfb1116b3
commit
2292e8fc45
@ -1,3 +1,12 @@
|
||||
2002-05-10 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* 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".
|
||||
|
||||
2002-05-10 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
* fold-const.c (build_range_check): Optimize (c>=1) && (c<=127)
|
||||
|
226
gcc/final.c
226
gcc/final.c
@ -258,14 +258,13 @@ end_final (filename)
|
||||
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;
|
||||
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);
|
||||
TYPE_PACKED (structure_decl) = flag_pack_struct;
|
||||
structure_pointer_type = build_pointer_type (structure_decl);
|
||||
|
||||
/* Output the main header, of 7 words:
|
||||
@ -284,96 +283,103 @@ end_final (filename)
|
||||
decl_chain =
|
||||
build_decl (FIELD_DECL, get_identifier ("zero_word"),
|
||||
long_integer_type_node);
|
||||
value_chain = build_tree_list (decl_chain, integer_zero_node);
|
||||
value_chain = build_tree_list (decl_chain,
|
||||
convert (long_integer_type_node,
|
||||
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);
|
||||
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");
|
||||
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);
|
||||
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);
|
||||
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 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;
|
||||
|
||||
gcov_type_array_type = build_array_type (gcov_type_type, domain_tree);
|
||||
gcov_type_array_pointer_type =
|
||||
build_pointer_type (gcov_type_array_type);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
field_decl
|
||||
= build_decl (FIELD_DECL, get_identifier ("next"),
|
||||
structure_pointer_type);
|
||||
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);
|
||||
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;
|
||||
@ -388,16 +394,17 @@ end_final (filename)
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
@ -411,10 +418,10 @@ end_final (filename)
|
||||
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);
|
||||
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);
|
||||
@ -423,38 +430,35 @@ end_final (filename)
|
||||
|
||||
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);
|
||||
size_t name_len;
|
||||
|
||||
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);
|
||||
/* 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);
|
||||
array_value_chain
|
||||
= tree_cons (NULL_TREE, build (CONSTRUCTOR,
|
||||
bb_fn_struct_type, NULL_TREE,
|
||||
nreverse (field_value_chain)),
|
||||
array_value_chain);
|
||||
}
|
||||
|
||||
/* Add terminator. */
|
||||
@ -469,10 +473,9 @@ end_final (filename)
|
||||
|
||||
|
||||
/* Create constructor for array. */
|
||||
|
||||
field_decl =
|
||||
build_decl (FIELD_DECL, get_identifier ("function_infos"),
|
||||
bb_fn_struct_pointer_type);
|
||||
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,
|
||||
@ -486,37 +489,26 @@ end_final (filename)
|
||||
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));
|
||||
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);
|
||||
/* 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);
|
||||
|
||||
/* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1931,22 +1923,20 @@ final (first, file, optimize, prescan)
|
||||
}
|
||||
|
||||
/* Store function names for edge-profiling. */
|
||||
/* ??? Probably should re-use the existing struct function. */
|
||||
|
||||
if (profile_arc_flag)
|
||||
{
|
||||
struct function_list *new_item = xmalloc (sizeof (struct function_list));
|
||||
if (cfun->arc_profile)
|
||||
{
|
||||
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;
|
||||
*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);
|
||||
|
||||
}
|
||||
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;
|
||||
|
@ -437,7 +437,7 @@ struct function
|
||||
generated. */
|
||||
unsigned int instrument_entry_exit : 1;
|
||||
|
||||
/* Nonzero if no profiling should be done for the function. */
|
||||
/* Nonzero if arc profiling should be done for the function. */
|
||||
unsigned int arc_profile : 1;
|
||||
|
||||
/* Nonzero if profiling code should be generated. */
|
||||
|
@ -1254,7 +1254,7 @@ struct bb
|
||||
struct bb *next;
|
||||
|
||||
/* Older GCC's did not emit these fields. */
|
||||
long nwords;
|
||||
long sizeof_bb;
|
||||
struct bb_function_info *function_infos;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user