Fix gdb 8.1 Solaris compilation

Message ID yddy3p8p5l6.fsf@CeBiTec.Uni-Bielefeld.DE
State New, archived
Headers

Commit Message

Rainer Orth Sept. 21, 2017, 1:02 p.m. UTC
  I just tried to compile gdb trunk on Solaris 11.4 (formerly 12), and
failed for a couple of reasons:

*

In file included from /usr/include/python2.7/Python.h:128:0,
                 from /vol/src/gnu/gdb/gdb/dist/gdb/python/python-internal.h:94,
                 from /vol/src/gnu/gdb/gdb/dist/gdb/python/py-instruction.h:23,
                 from /vol/src/gnu/gdb/gdb/dist/gdb/python/py-instruction.c:21:
/usr/include/python2.7/ceval.h:67:0: error: ignoring #pragma no_inline  [-Werror=unknown-pragmas]
 #pragma no_inline(PyEval_EvalFrameEx)
 ^

  New in Solaris 11.4: <python2.7/ceval.h> uses a Studio-only #pragma.
  I've disabled the warning in warnings.m4.

*

/vol/src/gnu/gdb/gdb/dist/gdb/ser-pipe.c: In function ‘int pipe_open(serial*, const char*)’:
/vol/src/gnu/gdb/gdb/dist/gdb/ser-pipe.c:77:9: error: ‘pid_t vfork()’ is deprecated (declared at /usr/include/unistd.h:659) [-Werror=deprecated-declarations]
   pid = vfork ();
         ^
/vol/src/gnu/gdb/gdb/dist/gdb/ser-pipe.c:77:16: error: ‘pid_t vfork()’ is deprecated (declared at /usr/include/unistd.h:659) [-Werror=deprecated-declarations]
   pid = vfork ();
                ^

  Since Solaris 11, vfork () is marked deprecated in <unistd.h>.

  cf. vfork(2):

       The  vfork()  and vforkx() functions are deprecated. Their sole legiti-
       mate use as a prelude to an immediate call to a function from the  exec
       family can be achieved safely by posix_spawn(3C) or posix_spawnp(3C).

  Again, I've disabled the warning.

*

/vol/src/gnu/gdb/gdb/dist/gdb/cli/cli-cmds.c: In function ‘void shell_escape(const char*, int)’:
/vol/src/gnu/gdb/gdb/dist/gdb/cli/cli-cmds.c:750:14: error: ‘pid_t vfork()’ is deprecated (declared at /usr/include/unistd.h:659) [-Werror=deprecated-declarations]
   if ((pid = vfork ()) == 0)
              ^
/vol/src/gnu/gdb/gdb/dist/gdb/cli/cli-cmds.c:750:21: error: ‘pid_t vfork()’ is deprecated (declared at /usr/include/unistd.h:659) [-Werror=deprecated-declarations]
   if ((pid = vfork ()) == 0)
                     ^

  Same problem.

*

/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c: In function ‘void procfs_init_inferior(target_ops*, int)’:
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c:4380:30: error: ‘START_INFERIOR_TRAPS_EXPECTED’ was not declared in this scope
   gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED);
                              ^

  defined in nat/fork-inferior.h, need to include that header

/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c: In function ‘void procfs_create_inferior(target_ops*, const char*, const string&, char**, int)’:
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c:4605:38: error: ‘fork_inferior’ was not declared in this scope
          NULL, NULL, shell_file, NULL);
                                      ^

  likewise

/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c: In function ‘void procfs_info_proc(target_ops*, const char*, info_proc_what)’:
/vol/src/gnu/gdb/gdb/dist/gdb/procfs.c:5124:20: error: ‘argv’ was not declared in this scope
   for (char *arg : argv)
                    ^

  Typo, should be built_argv instead!

*

Undefined                       first referenced
 symbol                             in file
fork_inferior(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char**, void (*)(), void (*)(int), void (*)(), char const*, void (*)(char const*, char* const*, char* const*)) procfs.o
startup_inferior(int, int, target_waitstatus*, ptid_t*) fork-child.o
ld: fatal: symbol referencing errors
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:2249: gdb] Error 1

  Need to add fork-inferior.o to NATDEPFILES.

With the changes below, I can build gdb on sparcv9-sun-solaris2.11 and
amd64-pc-solaris2.11 and a simple smoke test (gdb/gdb gdb/gdb) works.

Ok for mainline?

	Rainer
  

Comments

Andreas Schwab Sept. 21, 2017, 1:16 p.m. UTC | #1
On Sep 21 2017, Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> wrote:

> diff --git a/gdb/configure.nat b/gdb/configure.nat
> --- a/gdb/configure.nat
> +++ b/gdb/configure.nat
> @@ -216,7 +216,8 @@ case ${gdb_host} in
>  	case ${gdb_host_cpu} in
>  	    i386)
>  		# Host: Solaris x86
> -		NATDEPFILES='fork-child.o i386-v4-nat.o i386-sol2-nat.o \
> +		NATDEPFILES='fork-child.o fork-inferior.o
> +		i386-v4-nat.o i386-sol2-nat.o
>  		procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o'
>  		HAVE_NATIVE_GCORE_HOST=1
>  		;;

Doesn't that lack backslashes?

Andreas.
  
Rainer Orth Sept. 21, 2017, 2:14 p.m. UTC | #2
Hi Andreas,

> On Sep 21 2017, Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> wrote:
>
>> diff --git a/gdb/configure.nat b/gdb/configure.nat
>> --- a/gdb/configure.nat
>> +++ b/gdb/configure.nat
>> @@ -216,7 +216,8 @@ case ${gdb_host} in
>>  	case ${gdb_host_cpu} in
>>  	    i386)
>>  		# Host: Solaris x86
>> -		NATDEPFILES='fork-child.o i386-v4-nat.o i386-sol2-nat.o \
>> +		NATDEPFILES='fork-child.o fork-inferior.o
>> +		i386-v4-nat.o i386-sol2-nat.o
>>  		procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o'
>>  		HAVE_NATIVE_GCORE_HOST=1
>>  		;;
>
> Doesn't that lack backslashes?

It does, good catch, thanks.  The configure fragment resp. shell is fine
without, of course, but they are needed once substituted into Makefile.
Fixed locally.

However, this section is only needed on Solaris < 10, which is why I
didn't notice it until I tried an i386-pc-solaris2.9 build.  It's
probably time to remove support for those old Solaris versions in gdb,
too: gcc lost them after 4.9.

	Rainer
  
Pedro Alves Sept. 21, 2017, 2:21 p.m. UTC | #3
On 09/21/2017 02:02 PM, Rainer Orth wrote:

> With the changes below, I can build gdb on sparcv9-sun-solaris2.11 and
> amd64-pc-solaris2.11 and a simple smoke test (gdb/gdb gdb/gdb) works.
> 
> Ok for mainline?
> 

OK.

(Since you posted a non-'git format-patch' patch, I feel compelled
to say: please remember to push with meaningful git subject line
and commit log.)

Thanks,
Pedro Alves
  
Rainer Orth Sept. 21, 2017, 2:23 p.m. UTC | #4
Hi Pedro,

> On 09/21/2017 02:02 PM, Rainer Orth wrote:
>
>> With the changes below, I can build gdb on sparcv9-sun-solaris2.11 and
>> amd64-pc-solaris2.11 and a simple smoke test (gdb/gdb gdb/gdb) works.
>> 
>> Ok for mainline?
>
> OK.
>
> (Since you posted a non-'git format-patch' patch, I feel compelled
> to say: please remember to push with meaningful git subject line
> and commit log.)

I do, but am working with hg locally since I always found git to be a
total nightmare.

	Rainer
  
Rainer Orth Sept. 21, 2017, 2:30 p.m. UTC | #5
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes:

> However, this section is only needed on Solaris < 10, which is why I
> didn't notice it until I tried an i386-pc-solaris2.9 build.  It's
> probably time to remove support for those old Solaris versions in gdb,
> too: gcc lost them after 4.9.

I'm pretty certain we should: the Solaris 9/x86 build didn't complete,
even with the configure.nat section fixed:

In file included from build-gnulib/import/wchar.h:87:0,
                 from /vol/gcc-4.9/include/c++/4.9.0/cwchar:44,
                 from /vol/gcc-4.9/include/c++/4.9.0/bits/postypes.h:40,
                 from /vol/gcc-4.9/include/c++/4.9.0/bits/char_traits.h:40,
                 from /vol/gcc-4.9/include/c++/4.9.0/string:40,
                 from /vol/src/gnu/gdb/gdb/local/gdb/common/common-utils.h:23,
                 from /vol/src/gnu/gdb/gdb/local/gdb/common/common-defs.h:78,
                 from /vol/src/gnu/gdb/gdb/local/gdb/defs.h:28,
                 from /vol/src/gnu/gdb/gdb/local/gdb/gdb.c:19:
/vol/gcc-4.9/lib/gcc/i386-pc-solaris2.9/4.9.0/include-fixed/wchar.h:59:12: error: ‘std::wcstok’ has not been declared
 using std::wcstok;
            ^
/vol/gcc-4.9/lib/gcc/i386-pc-solaris2.9/4.9.0/include-fixed/wchar.h:60:12: error: ‘std::wcsftime’ has not been declared
 using std::wcsftime;
            ^

This bad interaction between gnulib and fixed Solaris 9 headers may be
fixable, but even trying to seems like a total waste of time.

How is obsoletion/removal handled in gdb?  In gcc, in one release a
target is obsoleted and trying to build it yields an error which can be
overridden with --enable-obsolete.  Unless someone steps up to continue
maintenance, the code is removed in the next release.

Does gdb go for immediate removal instead?  I have no idea which release
last built/worked on Solaris 9.  I have a build of 7.11 lying around,
but never tried anything later.

Thoughts?

	Rainer
  
Pedro Alves Sept. 21, 2017, 2:39 p.m. UTC | #6
On 09/21/2017 03:30 PM, Rainer Orth wrote:

> This bad interaction between gnulib and fixed Solaris 9 headers may be
> fixable, but even trying to seems like a total waste of time.
> 
> How is obsoletion/removal handled in gdb?  In gcc, in one release a
> target is obsoleted and trying to build it yields an error which can be
> overridden with --enable-obsolete.  Unless someone steps up to continue
> maintenance, the code is removed in the next release.

GDB is more aggressive:

  https://sourceware.org/gdb/wiki/Internals%20Obsoleting-code

For Solaris, I believe it's been a while that the only maintenance
we've seen comes from you.  Which kind of makes you the de-facto
maintainer.  :-)  Since gcc obsoleted Solaris 9 years ago, and nobody
all these years stepped forward, I think we should be able to just drop
it.  I think you've proposed this in the past, even.  I very
much doubt anyone would step forward this time.

> Does gdb go for immediate removal instead?  I have no idea which release
> last built/worked on Solaris 9.  I have a build of 7.11 lying around,
> but never tried anything later.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/configure.nat b/gdb/configure.nat
--- a/gdb/configure.nat
+++ b/gdb/configure.nat
@@ -216,7 +216,8 @@  case ${gdb_host} in
 	case ${gdb_host_cpu} in
 	    i386)
 		# Host: Solaris x86
-		NATDEPFILES='fork-child.o i386-v4-nat.o i386-sol2-nat.o \
+		NATDEPFILES='fork-child.o fork-inferior.o
+		i386-v4-nat.o i386-sol2-nat.o
 		procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o'
 		HAVE_NATIVE_GCORE_HOST=1
 		;;
@@ -464,7 +465,7 @@  case ${gdb_host} in
 		# Host: Solaris SPARC & UltraSPARC
 		NAT_FILE='nm-sol2.h'
 		NATDEPFILES='sparc-sol2-nat.o \
-		fork-child.o \
+		fork-child.o fork-inferior.o \
 		procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o'
 		HAVE_NATIVE_GCORE_HOST=1
 		;;
@@ -474,7 +475,8 @@  case ${gdb_host} in
 	case ${gdb_host_cpu} in
 	    i386)
 		# Host: Solaris x86_64
-		NATDEPFILES='fork-child.o amd64-nat.o i386-v4-nat.o i386-sol2-nat.o \
+		NATDEPFILES='fork-child.o fork-inferior.o \
+		amd64-nat.o i386-v4-nat.o i386-sol2-nat.o \
 		procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o'
 		HAVE_NATIVE_GCORE_HOST=1
 		;;
diff --git a/gdb/procfs.c b/gdb/procfs.c
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -30,6 +30,7 @@ 
 #include "gdbthread.h"
 #include "regcache.h"
 #include "inf-child.h"
+#include "nat/fork-inferior.h"
 #include "filestuff.h"
 
 #if defined (NEW_PROC_API)
@@ -5121,7 +5122,7 @@  procfs_info_proc (struct target_ops *ops
 
   old_chain = make_cleanup (null_cleanup, 0);
   gdb_argv built_argv (args);
-  for (char *arg : argv)
+  for (char *arg : built_argv)
     {
       if (isdigit (arg[0]))
 	{
diff --git a/gdb/warning.m4 b/gdb/warning.m4
--- a/gdb/warning.m4
+++ b/gdb/warning.m4
@@ -43,10 +43,17 @@  build_warnings="-Wall -Wpointer-arith \
 -Wno-sign-compare -Wno-narrowing -Wno-error=maybe-uninitialized \
 -Wno-mismatched-tags"
 
-# Enable -Wno-format by default when using gcc on mingw since many
-# GCC versions complain about %I64.
 case "${host}" in
-  *-*-mingw32*) build_warnings="$build_warnings -Wno-format" ;;
+  *-*-mingw32*)
+    # Enable -Wno-format by default when using gcc on mingw since many
+    # GCC versions complain about %I64.
+    build_warnings="$build_warnings -Wno-format" ;;
+  *-*-solaris*)
+    # Solaris 11.4 <python2.7/ceval.h> uses #pragma no_inline that GCC
+    # doesn't understand.
+    build_warnings="$build_warnings -Wno-unknown-pragmas"
+    # Solaris 11 <unistd.h> marks vfork deprecated.
+    build_warnings="$build_warnings -Wno-deprecated-declarations" ;;
   *) build_warnings="$build_warnings -Wformat-nonliteral" ;;
 esac