[testsuite] Remove BASEDIR
authorYao Qi <yao.qi@linaro.org>
Thu, 4 Feb 2016 15:46:37 +0000 (15:46 +0000)
committerYao Qi <yao.qi@linaro.org>
Thu, 4 Feb 2016 15:46:37 +0000 (15:46 +0000)
BASEDIR was added by https://sourceware.org/ml/gdb-patches/2013-10/msg00587.html
in order to handle the different directory layout in serial testing
and parallel testing.  BASEDIR is "gdb.base" in serial testing and is
"outputs/gdb.base/TESTNAME" in parallel testing.  However, it doesn't
work if the GDBserver is in remote target, like this,

$ make check RUNTESTFLAGS='--target_board=remote-gdbserver-on-localhost foll-vfork.exp foll-exec.exp'
FAIL: gdb.base/foll-exec.exp: continue to first exec catchpoint (the program exited)
FAIL: gdb.base/foll-vfork.exp: exec: vfork and exec child follow, to main bp: continue to bp (the program exited)
FAIL: gdb.base/foll-vfork.exp: exec: vfork child follow, finish after tcatch vfork: finish (the program exited)
FAIL: gdb.base/foll-vfork.exp: exec: vfork relations in info inferiors: continue to bp (the program exited)

these tests fail because the executable can't be found.  With target
board native-gdbserver, the program is spawned this way,

 spawn ../gdbserver/gdbserver --once :2347 /scratch/yao/gdb/build-git/x86_64/gdb/testsuite/gdb.base/foll-vfork

so BASEDIR is correct.  However, with target board
remote-gdbserver-on-localhost, the program is spawned

  spawn /usr/bin/ssh -l yao localhost /scratch/yao/gdb/build-git/x86_64/gdb/testsuite/../gdbserver/gdbserver --once :2346 /scratch/yao/gdb/build-git/x86_64/gdb/testsuite/gdb.base/foll-vfork

so BASEDIR (either "gdb.base" or "outputs/gdb.base/TESTNAME") makes no
sense.

I had a fix that pass absolute directory to BASEDIR, but it assumes
that directory structure is the same on build and target, and it
doesn't work in remote host case.  The current fix in this patch is
to get the directory from argv[0].  In any case, the program to be
exec'ed is at the same directory with the main program.

Note that these tests do "next N" to let program stop at the desired
line, but it is fragile, because GDB for different targets may skip
function prologue slightly differently, so I replace some of them by
"tbreak on LINE NUMBER and continue".

gdb/testsuite:

2016-02-04  Yao Qi  <yao.qi@linaro.org>

* gdb.base/foll-exec-mode.c: Include limits.h.
(main): Add parameters argc and argv.  Get directory from
argv[0].
* gdb.base/foll-exec-mode.exp: Don't pass -DBASEDIR in
compilation.
* gdb.base/foll-exec.c: Include limits.h.
(main): Add parameters argc and argv.
Get directory from argv[0].
* gdb.base/foll-exec.exp: Don't pass -DBASEDIR in compilation.
Adjust tests on the number of lines as source code changed.
* gdb.base/foll-vfork-exit.c: Include limits.h.
(main): Add one line of statement before vfork.
* gdb.base/foll-vfork.c: Include limits.h and string.h.
(main): Add parameters argc and argv.  Get directory from
argv[0].
* gdb.base/foll-vfork.exp: Don't pass -DBASEDIR in compilation.
(setup_gdb): Set tbreak to skip some source lines.
* gdb.multi/bkpt-multi-exec.c: Include limits.h.
(main): Add parameters argc and argv.  Get directory from
argv[0].
* gdb.multi/bkpt-multi-exec.exp: Don't pass -DBASEDIR in
compilation.
* gdb.multi/multi-arch-exec.c: Include limits.h and string.h.
(main): Add parameters argc and argv.  Get directory from
argv[0].
* gdb.multi/multi-arch-exec.exp: Don't pass -DBASEDIR in
compilation.

12 files changed:
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/foll-exec-mode.c
gdb/testsuite/gdb.base/foll-exec-mode.exp
gdb/testsuite/gdb.base/foll-exec.c
gdb/testsuite/gdb.base/foll-exec.exp
gdb/testsuite/gdb.base/foll-vfork-exit.c
gdb/testsuite/gdb.base/foll-vfork.c
gdb/testsuite/gdb.base/foll-vfork.exp
gdb/testsuite/gdb.multi/bkpt-multi-exec.c
gdb/testsuite/gdb.multi/bkpt-multi-exec.exp
gdb/testsuite/gdb.multi/multi-arch-exec.c
gdb/testsuite/gdb.multi/multi-arch-exec.exp

index ab74e6e6deafddc95eb8cc3490b5d5da61f30f35..046f1120d30a7d822042e5f9d5ac236065112bab 100644 (file)
@@ -1,3 +1,33 @@
+2016-02-04  Yao Qi  <yao.qi@linaro.org>
+
+       * gdb.base/foll-exec-mode.c: Include limits.h.
+       (main): Add parameters argc and argv.  Get directory from
+       argv[0].
+       * gdb.base/foll-exec-mode.exp: Don't pass -DBASEDIR in
+       compilation.
+       * gdb.base/foll-exec.c: Include limits.h.
+       (main): Add parameters argc and argv.
+       Get directory from argv[0].
+       * gdb.base/foll-exec.exp: Don't pass -DBASEDIR in compilation.
+       Adjust tests on the number of lines as source code changed.
+       * gdb.base/foll-vfork-exit.c: Include limits.h.
+       (main): Add one line of statement before vfork.
+       * gdb.base/foll-vfork.c: Include limits.h and string.h.
+       (main): Add parameters argc and argv.  Get directory from
+       argv[0].
+       * gdb.base/foll-vfork.exp: Don't pass -DBASEDIR in compilation.
+       (setup_gdb): Set tbreak to skip some source lines.
+       * gdb.multi/bkpt-multi-exec.c: Include limits.h.
+       (main): Add parameters argc and argv.  Get directory from
+       argv[0].
+       * gdb.multi/bkpt-multi-exec.exp: Don't pass -DBASEDIR in
+       compilation.
+       * gdb.multi/multi-arch-exec.c: Include limits.h and string.h.
+       (main): Add parameters argc and argv.  Get directory from
+       argv[0].
+       * gdb.multi/multi-arch-exec.exp: Don't pass -DBASEDIR in
+       compilation.
+
 2016-02-01  Doug Evans  <dje@google.com>
 
        * gdb.base/skip.exp: Clean up multiple references to same test name.
index 1a482a5fc1b49b0e9e2e47c0ace85f4e9bed33d4..67686d722f690c95d5717b226150e7263b12261e 100644 (file)
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
+#include <limits.h>
 
 int global_i = 100;
 
-int main (void)
+int main (int argc, char ** argv)
 {
   int local_j = global_i + 1;
   int local_k = local_j + 1;
+  char prog[PATH_MAX];
+  int len;
+
+  strcpy (prog, argv[0]);
+  len = strlen (prog);
+  /* Replace "foll-exec-mode" with "execd-prog".  */
+  memcpy (prog + len - 14, "execd-prog", 10);
+  prog[len - 4] = 0;
 
   printf ("foll-exec is about to execlp(execd-prog)...\n");
 
-  execlp (BASEDIR "/execd-prog",     /* Set breakpoint here.  */
+  execlp (prog,     /* Set breakpoint here.  */
          "/execd-prog",
          "execlp arg1 from foll-exec",
          (char *) 0);
index 41d788b2c0ee96b917cf9fe9294082c4826a490a..aa7b4143e96af5d4e38885dd27c38660cea2a0a0 100644 (file)
@@ -46,8 +46,6 @@ set srcfile2 ${testfile2}.c
 set binfile2 [standard_output_file ${testfile2}]
 
 set compile_options debug
-set dirname [relative_filename [pwd] [file dirname $binfile]]
-lappend compile_options "additional_flags=-DBASEDIR=\"$dirname\""
 
 # build the first test case
 if  { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable $compile_options] != "" } {
index 639698c30764d436e36b653d6858d4dfe22a99ea..1ae171f035a10c7ad687dde4189158788ce4106f 100644 (file)
 #include <unistd.h>
 #include <string.h>
 
+#include <limits.h>
+
 int global_i = 100;
 
-int main (void)
+int main (int argc, char ** argv)
 {
   int local_j = global_i + 1;
   int local_k = local_j + 1;
+  char prog[PATH_MAX];
+  int len;
 
   printf ("foll-exec is about to execlp(execd-prog)...\n");
 
-  execlp (BASEDIR "/execd-prog",
-         BASEDIR "/execd-prog",
+  strcpy (prog, argv[0]);
+  len = strlen (prog);
+  /* Replace "foll-exec" with "execd-prog".  */
+  memcpy (prog + len - 9, "execd-prog", 10);
+  prog[len + 1] = 0;
+
+  execlp (prog, /* tbreak-execlp */
+         prog,
          "execlp arg1 from foll-exec",
          (char *) 0);
 
   printf ("foll-exec is about to execl(execd-prog)...\n");
 
-  execl (BASEDIR "/execd-prog",        /* tbreak-execl */
-        BASEDIR "/execd-prog",
+  execl (prog, /* tbreak-execl */
+        prog,
         "execl arg1 from foll-exec",
         "execl arg2 from foll-exec",
         (char *) 0);
 
   {
     static char * argv[] = {
-      (char *) BASEDIR "/execd-prog",
+      (char *) "",
       (char *) "execv arg1 from foll-exec",
       (char *) 0};
 
+    argv[0] = prog;
+
     printf ("foll-exec is about to execv(execd-prog)...\n");
 
-    execv (BASEDIR "/execd-prog", argv); /* tbreak-execv */
+    execv (prog, argv); /* tbreak-execv */
   }
 }
index 7d86d0140027b3758e98a63e826a8aca66be433d..8859f9f8c36eeb226fae5e4522063384c60f0e45 100644 (file)
@@ -29,8 +29,6 @@ set srcfile2 ${testfile2}.c
 set binfile2 [standard_output_file ${testfile2}]
 
 set compile_options debug
-set dirname [relative_filename [pwd] [file dirname $binfile]]
-lappend compile_options "additional_flags=-DBASEDIR=\"$dirname\""
 
 # build the first test case
 if  { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable $compile_options] != "" } {
@@ -80,19 +78,17 @@ proc do_exec_tests {} {
      fail "Couldn't run ${testfile}"
      return
    }
+   # Execute the code setting up variable PROG.
+   set tbreak_line [gdb_get_line_number " tbreak-execlp " $srcfile]
+   gdb_test "tbreak ${tbreak_line}"
+   gdb_continue_to_breakpoint "line tbreak-execlp" ".*execlp \\(.*"
 
    # Verify that we can see various global and local variables
    # in this program, and that they have expected values.  Some
    # of these variables are also declared in the program we'll
    # exec in a moment.
    #
-   send_gdb "next 3\n"
-   gdb_expect {
-     -re "execlp \\(.*$gdb_prompt $"\
-                     {pass "step to exec call"}
-     -re "$gdb_prompt $" {fail "step to exec call"}
-     timeout         {fail "(timeout) step to exec call"}
-   }
+
    send_gdb "print global_i\n"
    gdb_expect {
      -re ".* = 100.*$gdb_prompt $"\
@@ -238,11 +234,15 @@ proc do_exec_tests {} {
      fail "Couldn't run ${testfile} (3rd try)"
      return
    }
+   # Execute the code setting up variable PROG.
+   set tbreak_line [gdb_get_line_number " tbreak-execlp " $srcfile]
+   gdb_test "tbreak ${tbreak_line}"
+   gdb_continue_to_breakpoint "line tbreak-execlp" ".*execlp \\(.*"
 
    # Verify that we can follow through follow an execl()
    # call.  (We must jump around earlier exec* calls.)
    #
-   set tbreak_line [gdb_get_line_number "tbreak-execl" $srcfile]
+   set tbreak_line [gdb_get_line_number " tbreak-execl " $srcfile]
    send_gdb "tbreak ${tbreak_line}\n"
    gdb_expect {
      -re "Temporary breakpoint .*file .*${srcfile}, line ${tbreak_line}.*$gdb_prompt $"\
@@ -299,6 +299,10 @@ proc do_exec_tests {} {
      fail "Couldn't run ${testfile} (4th try)"
      return
    }
+   # Execute the code setting up variable PROG.
+   set tbreak_line [gdb_get_line_number " tbreak-execlp " $srcfile]
+   gdb_test "tbreak ${tbreak_line}"
+   gdb_continue_to_breakpoint "line tbreak-execlp" ".*execlp \\(.*"
 
    # Verify that we can follow through follow an execv()
    # call.  (We must jump around earlier exec* calls.)
index 6f168e24e66faf3e5d6442b9d2be27220bc702f8..c431dedf107ceb7b8cdc8d665d54bf9d0fbe817f 100644 (file)
@@ -23,7 +23,10 @@ main ()
 {
   int pid;
 
-  pid = vfork ();
+  /* A statement before vfork to make sure a breakpoint on main isn't
+     set on vfork below.  */
+  pid = 1;
+  pid = vfork (); /* VFORK */
   if (pid == 0)
     {
       printf ("I'm the child!\n");
index 24b2a53d1e5c7b6c42a40932aef4cae1a1e5a9f3..5949d45d3cb99302f2372e56172a963f55b3ba29 100644 (file)
 #include <stdio.h>
 #include <unistd.h>
 
-int main (void)
+#include <limits.h>
+#include <string.h>
+
+int
+main (int argc, char ** argv)
 {
   int  pid;
 
-  pid = vfork ();
+  /* A statement before vfork to make sure a breakpoint on main isn't
+     set on vfork below.  */
+  pid = 1 + argc;
+  pid = vfork (); /* VFORK */
   if (pid == 0) {
+    char prog[PATH_MAX];
+    int len;
+
+    strcpy (prog, argv[0]);
+    len = strlen (prog);
+    /* Replace "foll-vfork" with "vforked-prog".  */
+    memcpy (prog + len - 10, "vforked-prog", 12);
+    prog[len + 2] = 0;
+
     printf ("I'm the child!\n");
-    execlp (BASEDIR "/vforked-prog", BASEDIR "/vforked-prog", (char *)0);
+    execlp (prog, prog, (char *) 0);
     perror ("exec failed");
     _exit (1);
   }
index bf9b89349b9c2293f9d396e67ebf50b914c6fbc3..481dcb7d6e156f86e25206e615f7f2c8d9e6cc19 100644 (file)
@@ -28,8 +28,6 @@ if {![istarget "*-linux*"]} then {
 standard_testfile
 
 set compile_options debug
-set dirname [relative_filename [pwd] [file dirname $binfile]]
-lappend compile_options "additional_flags=-DBASEDIR=\"$dirname\""
 
 if {[build_executable $testfile.exp $testfile $srcfile $compile_options] == -1} {
     untested "failed to compile $testfile"
@@ -53,7 +51,7 @@ set timeout [expr "$timeout + 10"]
 # error, behave as "return", so we don't try to continue testing with
 # a borked session.
 proc setup_gdb {} {
-    global testfile
+    global testfile srcfile
 
     clean_restart $testfile
 
@@ -64,6 +62,10 @@ proc setup_gdb {} {
     if ![runto_main] {
        return -code return
     }
+
+    set tbreak_line [gdb_get_line_number " VFORK " $srcfile]
+    gdb_test "tbreak ${tbreak_line}"
+    gdb_continue_to_breakpoint ".*"
 }
 
 proc check_vfork_catchpoints {} {
index 94c96688d1bbbede56c47e273533bc34ca8617db..eb002fb2545b5a8c02ebcf4644e39cff3c03521f 100644 (file)
@@ -2,12 +2,22 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
+#include <limits.h>
 
-int main (void)
+int main (int argc, char ** argv)
 {
+  char prog[PATH_MAX];
+  int len;
+
+  strcpy (prog, argv[0]);
+  len = strlen (prog);
+  /* Replace "bkpt-multi-exec" with "crashme".  */
+  memcpy (prog + len - 15, "crashme", 7);
+  prog[len - 8] = 0;
+
   printf ("foll-exec is about to execl(crashme)...\n");
 
-  execl (BASEDIR "/crashme",
-         BASEDIR "/crashme",
+  execl (prog,
+         prog,
          (char *)0);
 }
index b7662df99cfdf9039ad853ac362c9013f69d9d89..e5224136608d3ed1c4369478a53b25644af519bd 100644 (file)
@@ -34,8 +34,6 @@ set srcfile2 ${exec2}.c
 set binfile2 [standard_output_file ${exec2}]
 
 set compile_options {debug}
-set dirname [relative_filename [pwd] [file dirname $binfile1]]
-lappend compile_options "additional_flags=-DBASEDIR=\"$dirname\""
 
 if { [build_executable ${testfile}.exp ${exec1} "${srcfile1}" $compile_options] == -1 } {
     return -1
index 864e264e8734034076933dac423fb69052ce2cb2..168b4846dc3aa17742dba48ae2356cd3686abbb1 100644 (file)
 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <limits.h>
+#include <string.h>
 
 int
-main ()
+main (int argc, char ** argv)
 {
-  execl (BASEDIR "/multi-arch-exec-hello",
-         BASEDIR "/multi-arch-exec-hello",
+  char prog[PATH_MAX];
+  int len;
+
+  strcpy (prog, argv[0]);
+  len = strlen (prog);
+  /* Replace "multi-arch-exec" with "multi-arch-exec-hello".  */
+  memcpy (prog + len - 15, "multi-arch-exec-hello", 21);
+  prog[len + 6] = 0;
+
+  execl (prog,
+         prog,
          (char *) NULL);
   perror ("execl failed");
   exit (1);
index 5e9b59abb1a44341a079a8da0a792b4b0da74ea9..88e5a621f3e6e6c9f6e4ccb388eff7c12757ce6e 100644 (file)
@@ -52,11 +52,9 @@ if [istarget "s390*-*-*"] {
     set march2 "-m32"
 }
 
-set dirname [relative_filename [pwd] [file dirname $binfile2]]
 if { [prepare_for_testing ${testfile}.exp ${exec1} "${srcfile1}" \
          [list debug \
-              additional_flags=${march1} \
-              additional_flags=-DBASEDIR=\"$dirname\"]] } {
+              additional_flags=${march1}]] } {
     return -1
 }