On Tue, Apr 6, 2010 at 5:50 AM, Ehren Metcalfe <ehre...@gmail.com> wrote: > (Apologies to Richard for sending this twice -- I forgot to cc the list) > >> At which point during the compilation does it not work? I suppose >> at the point where the qualified variants are already optimized away. > > I've had some difficulty walking the DECL_INITIAL from within a > separate pass but I've added this code to the execute function of > pass_ipa_function_and_variable_visibility which should be about as > close to pass_build_cgraph_edges as I can get. Also the > record_references callback in cgraphbuild.c exhibits the same > behavior.
It should work there. > I get the same results with 4.3.4 and a recent checkout. > > Is there a way to disable the optimizing away of qualified variants? > This seems to be a bug, especially with regard to > record_references_in_initializer and record_references in > cgraphbuild.c > > On Mon, Apr 5, 2010 at 10:20 AM, Richard Guenther > <richard.guent...@gmail.com> wrote: >> On Mon, Apr 5, 2010 at 3:50 PM, Ehren Metcalfe <ehre...@gmail.com> wrote: >>> Hello, >>> >>> I'm trying to develop a dead code finder using gcc and mozilla's >>> treehydra but I've hit a wall processing certain initializations of >>> global variables. >>> >>> In order to mark a function declaration whenever its address is held >>> in a file scope variable/table/structure I use code like this: >>> >>> ----- >>> >>> static tree find_funcs_callback(tree *tp, int *walk_subtrees, void *data) { >>> tree t = *tp; >>> >>> if (TREE_CODE(t) == FUNCTION_DECL) { >>> // dump function >>> } >>> >>> return NULL_TREE; >>> } >>> >>> static void find_funcs(tree decl) { >>> walk_tree(&decl, find_funcs_callback, NULL, NULL); >>> } >>> >>> // elsewhere >>> struct varpool_node *vnode; >>> FOR_EACH_STATIC_VARIABLE(vnode) >>> find_funcs(DECL_INITIAL(vnode->decl)); >>> >>> ----- >>> >>> Unfortunately this doesn't work for code like this: >>> >>> ----- >>> >>> int foo() { >>> return 0; >>> } >>> >>> typedef struct { >>> int (*p) (); >>> } Table; >>> >>> const /* or static, or const static */ Table t[] = { >>> { foo } >>> }; >>> >>> ----- >>> >>> If I remove the qualifiers from my table the initialization is >>> detected. Is this a bug or is there some other way of recovering the >>> FUNCTION_DECL? It doesn't need to be modular, I just have to find a >>> way to dump the function. >> >> At which point during the compilation does it not work? I suppose >> at the point where the qualified variants are already optimized away. >> >> Richard. >> >>> Thanks, >>> >>> Ehren >>> >> >