[PATCH] Fix PR33763
Richard Guenther
rguenther@suse.de
Mon Jan 16 10:37:00 GMT 2012
On Mon, 16 Jan 2012, Jakub Jelinek wrote:
> On Mon, Jan 16, 2012 at 09:35:08AM +0100, Richard Guenther wrote:
> > But that's of course intended. Attributes or redirection on the
> > extern inline variant are completely meaningless.
> >
> > > If you want to keep olddecl as is, then IMHO we should add a new bool
> > > argument to merge_decls and if the flag is set, make sure we only ever
> > > modify newdecl and not olddecl.
> >
> > I don't think that is necesary nor warranted. What legitimate use
> > would break you think?
>
> The extern inline decl gets also all the previous decl attributes
> accumulated. Asm redirection on the extern inline is meaningless.
> Consider:
> /* foo.h */
> extern int foo (int, int) __attribute__((regparm (2))) __asm ("bar");
> ...
> /* foo-inlines.h */
> extern inline __attribute__((gnu_inline, always_inline)) void
> foo (int x, int y)
> {
> return something (x, y);
> }
> ...
> /* foo.c */
> int
> foo (int x, int y)
> {
> return something (x, y);
> }
>
> You really want to have __asm ("bar") on the foo out-of-line definition,
> wouldn't surprise me if this broke glibc or other packages that heavily
> use asm redirection (in glibc e.g. LFS). And the regparm attribute
> is needed too. The gnu_inline attribute isn't needed, but can be safely
> copied over and ignored, the always_inline attribute and maybe artificial
> attributes are the only ones that should be not copied over to the
> out-of-line definition.
Ok, I suppose that requires even more adjustments of the scope/lookup
stuff for extern inlines when we see the redefinition - thus, lookup
a previous decl and merge with that instead of doing no merging.
We don't seem to have a testcase for this at least. I'll add yours
as follows (works with 4.6, fails with my patch)
extern int foo (int, int) __asm__ ("bar");
extern inline __attribute__((gnu_inline, always_inline)) int
foo (int x, int y)
{
return 0;
}
int
foo (int x, int y)
{
return 0;
}
int main()
{
return bar ();
}
Before I spend too much time on this age-old bug - Joseph, can you
agree with the proposed partial fix sofar and then with looking
through the I_SYMBOL_BINDING chain to skip the extern inline decl
to find the decl to merge with?
Thanks,
Richard.
More information about the Gcc-patches
mailing list