This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Processing global static (or const) variables


On Tue, Apr 6, 2010 at 5:50 AM, Ehren Metcalfe <ehren.m@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.guenther@gmail.com> wrote:
>> On Mon, Apr 5, 2010 at 3:50 PM, Ehren Metcalfe <ehren.m@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
>>>
>>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]