From 5d59b5e18a878c2201471e529c40f15d49905fc8 Mon Sep 17 00:00:00 2001 From: Lawrence Crowl Date: Wed, 31 Oct 2012 23:15:10 +0000 Subject: This patch implements generic type query and conversion functions, and applies them to the use of cgraph_node, varpool_node, and symtab_node. The functions are: bool is_a (pointer) Tests whether the pointer actually points to a more derived TYPE. TYPE *as_a (pointer) Converts pointer to a TYPE*. TYPE *dyn_cast (pointer) Converts pointer to TYPE* if and only if "is_a pointer". Otherwise, returns NULL. This function is essentially a checked down cast. These functions reduce compile time and increase type safety when treating a generic item as a more specific item. In essence, the code change is from if (symtab_function_p (node)) { struct cgraph_node *cnode = cgraph (node); .... } to if (cgraph_node *cnode = dyn_cast (node)) { .... } The necessary conditional test defines a variable that holds a known good pointer to the specific item and avoids subsequent conversion calls and the assertion checks that may come with them. When, the property test is embedded within a larger condition, the variable declaration gets pulled out of the condition. (This leaves some room for using the variable inappropriately.) if (symtab_variable_p (node) && varpool (node)->finalized) varpool_analyze_node (varpool (node)); becomes varpool_node *vnode = dyn_cast (node); if (vnode && vnode->finalized) varpool_analyze_node (vnode); Note that we have converted two sets of assertions in the calls to varpool into safe and efficient use of a variable. There are remaining calls to symtab_function_p and symtab_variable_p that do not involve a pointer to a more specific type. These have been converted to calls to a functions is_a and is_a . The original predicate functions have been removed. The cgraph.h header defined both a struct and a function with the name varpool_node. This name overloading can cause some unintuitive error messages when, as is common in C++, one omits the struct keyword when using the type. I have renamed the function to varpool_node_for_decl. Tested on x86_64. Index: gcc/ChangeLog 2012-10-31 Lawrence Crowl * is-a.h: New. (is_a (U*)): New. Test for is-a relationship. (as_a (U*)): New. Treat as a derived type. (dyn_cast (U*)): New. Conditionally cast based on is_a. * cgraph.h (varpool_node): Rename to varpool_node_for_decl. Adjust callers to match. (is_a_helper ::test (symtab_node_def *)): New. (is_a_helper ::test (symtab_node_def *)): New. (symtab_node_def::try_function): New. Change most calls to symtab_function_p with calls to dyn_cast (p). (symtab_node_def::try_variable): New. Change most calls to symtab_variable_p with calls to dyn_cast (p). (symtab_function_p): Remove. Change callers to use is_a (p) instead. (symtab_variable_p): Remove. Change callers to use is_a (p) instead. * cgraph.c (cgraph_node_for_asm): Remove redundant call to symtab_node_for_asm. * cgraphunit.c (symbol_finalized_and_needed): New. (symbol_finalized): New. (cgraph_analyze_functions): Split complicated conditionals out into above new functions. * Makefile.in (CGRAPH_H): Add is-a.h as used by cgraph.h. From-SVN: r193051 --- gcc/lto-streamer.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'gcc/lto-streamer.h') diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h index c9d13ae..b45def7 100644 --- a/gcc/lto-streamer.h +++ b/gcc/lto-streamer.h @@ -1115,7 +1115,7 @@ lsei_next_function_in_partition (lto_symtab_encoder_iterator *lsei) { lsei_next (lsei); while (!lsei_end_p (*lsei) - && (!symtab_function_p (lsei_node (*lsei)) + && (!is_a (lsei_node (*lsei)) || !lto_symtab_encoder_in_partition_p (lsei->encoder, lsei_node (*lsei)))) lsei_next (lsei); } @@ -1128,7 +1128,7 @@ lsei_start_function_in_partition (lto_symtab_encoder_t encoder) if (lsei_end_p (lsei)) return lsei; - if (!symtab_function_p (lsei_node (lsei)) + if (!is_a (lsei_node (lsei)) || !lto_symtab_encoder_in_partition_p (encoder, lsei_node (lsei))) lsei_next_function_in_partition (&lsei); @@ -1141,7 +1141,7 @@ lsei_next_variable_in_partition (lto_symtab_encoder_iterator *lsei) { lsei_next (lsei); while (!lsei_end_p (*lsei) - && (!symtab_variable_p (lsei_node (*lsei)) + && (!is_a (lsei_node (*lsei)) || !lto_symtab_encoder_in_partition_p (lsei->encoder, lsei_node (*lsei)))) lsei_next (lsei); } @@ -1154,7 +1154,7 @@ lsei_start_variable_in_partition (lto_symtab_encoder_t encoder) if (lsei_end_p (lsei)) return lsei; - if (!symtab_variable_p (lsei_node (lsei)) + if (!is_a (lsei_node (lsei)) || !lto_symtab_encoder_in_partition_p (encoder, lsei_node (lsei))) lsei_next_variable_in_partition (&lsei); -- cgit v1.1