gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 1 Feb 2010 20:19:06 +0000 (20:19 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 1 Feb 2010 20:19:06 +0000 (20:19 +0000)
PR libc/11214:
* linux-low.c (linux_tracefork_child) [!(__UCLIBC__ && HAS_NOMMU)]: New.
(linux_test_for_tracefork): Move `stack' into [__UCLIBC__ && HAS_NOMMU].
(linux_test_for_tracefork) [!(__UCLIBC__ && HAS_NOMMU)]: New.

gdb/testsuite/
PR libc/11214:
* gdb.threads/current-lwp-dead.c: Include features.h.
(HAS_NOMMU): New.
(fn, main): Move CLONE_VM into [__UCLIBC__ && HAS_NOMMU].

gdb/ChangeLog
gdb/gdbserver/linux-low.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.threads/current-lwp-dead.c

index b00c9a7286cadfe665654ccfe4552fd447850532..b2b1ce09d81d83698a14e8b29ce14701e7ff8f18 100644 (file)
@@ -1,7 +1,14 @@
+2010-02-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       PR libc/11214:
+       * linux-low.c (linux_tracefork_child) [!(__UCLIBC__ && HAS_NOMMU)]: New.
+       (linux_test_for_tracefork): Move `stack' into [__UCLIBC__ && HAS_NOMMU].
+       (linux_test_for_tracefork) [!(__UCLIBC__ && HAS_NOMMU)]: New.
+
 2010-02-01  Michael Matz  <matz@suse.de>
            Daniel Jacobowitz  <dan@codesourcery.com>
 
-        * i386-tdep.c (i386_frame_cache): Assume valid anonymous
+       * i386-tdep.c (i386_frame_cache): Assume valid anonymous
        functions use a frame pointer.
 
 2010-02-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
index fb4aa5c2494ebfc8e32962dbc1e14a85052de8c6..12c40bc4c8c7bf4aa60e0f4487de64ddab70dbd4 100644 (file)
@@ -2597,6 +2597,14 @@ linux_tracefork_child (void *arg)
 {
   ptrace (PTRACE_TRACEME, 0, 0, 0);
   kill (getpid (), SIGSTOP);
+
+#if !(defined(__UCLIBC__) && defined(HAS_NOMMU))
+
+  if (fork () == 0)
+    linux_tracefork_grandchild (NULL);
+
+#else /* defined(__UCLIBC__) && defined(HAS_NOMMU) */
+
 #ifdef __ia64__
   __clone2 (linux_tracefork_grandchild, arg, STACK_SIZE,
            CLONE_VM | SIGCHLD, NULL);
@@ -2604,6 +2612,9 @@ linux_tracefork_child (void *arg)
   clone (linux_tracefork_grandchild, arg + STACK_SIZE,
         CLONE_VM | SIGCHLD, NULL);
 #endif
+
+#endif /* defined(__UCLIBC__) && defined(HAS_NOMMU) */
+
   _exit (0);
 }
 
@@ -2616,18 +2627,31 @@ linux_test_for_tracefork (void)
 {
   int child_pid, ret, status;
   long second_pid;
+#if defined(__UCLIBC__) && defined(HAS_NOMMU)
   char *stack = xmalloc (STACK_SIZE * 4);
+#endif /* defined(__UCLIBC__) && defined(HAS_NOMMU) */
 
   linux_supports_tracefork_flag = 0;
 
+#if !(defined(__UCLIBC__) && defined(HAS_NOMMU))
+
+  child_pid = fork ();
+  if (child_pid == 0)
+    linux_tracefork_child (NULL);
+
+#else /* defined(__UCLIBC__) && defined(HAS_NOMMU) */
+
   /* Use CLONE_VM instead of fork, to support uClinux (no MMU).  */
 #ifdef __ia64__
   child_pid = __clone2 (linux_tracefork_child, stack, STACK_SIZE,
                        CLONE_VM | SIGCHLD, stack + STACK_SIZE * 2);
-#else
+#else /* !__ia64__ */
   child_pid = clone (linux_tracefork_child, stack + STACK_SIZE,
                     CLONE_VM | SIGCHLD, stack + STACK_SIZE * 2);
-#endif
+#endif /* !__ia64__ */
+
+#endif /* defined(__UCLIBC__) && defined(HAS_NOMMU) */
+
   if (child_pid == -1)
     perror_with_name ("clone");
 
@@ -2696,7 +2720,9 @@ linux_test_for_tracefork (void)
     }
   while (WIFSTOPPED (status));
 
+#if defined(__UCLIBC__) && defined(HAS_NOMMU)
   free (stack);
+#endif /* defined(__UCLIBC__) && defined(HAS_NOMMU) */
 }
 
 
index 01613dd75124c0cea349c603e0bd644da342ff9f..0be26e6d49a2e9b00549064da13332e2fa428b1d 100644 (file)
@@ -1,3 +1,10 @@
+2010-02-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       PR libc/11214:
+       * gdb.threads/current-lwp-dead.c: Include features.h.
+       (HAS_NOMMU): New.
+       (fn, main): Move CLONE_VM into [__UCLIBC__ && HAS_NOMMU].
+
 2010-02-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.base/symbol-without-target_section.exp,
index 834b8b7ddfcf28b571e05dc4616a9fc5686c0388..16f87058da6e9cc96f17db3b8b50418d7530d5be 100644 (file)
 #include <unistd.h>
 #include <stdlib.h>
 
+#include <features.h>
+#ifdef __UCLIBC__
+#if !(defined(__UCLIBC_HAS_MMU__) || defined(__ARCH_HAS_MMU__))
+#define HAS_NOMMU
+#endif
+#endif
+
 #define STACK_SIZE 0x1000
 
 static int
@@ -51,8 +58,11 @@ fn (void *unused)
   stack = malloc (STACK_SIZE);
   assert (stack != NULL);
 
-  new_pid = clone (fn_return, stack + STACK_SIZE, CLONE_FILES | CLONE_VM, NULL,
-                  NULL, NULL, NULL);
+  new_pid = clone (fn_return, stack + STACK_SIZE, CLONE_FILES
+#if defined(__UCLIBC__) && defined(HAS_NOMMU)
+                  | CLONE_VM
+#endif /* defined(__UCLIBC__) && defined(HAS_NOMMU) */
+                  , NULL, NULL, NULL, NULL);
   assert (new_pid > 0);
 
   return 0;
@@ -67,8 +77,11 @@ main (int argc, char **argv)
   stack = malloc (STACK_SIZE);
   assert (stack != NULL);
 
-  new_pid = clone (fn, stack + STACK_SIZE, CLONE_FILES | CLONE_VM, NULL, NULL,
-                  NULL, NULL);
+  new_pid = clone (fn, stack + STACK_SIZE, CLONE_FILES
+#if defined(__UCLIBC__) && defined(HAS_NOMMU)
+                  | CLONE_VM
+#endif /* defined(__UCLIBC__) && defined(HAS_NOMMU) */
+                  , NULL, NULL, NULL, NULL);
   assert (new_pid > 0);
 
   return 0;