TRANSLATION_UNIT_DECL breaks bootstrap

Daniel Berlin dberlin@dberlin.org
Sun Jul 13 06:58:00 GMT 2003


On Sunday, July 13, 2003, at 12:11 AM, Geoff Keating wrote:

> Daniel Berlin <dberlin@dberlin.org> writes:
>
>>>
>>>> whereas the "true" globals are clobbered on any call anywhere.
>>>> To do this, we need to distinguish between those variables local to 
>>>> a
>>>> file, and those that aren't.
>>>> HAS_FILE_SCOPE_P would do this.
>>>
>>> This all seems like it needs to be a langhook.
>>
>> No, we aren't doing this on language specific trees, no langhook
>> should be necessary or is wanted.
>
> You're making assumptions about what the language allows users to do
> or not do, and there's no reason that the language should have any
> particular restriction.

Once again:
We don't deal with language specific trees, or a language specific IR.
Thus, whatever the heck the language wants to do is fine by me, i just 
don't see it at the level we work at.
I shouldn't need to query the language at this level, since we never 
see language-specific constructs.

>
>>>  How does this work in
>>> C++, to handle (for instance) private static variables in classes?
>>
>> It works just fine.
>
> So you can tell that the variable can be changed only by methods of
> that class?
Assuming we did interprocedural analysis on these methods (we only do 
interprocedural analysis on calls to static functions), yes, we could 
theoretically determine this.
Though it would be a bit of work to extract the information.

You've seemed to miss the point of points-to analysis.
It's not to determine what variables are accessible from where, it's to 
determine what variables point to which other variables (by point to, 
we mean that given a pointer, what variables could be accessed by 
dereferencing it, by load or by store).
These are different tasks.

Points-to analysis produces points-to sets, given a function (or 
functions).
This is a list of variables a pointer variable may point to (be they 
pointer variables or non-pointer variables). Not a list of class 
members, or anything like that.
In other words, in the following function, it can tell you:
What possible variables *a = 5 could change.
What possible variables e = *a could reference.
etc

int main(void)
{
	int *a;
	int *b;
	int *c;
	int d;
	int e;
	b = &d;
	a = b;
	c = &e;
	b = c;
}
In this particular case, we end up with the sets:
b :={d,e}(2)
d :={}(0)
a :={d,e}(2)
c :={e}(1)
e :={}(0)
Meaning that *a and *b could really be d or e, *c could really be e.

I'm not going to get into the whole description of how function calls 
and fields and global variables whatnot are handled in intra- or 
inter-procedural points-to analysis, as this is detailed quite well in 
the billion and a half papers on various forms of points-to analysis 
one can find.  Suffice to say, you can do it in non-language specific 
ways at the cost of some accuracy, which is what i've done.

> What do you do with the information?
>
Use it to optimize better in tree-ssa.

>>>   Do
>>> you look at DECL_CONTEXT for that?
>>
>> Right now, we aren't field based (IE accesses to a field of a variable
>> are globbed to the entire variable), to avoid dealing with this.
>
> That can't be right.  You mean that if someone writes
>>
> struct foo {
>   static int x;
>   int y;
> };
>
> {
>   foo a, b;
>   b.x = 3;
>   a.x = 2;
>   printf ("%d\n", b.x);
> }
>
> you associate the 'a.x' with 'a' and then assume it doesn't change
> 'b.x', and print 3 instead of 2?

Errr, a and b don't points to anything here, there aren't any pointers 
in this function.  I was referring to globbing pointer to structure 
field accesses of a variable together for the purposes of points-to, 
which is a well-known and well tested method, but loses accuracy, 
because we give a possible superset of the variables that could 
actually be accessed.
Here we would say that "b" and "a" point-to no other variable, which is 
correct.
I urge you to read up on the point of points-to analysis, and how it 
generally works.


>



More information about the Gcc mailing list