On Wed, May 4, 2011 at 7:38 PM, Richard Guenther
<richard.guent...@gmail.com> wrote:
> On Wed, May 4, 2011 at 6:16 AM, Matt Davis <mattdav...@gmail.com> wrote:
>> I am writing a gcc plugin and am trying to detect if a value assigned by a
>> function call, is a global variable or not.  Unfortunately, all calls to
>> 'is_global_var' with a DECL type are returning false.
>>
>> My pass executes after alias analysis, and ipa analysis.  The
>> cfun->gimple_df->ipa_pta is set to true, so I know the pta analysis should 
>> have
>> resolved global information.
>
> is_global_var is all you need, no need for PTA analysis (which doesn't
> change this but simply uses is_global_var as well).

Thanks for the clarification.

>> Plugin code:
>>    if (is_gimple_call(stmt))
>>    {
>>        gimple_debug_bb(stmt);
>>        tree lhs = gimple_call_lhs(stmt);
>>        if (lhs && is_global_var(SSA_NAME_VAR(lhs)))
>>          printf("Global detected\n");
>
> That will only reliably work if the global is not of is_gimple_reg_type (),
> otherwise the call will store to an automatic temporary and the store
> to the global will happen in a separate statement.
>
>>    }
>>
>>
>> Source code (in Go):
>>    package main
>>
>>    type T struct {id int}
>>    var myglobal *T;
>>
>>    func fn() *T {
>>        myglobal = new(T); // Should be detected as global
>>        return myglobal;
>>    }
>>
>>    func main() {
>>        t := fn();
>>    }
>>
>>
>> Basic Block dump as my plugin code executes for function 'fn':
>>    <bb 2>:
>>    # .MEM_4 = VDEF <.MEM_3(D)>
>>    main.myglobal.13_1 = __go_new_nopointers (4);
>
> assigns to a temporary
>
>>    # .MEM_5 = VDEF <.MEM_4>
>>    main.myglobal = main.myglobal.13_1;
>
> and here is the store
>
> You can try looking up the store if the LHS of the call is an SSA name
> by looking at its immediate uses, but of course for
>
> int glob;
>
> foo()
> {
>  int i = call(); // not global
>  glob = i;
> }
>
> this would also find the store to glob.
>
> So I'm not sure you can recover all information up to source level
> precision.

Thanks very much for the clarification and information.

-Matt

Reply via email to