Lazy allocation of DECL_ASSEMBLER_NAME
Mark Mitchell
mark@codesourcery.com
Mon Mar 1 20:11:00 GMT 2004
>Could you mention this in the documentation of DECL_ASSEMBLER_NAME in
>c-tree.texi?
>
>
Yes.
>>To check for whether two declarations are the same, just compare their
>>addresses.
>>
>>
>
>You mean, the addresses of the trees
>
>
Yes, I mean the addresses of the trees. If that makes PCH unhappy, then
we use DECL_UID. (Much though I think that wasting a word in every DECL
for a UID when the address is *already* a UID is goofy. The EDG front
end is a worked example demonstrating that you can use pointers as
indices and still make PCH work by swizzling the pointers on the way
in. We really should do that; it would allow us to save memory and
would make PCH more robust.)
>>If a front end creates two FUNCTION_DECLs or VAR_DECLs
>>that happen to have the same DECL_ASSEMBLER_NAME that's either a bug
>>or an intentional trick on the part of the front end: by the time
>>things get to the middle end there should be only one DECL for each
>>declared entity.
>>
>>
>
>I don't believe that the frontends actually ensure this. For instance,
>
>extern int x;
>extern int y asm ("x");
>
>will produce two DECLs that refer to the same integer.
>
>
Yes -- but that's the user's issue.
From the point of view of the compiler, we should still treat these as
two separate variables.
You could even do
extern float y asm ("x")
and I don't expect that we would present give you a warning.
I certainly don't think that should be an error -- I think it's
perfectly valid input -- but of course the user must be very careful
about type-based aliasing rules if playing such games.
The asm-specifier should have nothing to do with anything except what
name is put out in the assembly file.
>Likewise, I believe with Zack's c-decl changes, I believe that it
>always returns the new DECL, which means that in code like:
>
>extern int foo();
>int bar(void) { return foo(1); }
>extern int foo(int);
>int baz(void) { return foo(2); }
>
>bar will reference one DECL of foo, and baz will reference a different
>one. I think there are cases (perhaps even this example) where it'll
>do this even without Zack's changes.
>
>
The point of Zack's changes was (in part) to eliminate having multiple
copies of a FUNCTION_DECL for foo.
I'm not 100% sure that this was fully completed in the current patch,
but if not, it will be soon.
There should be just one FUNCTION_DECL for "foo", and by the time we
reach the middle end, its type should be "int ()(int)".
--
Mark Mitchell
CodeSourcery, LLC
(916) 791-8304
mark@codesourcery.com
More information about the Gcc
mailing list