Thread: Sun Studio on Linux spinlock patch

Sun Studio on Linux spinlock patch

From
Julius Stroffek
Date:
Hi All,

I have made PostgreSQL to compile on linux using sun studio with
spinlock support. The patch is attached. Here is the explanation of
changes I made:

I renamed the following files
solaris_x86.s
solaris_sparch.s

to
sunstudio_x86.s
sunstudio_sparch.s

because the code is used on linux as well and is not related to solaris
but sunstudio.

I added the detection of Sun Studio to configure script, changed the
template for linux, so it gives same settings for sun studio as for solaris.

Finally, I changed the #ifdef of __sun macro to __SUNPRO_C macro in
s_lock.h. Macro __sun is defined on solaris by both gcc and sun studio
and it is not defined on linux. Macro __SUNPRO_C is defined on linux as
well as solaris by sun studio and is never defined by gcc.

I tested the patch (build process & make check) without any problems on:
x86, solaris nevada build 79; gcc 3.4.3 (csl-sol210-3_4-20050802)
x86, solaris nevada build 79; sun studio 12
x86, debian etch, gcc 4.1.2 (20061115)
x86, debian etch, sun studio 12
sparc, solaris 10U3, gcc 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
sparc, solaris 10U3, sun studio 12

I do not have an access to linux sparc machine.

Thanks for your comments.

Cheers

Julo
Index: configure
--- configure
+++ configure
@@ -682,6 +682,7 @@
 ac_ct_CC
 EXEEXT
 OBJEXT
+SSCC
 CPP
 GCC
 TAS
@@ -3353,6 +3354,54 @@

 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

+# Check if it's Sun Studio compiler. We assume that
+# __SUNPRO_C will be defined for Sun Studio compilers
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __SUNPRO_C
+choke me
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+     test -z "$ac_c_werror_flag" ||
+     test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  SSCC=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    SSCC=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
 unset CFLAGS

 #
@@ -25545,6 +25594,7 @@
 ac_ct_CC!$ac_ct_CC$ac_delim
 EXEEXT!$EXEEXT$ac_delim
 OBJEXT!$OBJEXT$ac_delim
+SSCC!$SSCC$ac_delim
 CPP!$CPP$ac_delim
 GCC!$GCC$ac_delim
 TAS!$TAS$ac_delim
@@ -25577,7 +25627,6 @@
 RANLIB!$RANLIB$ac_delim
 STRIP!$STRIP$ac_delim
 STRIP_STATIC_LIB!$STRIP_STATIC_LIB$ac_delim
-STRIP_SHARED_LIB!$STRIP_SHARED_LIB$ac_delim
 _ACEOF

   if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@@ -25619,6 +25668,7 @@
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   cat >conf$$subs.sed <<_ACEOF
+STRIP_SHARED_LIB!$STRIP_SHARED_LIB$ac_delim
 TAR!$TAR$ac_delim
 LN_S!$LN_S$ac_delim
 AWK!$AWK$ac_delim
@@ -25669,7 +25719,7 @@
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF

-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 48; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 49; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
Index: configure.in
--- configure.in
+++ configure.in
@@ -241,6 +241,14 @@
 choke me
 @%:@endif], [ICC=[yes]], [ICC=[no]])

+# Check if it's Sun Studio compiler. We assume that
+# __SUNPRO_C will be defined for Sun Studio compilers
+AC_TRY_COMPILE([], [@%:@ifndef __SUNPRO_C
+choke me
+@%:@endif], [SSCC=[yes]], [SSCC=[no]])
+
+AC_SUBST(SSCC)
+
 unset CFLAGS

 #
Index: src/Makefile.global.in
--- src/Makefile.global.in
+++ src/Makefile.global.in
@@ -304,6 +304,7 @@

 # Name of the "template"
 PORTNAME= @PORTNAME@
+SUN_STUDIO_COMPILER = @SSCC@

 host_tuple = @host@
 host_os = @host_os@
Index: src/backend/port/Makefile
--- src/backend/port/Makefile
+++ src/backend/port/Makefile
@@ -33,12 +33,14 @@
 include $(top_srcdir)/src/backend/common.mk

 tas.o: tas.s
-ifeq ($(PORTNAME), solaris)
+ifeq ($(SUN_STUDIO_COMPILER), yes)
 # preprocess assembler file with cpp, used by x86
+    echo YES.
     $(CC) $(CFLAGS) -c -P $<
     mv $*.i $*_cpp.s
     $(CC) $(CFLAGS) -c $*_cpp.s -o $@
 else
+    echo NO.
     $(CC) $(CFLAGS) -c $<
 endif

Index: src/backend/port/tas/solaris_sparc.s
--- src/backend/port/tas/solaris_sparc.s
+++ src/backend/port/tas/solaris_sparc.s
@@ -1,42 +0,0 @@
-!=======================================================================
-! solaris_sparc.s -- compare and swap for solaris_sparc
-!=======================================================================
-
-! Fortunately the Sun compiler can process cpp conditionals with -P
-
-! '/' is the comment for x86, while '!' is the comment for Sparc
-
-#if defined(__sparcv9) || defined(__sparc)
-
-    .section        ".text"
-    .align  8
-    .skip   24
-    .align  4
-
-    .global pg_atomic_cas
-pg_atomic_cas:
-
-    ! "cas" only works on sparcv9 and sparcv8plus chips, and
-    ! requies a compiler targeting these CPUs.  It will fail
-    ! on a compiler targeting sparcv8, and of course will not
-    ! be understood by a sparcv8 CPU.  gcc continues to use
-    ! "ldstub" because it targets sparcv7.
-    !
-    ! There is actually a trick for embedding "cas" in a
-    ! sparcv8-targeted compiler, but it can only be run
-    ! on a sparcv8plus/v9 cpus:
-    !
-    !   http://cvs.opensolaris.org/source/xref/on/usr/src/lib/libc/sparc/threads/sparc.il
-    !
-
-#if defined(__sparcv9) || defined(__sparcv8plus)
-    cas     [%o0],%o2,%o1
-#else
-    ldstub [%o0],%o1
-#endif
-    mov     %o1,%o0
-    retl
-    nop
-    .type   pg_atomic_cas,2
-    .size   pg_atomic_cas,(.-pg_atomic_cas)
-#endif
Index: src/backend/port/tas/solaris_x86.s
--- src/backend/port/tas/solaris_x86.s
+++ src/backend/port/tas/solaris_x86.s
@@ -1,34 +0,0 @@
-/=======================================================================
-/ solaris_i386.s -- compare and swap for solaris_i386
-/=======================================================================
-
-/ Fortunately the Sun compiler can process cpp conditionals with -P
-
-/ '/' is the comment for x86, while '!' is the comment for Sparc
-
-    .file   "tas.s"
-
-#if defined(__amd64)
-    .code64
-#endif
-
-    .globl pg_atomic_cas
-    .type pg_atomic_cas, @function
-
-    .section .text, "ax"
-    .align 16
-
-pg_atomic_cas:
-#if defined(__amd64)
-    movl       %edx,%eax
-    lock
-    cmpxchgl   %esi,(%rdi)
-#else
-    movl    4(%esp), %edx
-    movl    8(%esp), %ecx
-    movl    12(%esp), %eax
-    lock
-    cmpxchgl %ecx, (%edx)
-#endif
-    ret
-    .size pg_atomic_cas, . - pg_atomic_cas
Index: src/backend/port/tas/sunstudio_sparc.s
--- /dev/null
+++ src/backend/port/tas/sunstudio_sparc.s
@@ -0,0 +1,42 @@
+!=======================================================================
+! solaris_sparc.s -- compare and swap for solaris_sparc
+!=======================================================================
+
+! Fortunately the Sun compiler can process cpp conditionals with -P
+
+! '/' is the comment for x86, while '!' is the comment for Sparc
+
+#if defined(__sparcv9) || defined(__sparc)
+
+    .section        ".text"
+    .align  8
+    .skip   24
+    .align  4
+
+    .global pg_atomic_cas
+pg_atomic_cas:
+
+    ! "cas" only works on sparcv9 and sparcv8plus chips, and
+    ! requies a compiler targeting these CPUs.  It will fail
+    ! on a compiler targeting sparcv8, and of course will not
+    ! be understood by a sparcv8 CPU.  gcc continues to use
+    ! "ldstub" because it targets sparcv7.
+    !
+    ! There is actually a trick for embedding "cas" in a
+    ! sparcv8-targeted compiler, but it can only be run
+    ! on a sparcv8plus/v9 cpus:
+    !
+    !   http://cvs.opensolaris.org/source/xref/on/usr/src/lib/libc/sparc/threads/sparc.il
+    !
+
+#if defined(__sparcv9) || defined(__sparcv8plus)
+    cas     [%o0],%o2,%o1
+#else
+    ldstub [%o0],%o1
+#endif
+    mov     %o1,%o0
+    retl
+    nop
+    .type   pg_atomic_cas,2
+    .size   pg_atomic_cas,(.-pg_atomic_cas)
+#endif
Index: src/backend/port/tas/sunstudio_x86.s
--- /dev/null
+++ src/backend/port/tas/sunstudio_x86.s
@@ -0,0 +1,34 @@
+/=======================================================================
+/ solaris_i386.s -- compare and swap for solaris_i386
+/=======================================================================
+
+/ Fortunately the Sun compiler can process cpp conditionals with -P
+
+/ '/' is the comment for x86, while '!' is the comment for Sparc
+
+    .file   "tas.s"
+
+#if defined(__amd64)
+    .code64
+#endif
+
+    .globl pg_atomic_cas
+    .type pg_atomic_cas, @function
+
+    .section .text, "ax"
+    .align 16
+
+pg_atomic_cas:
+#if defined(__amd64)
+    movl       %edx,%eax
+    lock
+    cmpxchgl   %esi,(%rdi)
+#else
+    movl    4(%esp), %edx
+    movl    8(%esp), %ecx
+    movl    12(%esp), %eax
+    lock
+    cmpxchgl %ecx, (%edx)
+#endif
+    ret
+    .size pg_atomic_cas, . - pg_atomic_cas
Index: src/include/storage/s_lock.h
--- src/include/storage/s_lock.h
+++ src/include/storage/s_lock.h
@@ -578,7 +578,7 @@
 #endif


-#endif    /* __GNUC__ */
+#endif    /* defined(__GNUC__) || defined(__INTEL_COMPILER) */



@@ -782,7 +782,7 @@
 #endif


-#if defined(__sun) && (defined(__i386) || defined(__x86_64__) || defined(__sparc__) || defined(__sparc))
+#if defined(__SUNPRO_C) && (defined(__i386) || defined(__x86_64__) || defined(__sparc__) || defined(__sparc))
 #define HAS_TEST_AND_SET

 #if defined(__i386) || defined(__x86_64__) || defined(__sparcv9) || defined(__sparcv8plus)
Index: src/template/linux
--- src/template/linux
+++ src/template/linux
@@ -1,7 +1,31 @@
 # $PostgreSQL: pgsql/src/template/linux,v 1.30 2007/09/21 02:33:46 tgl Exp $

-# Force _GNU_SOURCE on; plperl is broken with Perl 5.8.0 otherwise
-CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
+if test "$SSCC" != "yes" ; then
+  # Force _GNU_SOURCE on; plperl is broken with Perl 5.8.0 otherwise
+  CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"

-# If --enable-profiling is specified, we need -DLINUX_PROFILE
-PLATFORM_PROFILE_FLAGS="-DLINUX_PROFILE"
+  # If --enable-profiling is specified, we need -DLINUX_PROFILE
+  PLATFORM_PROFILE_FLAGS="-DLINUX_PROFILE"
+else
+  # fiif test "$GCC" != yes ; then
+  CC="$CC -Xa"            # relaxed ISO C mode
+  CFLAGS="-v -DSUNOS4_CC"    # -v is like gcc -Wall
+  if test "$enable_debug" != yes; then
+    CFLAGS="$CFLAGS -O"        # any optimization breaks debug
+  fi
+
+  # Pick the right test-and-set (TAS) code for the Sun compiler.
+  # We would like to use in-line assembler, but the compiler
+  # requires *.il files to be on every compile line, making
+  # the build system too fragile.
+  case $host in
+    sparc-*-linux*)
+    need_tas=yes
+    tas_file=sunstudio_sparc.s
+    ;;
+    i?86-*-linux*)
+    need_tas=yes
+    tas_file=sunstudio_x86.s
+    ;;
+  esac
+fi
Index: src/template/solaris
--- src/template/solaris
+++ src/template/solaris
@@ -12,11 +12,11 @@
   case $host in
     sparc-*-solaris*)
     need_tas=yes
-    tas_file=solaris_sparc.s
+    tas_file=sunstudio_sparc.s
     ;;
     i?86-*-solaris*)
     need_tas=yes
-    tas_file=solaris_x86.s
+    tas_file=sunstudio_x86.s
     ;;
   esac
 fi

Re: Sun Studio on Linux spinlock patch

From
Tom Lane
Date:
Julius Stroffek <Julius.Stroffek@Sun.COM> writes:
> I have made PostgreSQL to compile on linux using sun studio with
> spinlock support. The patch is attached. Here is the explanation of
> changes I made:

This patch seems broken in a number of ways.  Why are you removing
-DLINUX_PROFILE, for example?  Are you sure you don't need -D_GNU_SOURCE?
And why add -DSUNOS4_CC, which is a Solaris-specific define (not that
we seem to be using it anywhere anymore)?  Do we really have to have a
configure-time probe to detect this particular compiler?

But I guess the *real* question is why anyone would care ... what
benefit is there to using Sun's compiler on Linux?

            regards, tom lane

Re: Sun Studio on Linux spinlock patch

From
Zdenek Kotala
Date:
Tom Lane napsal(a):

>
> But I guess the *real* question is why anyone would care ... what
> benefit is there to using Sun's compiler on Linux?

There are severals benefits:

1) Sun Studio is not only compiler. It has a lot of tools like
performance analyzer/profiler, memory checker ... There are group of
people who prefers these tools.

2) Compiler generates faster code on SPARC than GCC. If somebody uses
Linux on SPARC it helps him a lot. Code is faster on x86 as well, but it
is not so significant.

See http://blogs.sun.com/tatkar/resource/SunStudio.pdf
Pages 12-13


    Zdenek



Re: Sun Studio on Linux spinlock patch

From
Julius Stroffek
Date:
Tom Lane wrote:
> This patch seems broken in a number of ways.  Why are you removing
> -DLINUX_PROFILE, for example?  Are you sure you don't need -D_GNU_SOURCE?
> And why add -DSUNOS4_CC, which is a Solaris-specific define (not that
> we seem to be using it anywhere anymore)?  Do we really have to have a
> configure-time probe to detect this particular compiler?
>
You are right, removing -DLINUX_PROFILE seems to break profiling
on linux when compiled with sun studio.

I am not quite sure about the desired usage of _GNU_SOURCE and SUNOS4_CC
macros.
I would not expect _GNU_SOURCE to be defined when compiling sources with
Sun Studio.
I am not quite sure why SUNOS4_CC was supposed to be defined at all for
Solaris as well.
There are already enough macros defined -- "__sun" is defined on Solaris
by both Sun
Studio and gcc and "__SUNPRO_C" is defined by Sun Studio on both Linux
and Solaris.

Should we then remove _GNU_SOURCE and SUNOS4_CC macro definitions from
the build scripts since they are not used at all in the source code?

Configure-time probe for sun studio is required to create tas.s link to
the proper
file - sunstudio_x86.s (or sunstudio_sparc.s). This is done during a run
of a configure
script based on settings for the platform. Since these settings may vary
on the same platform
based on the compiler we need to have a configure-time probe.
> But I guess the *real* question is why anyone would care ... what
> benefit is there to using Sun's compiler on Linux?
>
Some tools bundled with sun studio might be used. I personally run into this
when I wanted to debug postgres with sun studio ide and wanted to compile
it first. It is based on netbeans, written in java so it needs a big
enough memory,
however it offers a great possibility to explore postgres internals during
a query execution, etc. It is especially useful, if you do not know what
you are
interested in during a compilation. I am using this to step over join
order search
plugins. I mostly use Solaris for this but I switched to linux for a while.

I wrote a blog with more details about this.
http://blogs.sun.com/databases/entry/debugging_postgresql_backends_on_solaris
There is also a screenshot showing how it looks in action
http://mediacast.sun.com/users/%7Ejulo/media/pgss_debugging.png

Also, there was some message a while back on pgsql-bugs from Len Zaifman
requesting
this as well.

Cheers

Julo

Re: Sun Studio on Linux spinlock patch

From
Bruce Momjian
Date:
So, is this a feature we want?

---------------------------------------------------------------------------

Julius Stroffek wrote:
> Tom Lane wrote:
> > This patch seems broken in a number of ways.  Why are you removing
> > -DLINUX_PROFILE, for example?  Are you sure you don't need -D_GNU_SOURCE?
> > And why add -DSUNOS4_CC, which is a Solaris-specific define (not that
> > we seem to be using it anywhere anymore)?  Do we really have to have a
> > configure-time probe to detect this particular compiler?
> >
> You are right, removing -DLINUX_PROFILE seems to break profiling
> on linux when compiled with sun studio.
>
> I am not quite sure about the desired usage of _GNU_SOURCE and SUNOS4_CC
> macros.
> I would not expect _GNU_SOURCE to be defined when compiling sources with
> Sun Studio.
> I am not quite sure why SUNOS4_CC was supposed to be defined at all for
> Solaris as well.
> There are already enough macros defined -- "__sun" is defined on Solaris
> by both Sun
> Studio and gcc and "__SUNPRO_C" is defined by Sun Studio on both Linux
> and Solaris.
>
> Should we then remove _GNU_SOURCE and SUNOS4_CC macro definitions from
> the build scripts since they are not used at all in the source code?
>
> Configure-time probe for sun studio is required to create tas.s link to
> the proper
> file - sunstudio_x86.s (or sunstudio_sparc.s). This is done during a run
> of a configure
> script based on settings for the platform. Since these settings may vary
> on the same platform
> based on the compiler we need to have a configure-time probe.
> > But I guess the *real* question is why anyone would care ... what
> > benefit is there to using Sun's compiler on Linux?
> >
> Some tools bundled with sun studio might be used. I personally run into this
> when I wanted to debug postgres with sun studio ide and wanted to compile
> it first. It is based on netbeans, written in java so it needs a big
> enough memory,
> however it offers a great possibility to explore postgres internals during
> a query execution, etc. It is especially useful, if you do not know what
> you are
> interested in during a compilation. I am using this to step over join
> order search
> plugins. I mostly use Solaris for this but I switched to linux for a while.
>
> I wrote a blog with more details about this.
> http://blogs.sun.com/databases/entry/debugging_postgresql_backends_on_solaris
> There is also a screenshot showing how it looks in action
> http://mediacast.sun.com/users/%7Ejulo/media/pgss_debugging.png
>
> Also, there was some message a while back on pgsql-bugs from Len Zaifman
> requesting
> this as well.
>
> Cheers
>
> Julo
>
> --
> Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-patches

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

Re: Sun Studio on Linux spinlock patch

From
Tom Lane
Date:
Bruce Momjian <bruce@momjian.us> writes:
> So, is this a feature we want?

I have no objection to being able to use Sun Studio, but the submitted
patch seemed to need a lot of work yet ...

            regards, tom lane