Thread: list_head naming conflict gcc 4.2/perl/solaris

list_head naming conflict gcc 4.2/perl/solaris

From
Zdenek Kotala
Date:
During integration gcc4.2 into Solaris. My colleague hit a following
problem with PostgreSQL compilation:

http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6845982

cd /builds/sfw-fixes/usr/src/cmd/postgres/postgresql-8.2/postgresql-8.2.13/src/pl/plperl
+ /ws/onnv-tools/SUNWspro/SS12/bin/cc -xO3 -m32 -xchip=pentium -xspace -Xa -xildoff -xc99=all -xc99=none -xCC -KPIC -I.
-I../../../src/include-I/builds/sfw-fixes/proto/root_i386/usr/include
-I/builds/sfw-fixes/proto/root_i386/usr/sfw/include-I/usr/sfw/include -I/usr/include/kerberosv5
-I/usr/perl5/5.8.4/lib/i86pc-solaris-64int/CORE-c -o plperl.o plperl.c
 
"/usr/include/sys/list.h", line 52: identifier redeclared: list_head       current : function(pointer to struct list
{unsignedint list_size, unsigned int list_offset, struct list_node {..} list_head}) returning pointer to void
previous:function(pointer to struct List {enum NodeTag {T_TIDBitmap(902), (blah blah)
 

At this moment there is no clear conclusion how to fix it in solaris system headers to satisfy all side.  :(

My idea is to rename list_head to pg_list_head (and other functions analogously) to avoid name conflict.
Comments, better ideas?
    Thanks Zdenek






Re: list_head naming conflict gcc 4.2/perl/solaris

From
Robert Haas
Date:
On Mon, Jun 1, 2009 at 3:57 PM, Zdenek Kotala <Zdenek.Kotala@sun.com> wrote:
> During integration gcc4.2 into Solaris. My colleague hit a following
> problem with PostgreSQL compilation:
>
> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6845982
>
> cd /builds/sfw-fixes/usr/src/cmd/postgres/postgresql-8.2/postgresql-8.2.13/src/pl/plperl
> + /ws/onnv-tools/SUNWspro/SS12/bin/cc -xO3 -m32 -xchip=pentium -xspace -Xa -xildoff -xc99=all -xc99=none -xCC -KPIC
-I.-I../../../src/include -I/builds/sfw-fixes/proto/root_i386/usr/include
-I/builds/sfw-fixes/proto/root_i386/usr/sfw/include-I/usr/sfw/include -I/usr/include/kerberosv5
-I/usr/perl5/5.8.4/lib/i86pc-solaris-64int/CORE-c -o plperl.o plperl.c 
> "/usr/include/sys/list.h", line 52: identifier redeclared: list_head
>        current : function(pointer to struct list {unsigned int list_size, unsigned int list_offset, struct list_node
{..}list_head}) returning pointer to void 
>        previous: function(pointer to struct List {enum NodeTag {T_TIDBitmap(902), (blah blah)
>
> At this moment there is no clear conclusion how to fix it in solaris system headers to satisfy all side.  :(
>
> My idea is to rename list_head to pg_list_head (and other functions analogously) to avoid name conflict.
>
>        Comments, better ideas?

Uh... isn't it rather bad form for the operating system headers to be
defining commonly used type names like "list"?  I'd be very surprised
if PostgreSQL is the only application that is going to break on this.

...Robert


Re: list_head naming conflict gcc 4.2/perl/solaris

From
Tom Lane
Date:
Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:
> My idea is to rename list_head to pg_list_head (and other functions analogously) to avoid name conflict.

There is zero chance of that happening.  We have thousands of references
to those functions in the core code, and who knows how many more in
third-party code we don't control.

What is <sys/list.h>, and why is it being imported by the Perl headers?
Can we do something like "#define list_head solaris_list_head" around
the problematic #include?  (Which one is that, anyway?)
        regards, tom lane


Re: list_head naming conflict gcc 4.2/perl/solaris

From
Zdenek Kotala
Date:
Robert Haas píše v po 01. 06. 2009 v 16:03 -0400:
> On Mon, Jun 1, 2009 at 3:57 PM, Zdenek Kotala <Zdenek.Kotala@sun.com> wrote:
> > During integration gcc4.2 into Solaris. My colleague hit a following
> > problem with PostgreSQL compilation:
> >
> > http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6845982
> >
> > cd /builds/sfw-fixes/usr/src/cmd/postgres/postgresql-8.2/postgresql-8.2.13/src/pl/plperl
> > + /ws/onnv-tools/SUNWspro/SS12/bin/cc -xO3 -m32 -xchip=pentium -xspace -Xa -xildoff -xc99=all -xc99=none -xCC -KPIC
-I.-I../../../src/include -I/builds/sfw-fixes/proto/root_i386/usr/include
-I/builds/sfw-fixes/proto/root_i386/usr/sfw/include-I/usr/sfw/include -I/usr/include/kerberosv5
-I/usr/perl5/5.8.4/lib/i86pc-solaris-64int/CORE-c -o plperl.o plperl.c
 
> > "/usr/include/sys/list.h", line 52: identifier redeclared: list_head
> >        current : function(pointer to struct list {unsigned int list_size, unsigned int list_offset, struct
list_node{..} list_head}) returning pointer to void
 
> >        previous: function(pointer to struct List {enum NodeTag {T_TIDBitmap(902), (blah blah)
> >
> > At this moment there is no clear conclusion how to fix it in solaris system headers to satisfy all side.  :(
> >
> > My idea is to rename list_head to pg_list_head (and other functions analogously) to avoid name conflict.
> >
> >        Comments, better ideas?
> 
> Uh... isn't it rather bad form for the operating system headers to be
> defining commonly used type names like "list"?  

It is in solaris since 2003 for kernel structure linked list. When I
look on it closer, it seems that problem is more in perl which includes
some sys/ headers which is probably not good practice. :(

> I'd be very surprised
> if PostgreSQL is the only application that is going to break on this.

At this moment I know only about PostgreSQL. How I understand it now, it
appears only when source is compiling with Perl. 

I will look more on it tomorrow.
thanks Zdenek




Re: list_head naming conflict gcc 4.2/perl/solaris

From
Zdenek Kotala
Date:
Tom Lane píše v po 01. 06. 2009 v 16:09 -0400:
> Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:


> What is <sys/list.h>, and why is it being imported by the Perl headers?

It seems that problem is with Perl. It includes sys/mode.h. The new
change for gcc 4.2 is that mode.h includes vnode.h and it finally
sys/list.h which is generic list for kernel structures. 

> Can we do something like "#define list_head solaris_list_head" around 
> the problematic #include?  (Which one is that, anyway?)

I will try it. There is following hack:

CFLAGS="-D_SYS_VNODE_H" 

which disable vnode.h and breaks include chain.

I need to install fresh nightly build of Solaris to test it on live
system.
Thanks Zdenek



Re: list_head naming conflict gcc 4.2/perl/solaris

From
Zdenek Kotala
Date:
Zdenek Kotala píše v po 01. 06. 2009 v 22:45 +0200:
> Tom Lane píše v po 01. 06. 2009 v 16:09 -0400:
> > Zdenek Kotala <Zdenek.Kotala@Sun.COM> writes:
> 
> 
> > What is <sys/list.h>, and why is it being imported by the Perl headers?
> 
> It seems that problem is with Perl. It includes sys/mode.h. The new
> change for gcc 4.2 is that mode.h includes vnode.h and it finally
> sys/list.h which is generic list for kernel structures. 
> 
> > Can we do something like "#define list_head solaris_list_head" around 
> > the problematic #include?  (Which one is that, anyway?)
> 
> I will try it. There is following hack:
> 
> CFLAGS="-D_SYS_VNODE_H" 
> 
> which disable vnode.h and breaks include chain.
>
> I need to install fresh nightly build of Solaris to test it on live
> system.

Perl includes sys/mode.h which is probably not necessary (it look likes
that it is something for AIX), but it seems that sys/*.h headers
modifications break more than only PostgreSQL. And kernel guys should
fix it. Which means no change for PostgreSQL. Only who will use
opensolaris devel builds 116 could have a problem. I will skip these
build(s) on my buildfarm animals.
Zdenek