[v2,01/13] gdb/linux-record: Add testcases for a few syscalls.

Message ID 1445521166-14492-1-git-send-email-koriakin@0x04.net
State New, archived
Headers

Commit Message

Marcin Kościelnicki Oct. 22, 2015, 1:39 p.m. UTC
  gdb/testsuite/ChangeLog:

	* gdb.reverse/linux-fstatat-reverse.c: New test.
	* gdb.reverse/linux-fstatat-reverse.exp: New file.
	* gdb.reverse/linux-getresuid-reverse.c: New test.
	* gdb.reverse/linux-getresuid-reverse.exp: New file.
	* gdb.reverse/linux-pipe-reverse.c: New test.
	* gdb.reverse/linux-pipe-reverse.exp: New file.
	* gdb.reverse/linux-readv-reverse.c: New test.
	* gdb.reverse/linux-readv-reverse.exp: New file.
	* gdb.reverse/linux-recvmsg-reverse.c: New test.
	* gdb.reverse/linux-recvmsg-reverse.exp: New file.
	* gdb.reverse/linux-time-reverse.c: New test.
	* gdb.reverse/linux-time-reverse.exp: New file.
	* gdb.reverse/linux-waitpid-reverse.c: New test.
	* gdb.reverse/linux-waitpid-reverse.exp: New file.
---
 gdb/testsuite/ChangeLog                            | 17 ++++
 gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c  | 39 ++++++++++
 .../gdb.reverse/linux-fstatat-reverse.exp          | 63 +++++++++++++++
 .../gdb.reverse/linux-getresuid-reverse.c          | 38 +++++++++
 .../gdb.reverse/linux-getresuid-reverse.exp        | 70 +++++++++++++++++
 gdb/testsuite/gdb.reverse/linux-pipe-reverse.c     | 36 +++++++++
 gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp   | 63 +++++++++++++++
 gdb/testsuite/gdb.reverse/linux-readv-reverse.c    | 46 +++++++++++
 gdb/testsuite/gdb.reverse/linux-readv-reverse.exp  | 66 ++++++++++++++++
 gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c  | 90 ++++++++++++++++++++++
 .../gdb.reverse/linux-recvmsg-reverse.exp          | 73 ++++++++++++++++++
 gdb/testsuite/gdb.reverse/linux-time-reverse.c     | 38 +++++++++
 gdb/testsuite/gdb.reverse/linux-time-reverse.exp   | 63 +++++++++++++++
 gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c  | 41 ++++++++++
 .../gdb.reverse/linux-waitpid-reverse.exp          | 63 +++++++++++++++
 15 files changed, 806 insertions(+)
 create mode 100644 gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c
 create mode 100644 gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
 create mode 100644 gdb/testsuite/gdb.reverse/linux-getresuid-reverse.c
 create mode 100644 gdb/testsuite/gdb.reverse/linux-getresuid-reverse.exp
 create mode 100644 gdb/testsuite/gdb.reverse/linux-pipe-reverse.c
 create mode 100644 gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp
 create mode 100644 gdb/testsuite/gdb.reverse/linux-readv-reverse.c
 create mode 100644 gdb/testsuite/gdb.reverse/linux-readv-reverse.exp
 create mode 100644 gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c
 create mode 100644 gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.exp
 create mode 100644 gdb/testsuite/gdb.reverse/linux-time-reverse.c
 create mode 100644 gdb/testsuite/gdb.reverse/linux-time-reverse.exp
 create mode 100644 gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c
 create mode 100644 gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp
  

Comments

Pedro Alves Oct. 29, 2015, 11:30 a.m. UTC | #1
On 10/22/2015 02:39 PM, Marcin Kościelnicki wrote:
> gdb/testsuite/ChangeLog:
> 
> 	* gdb.reverse/linux-fstatat-reverse.c: New test.
> 	* gdb.reverse/linux-fstatat-reverse.exp: New file.
> 	* gdb.reverse/linux-getresuid-reverse.c: New test.
> 	* gdb.reverse/linux-getresuid-reverse.exp: New file.
> 	* gdb.reverse/linux-pipe-reverse.c: New test.
> 	* gdb.reverse/linux-pipe-reverse.exp: New file.
> 	* gdb.reverse/linux-readv-reverse.c: New test.
> 	* gdb.reverse/linux-readv-reverse.exp: New file.
> 	* gdb.reverse/linux-recvmsg-reverse.c: New test.
> 	* gdb.reverse/linux-recvmsg-reverse.exp: New file.
> 	* gdb.reverse/linux-time-reverse.c: New test.
> 	* gdb.reverse/linux-time-reverse.exp: New file.
> 	* gdb.reverse/linux-waitpid-reverse.c: New test.
> 	* gdb.reverse/linux-waitpid-reverse.exp: New file.

Excellent, thank you!

I ran your tests against pristine/unfixed gdb, and linux-readv-reverse.exp
passes cleanly.  This is on x86_64.  Is that expected?  The comments in
the test seem to suggest it would fail.

> +++ b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c
> @@ -0,0 +1,39 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2008-2015 Free Software Foundation, Inc.
> +
> +   This program is free software; you can redistribute it and/or modify
> +   it under the terms of the GNU General Public License as published by
> +   the Free Software Foundation; either version 3 of the License, or
> +   (at your option) any later version.
> +
> +   This program is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
> +
> +#define _GNU_SOURCE
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <sys/stat.h>
> +
> +void marker1 ()

We follow GNU formatting in tests too, unless there's a good
reason not to.  So, line break after void.  Also, this is C,
so write "(void)" for parameters.  Thus:

void
marker1 (void)
{


> +{
> +}
> +
> +void marker2 ()

Likewise.

> +{
> +}
> +
> +struct stat buf;
> +
> +int main() {

int
main ()
{


> +  marker1();
> +  int fd = open("/", O_PATH);
> +  fstatat(fd, ".", &buf, 0);
> +  marker2();

Space before parens.

Several of the test programs have non-conforming indentation too.

> +  return 0;
> +}
> diff --git a/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
> new file mode 100644
> index 0000000..23652e4
> --- /dev/null
> +++ b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
> @@ -0,0 +1,63 @@
> +# Copyright 2015 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +
> +# This file is part of the gdb testsuite.
> +
> +#
> +# This test tests linux fstatat syscall for reverse execution.

Linux, uppercase.  But,

> +#
> +
> +if ![supports_reverse] {
> +    return
> +}
> +
> +
> +if ![istarget "*linux*"] then {
> +    verbose "Skipping linux syscall reverse tests."
> +    return
> +}

... I think most of these tests could/should drop this target check,
and drop the "linux-" in the filename as well.  Any target/port
that supports record/reverse execution should be able to run
this, as long as it manages to compile the test program.  And if the
test program doesn't compile in such a port, it'll be automatically
skipped.

> +
> +gdb_test "break marker1" \
> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
> +    "set breakpoint at marker1"
> +
> +gdb_test "break marker2" \
> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
> +    "set breakpoint at marker2"
> +
> +gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
> +
> +gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"

Most (all?) these tests run to marker1 and then immediately to
marker2.  Can't they just continue to marker2 directly?

> +++ b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp

...

> +# will be remembered.  If not, new contents (status) will be # used, and

Spurious # after "will be".

> +# the test will fail.
> +
> +gdb_test "print status" ".* = -1" "check waitpid record"

Thanks,
Pedro Alves
  
Marcin Kościelnicki Oct. 29, 2015, 12:31 p.m. UTC | #2
On 29/10/15 12:30, Pedro Alves wrote:
> On 10/22/2015 02:39 PM, Marcin Kościelnicki wrote:
>> gdb/testsuite/ChangeLog:
>>
>> 	* gdb.reverse/linux-fstatat-reverse.c: New test.
>> 	* gdb.reverse/linux-fstatat-reverse.exp: New file.
>> 	* gdb.reverse/linux-getresuid-reverse.c: New test.
>> 	* gdb.reverse/linux-getresuid-reverse.exp: New file.
>> 	* gdb.reverse/linux-pipe-reverse.c: New test.
>> 	* gdb.reverse/linux-pipe-reverse.exp: New file.
>> 	* gdb.reverse/linux-readv-reverse.c: New test.
>> 	* gdb.reverse/linux-readv-reverse.exp: New file.
>> 	* gdb.reverse/linux-recvmsg-reverse.c: New test.
>> 	* gdb.reverse/linux-recvmsg-reverse.exp: New file.
>> 	* gdb.reverse/linux-time-reverse.c: New test.
>> 	* gdb.reverse/linux-time-reverse.exp: New file.
>> 	* gdb.reverse/linux-waitpid-reverse.c: New test.
>> 	* gdb.reverse/linux-waitpid-reverse.exp: New file.
>
> Excellent, thank you!
>
> I ran your tests against pristine/unfixed gdb, and linux-readv-reverse.exp
> passes cleanly.  This is on x86_64.  Is that expected?  The comments in
> the test seem to suggest it would fail.

That's expected.  The test would only fail for x32 ABI, since it had the 
wrong size_iov, size_pointer, size_size_t.
>
>> +++ b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c
>> @@ -0,0 +1,39 @@
>> +/* This testcase is part of GDB, the GNU debugger.
>> +
>> +   Copyright 2008-2015 Free Software Foundation, Inc.
>> +
>> +   This program is free software; you can redistribute it and/or modify
>> +   it under the terms of the GNU General Public License as published by
>> +   the Free Software Foundation; either version 3 of the License, or
>> +   (at your option) any later version.
>> +
>> +   This program is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +   GNU General Public License for more details.
>> +
>> +   You should have received a copy of the GNU General Public License
>> +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
>> +
>> +#define _GNU_SOURCE
>> +#include <unistd.h>
>> +#include <fcntl.h>
>> +#include <sys/stat.h>
>> +
>> +void marker1 ()
>
> We follow GNU formatting in tests too, unless there's a good
> reason not to.  So, line break after void.  Also, this is C,
> so write "(void)" for parameters.  Thus:
>
> void
> marker1 (void)
> {

OK.
>
>> +{
>> +}
>> +
>> +void marker2 ()
>
> Likewise.
>
>> +{
>> +}
>> +
>> +struct stat buf;
>> +
>> +int main() {
>
> int
> main ()
> {
>
Not int main(void)?
>
>> +  marker1();
>> +  int fd = open("/", O_PATH);
>> +  fstatat(fd, ".", &buf, 0);
>> +  marker2();
>
> Space before parens.
>
> Several of the test programs have non-conforming indentation too.
OK.
>
>> +  return 0;
>> +}
>> diff --git a/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
>> new file mode 100644
>> index 0000000..23652e4
>> --- /dev/null
>> +++ b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
>> @@ -0,0 +1,63 @@
>> +# Copyright 2015 Free Software Foundation, Inc.
>> +
>> +# This program is free software; you can redistribute it and/or modify
>> +# it under the terms of the GNU General Public License as published by
>> +# the Free Software Foundation; either version 3 of the License, or
>> +# (at your option) any later version.
>> +#
>> +# This program is distributed in the hope that it will be useful,
>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +# GNU General Public License for more details.
>> +#
>> +# You should have received a copy of the GNU General Public License
>> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
>> +
>> +# This file is part of the gdb testsuite.
>> +
>> +#
>> +# This test tests linux fstatat syscall for reverse execution.
>
> Linux, uppercase.  But,
>
>> +#
>> +
>> +if ![supports_reverse] {
>> +    return
>> +}
>> +
>> +
>> +if ![istarget "*linux*"] then {
>> +    verbose "Skipping linux syscall reverse tests."
>> +    return
>> +}
>
> ... I think most of these tests could/should drop this target check,
> and drop the "linux-" in the filename as well.  Any target/port
> that supports record/reverse execution should be able to run
> this, as long as it manages to compile the test program.  And if the
> test program doesn't compile in such a port, it'll be automatically
> skipped.

OK.  So a testcase that doesn't compile is not a problem?  Because I 
just noticed the time test doesn't compile on platforms that don't have 
a time syscall, like s390x...
>
>> +
>> +gdb_test "break marker1" \
>> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>> +    "set breakpoint at marker1"
>> +
>> +gdb_test "break marker2" \
>> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>> +    "set breakpoint at marker2"
>> +
>> +gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
>> +
>> +gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
>
> Most (all?) these tests run to marker1 and then immediately to
> marker2.  Can't they just continue to marker2 directly?

OK, I'll fix that.
>
>> +++ b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp
>
> ...
>
>> +# will be remembered.  If not, new contents (status) will be # used, and
>
> Spurious # after "will be".
>
>> +# the test will fail.
>> +
>> +gdb_test "print status" ".* = -1" "check waitpid record"
>
> Thanks,
> Pedro Alves
>

Thanks for the review, I'll resend a fixed version.
  
Marcin Kościelnicki Oct. 29, 2015, 7:31 p.m. UTC | #3
>> +
>> +gdb_test "break marker1" \
>> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>> +    "set breakpoint at marker1"
>> +
>> +gdb_test "break marker2" \
>> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>> +    "set breakpoint at marker2"
>> +
>> +gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
>> +
>> +gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
>
> Most (all?) these tests run to marker1 and then immediately to
> marker2.  Can't they just continue to marker2 directly?
>

Huh.  I've done that and, funnily enough, the waitpid testcase magically 
started to pass.  For the record, I've reported the bug here: 
https://sourceware.org/bugzilla/show_bug.cgi?id=19187

I guess there won't be a KFAIL after all.
  
Pedro Alves Oct. 30, 2015, 10:36 a.m. UTC | #4
On 10/29/2015 12:31 PM, Marcin Kościelnicki wrote:
> On 29/10/15 12:30, Pedro Alves wrote:
>> On 10/22/2015 02:39 PM, Marcin Kościelnicki wrote:

>> I ran your tests against pristine/unfixed gdb, and linux-readv-reverse.exp
>> passes cleanly.  This is on x86_64.  Is that expected?  The comments in
>> the test seem to suggest it would fail.
> 
> That's expected.  The test would only fail for x32 ABI, since it had the 
> wrong size_iov, size_pointer, size_size_t.

Ah.

>>> +#define _GNU_SOURCE
>>> +#include <unistd.h>
>>> +#include <fcntl.h>
>>> +#include <sys/stat.h>
>>> +
>>> +void marker1 ()
>>
>> We follow GNU formatting in tests too, unless there's a good
>> reason not to.  So, line break after void.  Also, this is C,
>> so write "(void)" for parameters.  Thus:
>>
>> void
>> marker1 (void)
>> {
> 
> OK.
>>
>>> +{
>>> +}
>>> +
>>> +void marker2 ()
>>
>> Likewise.
>>
>>> +{
>>> +}
>>> +
>>> +struct stat buf;
>>> +
>>> +int main() {
>>
>> int
>> main ()
>> {
>>
> Not int main(void)?

Oh, yes, (void).  Sorry, I only payed attention to the
formatting and missed that.

>> ... I think most of these tests could/should drop this target check,
>> and drop the "linux-" in the filename as well.  Any target/port
>> that supports record/reverse execution should be able to run
>> this, as long as it manages to compile the test program.  And if the
>> test program doesn't compile in such a port, it'll be automatically
>> skipped.
> 
> OK.  So a testcase that doesn't compile is not a problem?  Because I 
> just noticed the time test doesn't compile on platforms that don't have 
> a time syscall, like s390x...

It just results in the test being marked UNTESTED.

It's usually better to skip a test on targets that are known
not to support something than the other way around.  Like:

 if [istarget "*s390*"] then {
     ...
     return
 }

Because otherwise, new ports (or when features are added to
existing ports) end up not enabling the tests that might
run there.

Thanks,
Pedro Alves
  
Pedro Alves Oct. 30, 2015, 10:37 a.m. UTC | #5
On 10/29/2015 07:31 PM, Marcin Kościelnicki wrote:
>>> +
>>> +gdb_test "break marker1" \
>>> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>>> +    "set breakpoint at marker1"
>>> +
>>> +gdb_test "break marker2" \
>>> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>>> +    "set breakpoint at marker2"
>>> +
>>> +gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
>>> +
>>> +gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
>>
>> Most (all?) these tests run to marker1 and then immediately to
>> marker2.  Can't they just continue to marker2 directly?
>>
> 
> Huh.  I've done that and, funnily enough, the waitpid testcase magically 
> started to pass.

Eh.

>  For the record, I've reported the bug here: 
> https://sourceware.org/bugzilla/show_bug.cgi?id=19187

Thanks.

> I guess there won't be a KFAIL after all.
> 

OK.

I'll take a look at the new version.

Thanks,
Pedro Alves
  
Marcin Kościelnicki Nov. 2, 2015, 1:34 a.m. UTC | #6
On 30/10/15 11:37, Pedro Alves wrote:
> On 10/29/2015 07:31 PM, Marcin Kościelnicki wrote:
>>>> +
>>>> +gdb_test "break marker1" \
>>>> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>>>> +    "set breakpoint at marker1"
>>>> +
>>>> +gdb_test "break marker2" \
>>>> +    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
>>>> +    "set breakpoint at marker2"
>>>> +
>>>> +gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
>>>> +
>>>> +gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
>>>
>>> Most (all?) these tests run to marker1 and then immediately to
>>> marker2.  Can't they just continue to marker2 directly?
>>>
>>
>> Huh.  I've done that and, funnily enough, the waitpid testcase magically
>> started to pass.
>
> Eh.
>
>>   For the record, I've reported the bug here:
>> https://sourceware.org/bugzilla/show_bug.cgi?id=19187
>
> Thanks.
>
>> I guess there won't be a KFAIL after all.
>>
>
> OK.
>
> I'll take a look at the new version.
>
> Thanks,
> Pedro Alves
>

Well, this is embarassing...

Turns out gdb_continue_to_breakpoint doesn't care all that much about 
the name of the breakpoint passed in as the first parameter, it just 
happily continues to the next breakpoint, whatever it happens to be.

So the testcases as commited never actually make it to marker2, and they 
all trivially pass (state when reaching marker1 is, after all, exactly 
identical to reaching marker2 and then correctly reversing to marker1).

I should've known that stepping over fork suddenly starting to work was 
too good to be true.

So... can I get that push access now and fix my mess, or do I no longer 
qualify as having submitted a good patch due to the above? :)
  
Pedro Alves Nov. 2, 2015, 4:40 p.m. UTC | #7
On 11/02/2015 01:34 AM, Marcin Kościelnicki wrote:

> Well, this is embarassing...
> 
> Turns out gdb_continue_to_breakpoint doesn't care all that much about 
> the name of the breakpoint passed in as the first parameter, it just 
> happily continues to the next breakpoint, whatever it happens to be.
> 
> So the testcases as commited never actually make it to marker2, and they 
> all trivially pass (state when reaching marker1 is, after all, exactly 
> identical to reaching marker2 and then correctly reversing to marker1).
> 
> I should've known that stepping over fork suddenly starting to work was 
> too good to be true.

Whoops, sorry for missing that too.

> 
> So... can I get that push access now and fix my mess, or do I no longer 
> qualify as having submitted a good patch due to the above? :)

:-)

See "I need an account" at https://sourceware.org/.  Say I approved it.

Once you have that sorted, add yourself to the "Write After Approval"
section in gdb/MAINTAINERS, push that change to the repo (no need
for approval on that one), and post that commit on the list.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 1313aa2..8e65781 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,20 @@ 
+2015-10-22  Marcin Kościelnicki  <koriakin@0x04.net>
+
+	* gdb.reverse/linux-fstatat-reverse.c: New test.
+	* gdb.reverse/linux-fstatat-reverse.exp: New file.
+	* gdb.reverse/linux-getresuid-reverse.c: New test.
+	* gdb.reverse/linux-getresuid-reverse.exp: New file.
+	* gdb.reverse/linux-pipe-reverse.c: New test.
+	* gdb.reverse/linux-pipe-reverse.exp: New file.
+	* gdb.reverse/linux-readv-reverse.c: New test.
+	* gdb.reverse/linux-readv-reverse.exp: New file.
+	* gdb.reverse/linux-recvmsg-reverse.c: New test.
+	* gdb.reverse/linux-recvmsg-reverse.exp: New file.
+	* gdb.reverse/linux-time-reverse.c: New test.
+	* gdb.reverse/linux-time-reverse.exp: New file.
+	* gdb.reverse/linux-waitpid-reverse.c: New test.
+	* gdb.reverse/linux-waitpid-reverse.exp: New file.
+
 2015-10-21  Simon Marchi  <simon.marchi@polymtl.ca>
 
 	PR python/18073
diff --git a/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c
new file mode 100644
index 0000000..21091b5
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.c
@@ -0,0 +1,39 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2008-2015 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+struct stat buf;
+
+int main() {
+  marker1();
+  int fd = open("/", O_PATH);
+  fstatat(fd, ".", &buf, 0);
+  marker2();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
new file mode 100644
index 0000000..23652e4
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-fstatat-reverse.exp
@@ -0,0 +1,63 @@ 
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+#
+# This test tests linux fstatat syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+    return
+}
+
+
+if ![istarget "*linux*"] then {
+    verbose "Skipping linux syscall reverse tests."
+    return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+runto main
+
+if [supports_process_record] {
+    # Activate process record/replay
+    gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variable was recorded properly on syscall, the old contents (0)
+# will be remembered.  If not, new contents (mode of /) will be used,
+# and the test will fail.
+
+gdb_test "print buf.st_mode" ".* = 0" "check fstatat record"
diff --git a/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.c b/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.c
new file mode 100644
index 0000000..7aa2004
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.c
@@ -0,0 +1,38 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2008-2015 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+uid_t ruid = -1, euid = -1, suid = -1;
+gid_t rgid = -1, egid = -1, sgid = -1;
+
+int main() {
+  marker1();
+  getresuid(&ruid, &euid, &suid);
+  getresgid(&rgid, &egid, &sgid);
+  marker2();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.exp b/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.exp
new file mode 100644
index 0000000..5a45486
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-getresuid-reverse.exp
@@ -0,0 +1,70 @@ 
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+#
+# This test tests linux getresuid/getresgid syscalls for reverse execution.
+#
+
+if ![supports_reverse] {
+    return
+}
+
+
+if ![istarget "*linux*"] then {
+    verbose "Skipping linux getresuid/getresgid reverse tests."
+    return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+runto main
+
+if [supports_process_record] {
+    # Activate process record/replay
+    gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variables were recorded properly on syscall, the old contents (-1)
+# will be remembered.  If not, new contents (the actual uid/gid) will be used,
+# and the test will fail (we hope the test user doesn't actually have uid of
+# -1).  Do it this way instead of printing uid/gid directly, since uid_t/gid_t
+# is likely to be unsigned.
+
+gdb_test "print ruid == (uid_t)-1" ".* = 1" "check ruid record"
+gdb_test "print euid == (uid_t)-1" ".* = 1" "check euid record"
+gdb_test "print suid == (uid_t)-1" ".* = 1" "check suid record"
+gdb_test "print rgid == (gid_t)-1" ".* = 1" "check rgid record"
+gdb_test "print egid == (gid_t)-1" ".* = 1" "check egid record"
+gdb_test "print sgid == (gid_t)-1" ".* = 1" "check sgid record"
diff --git a/gdb/testsuite/gdb.reverse/linux-pipe-reverse.c b/gdb/testsuite/gdb.reverse/linux-pipe-reverse.c
new file mode 100644
index 0000000..56aae3c
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-pipe-reverse.c
@@ -0,0 +1,36 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2008-2015 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+int fds[2] = { -1, -1 };
+
+int main() {
+  marker1();
+  pipe(fds);
+  marker2();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp b/gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp
new file mode 100644
index 0000000..5dfbbe7
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-pipe-reverse.exp
@@ -0,0 +1,63 @@ 
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+#
+# This test tests linux pipe syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+    return
+}
+
+
+if ![istarget "*linux*"] then {
+    verbose "Skipping linux syscall reverse tests."
+    return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+runto main
+
+if [supports_process_record] {
+    # Activate process record/replay
+    gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variables were recorded properly on syscall, the old contents (-1)
+# will be remembered.  If not, new contents (the file fds from pipe) will be
+# used, and the test will fail.
+
+gdb_test "print fds" ".* = {-1, -1}" "check pipe record"
diff --git a/gdb/testsuite/gdb.reverse/linux-readv-reverse.c b/gdb/testsuite/gdb.reverse/linux-readv-reverse.c
new file mode 100644
index 0000000..f62c2a8
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-readv-reverse.c
@@ -0,0 +1,46 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2008-2015 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/uio.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+int fds[2] = { -1, -1 };
+char buf[5];
+const struct iovec v[4] = {
+  { &buf[1], 1 },
+  { &buf[0], 1 },
+  { &buf[3], 1 },
+  { &buf[2], 1 },
+};
+
+int main() {
+  marker1();
+  pipe(fds);
+  write(fds[1], "UNIX", 4);
+  readv(fds[0], v, 4);
+  marker2();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-readv-reverse.exp b/gdb/testsuite/gdb.reverse/linux-readv-reverse.exp
new file mode 100644
index 0000000..5701652
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-readv-reverse.exp
@@ -0,0 +1,66 @@ 
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+#
+# This test tests linux pipe syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+    return
+}
+
+
+if ![istarget "*linux*"] then {
+    verbose "Skipping linux syscall reverse tests."
+    return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+runto main
+
+if [supports_process_record] {
+    # Activate process record/replay
+    gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variables were recorded properly on syscall, the old contents ("")
+# will be remembered.  If not, new contents ("NUXI") will be
+# used, and the test will fail.
+
+gdb_test "print (int)buf\[0]" ".* = 0" "check readv record"
+gdb_test "print (int)buf\[1]" ".* = 0" "check readv record"
+gdb_test "print (int)buf\[2]" ".* = 0" "check readv record"
+gdb_test "print (int)buf\[3]" ".* = 0" "check readv record"
diff --git a/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c b/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c
new file mode 100644
index 0000000..d9a9508
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.c
@@ -0,0 +1,90 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2008-2015 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#define _GNU_SOURCE
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <unistd.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+char wdata[] = "abcdef";
+
+struct iovec wv[1] = {
+	{wdata, 6},
+};
+
+char wc[CMSG_SPACE(sizeof (struct ucred)) + CMSG_SPACE(sizeof (int))];
+
+struct msghdr wmsg = {
+	0, 0,
+	wv, 1,
+	wc, sizeof wc,
+	0,
+};
+
+char rdata[5] = "xxxx";
+
+struct iovec rv[2] = {
+	{&rdata[2], 2},
+	{&rdata[0], 2},
+};
+
+char rc[CMSG_SPACE(sizeof (struct ucred)) + 7];
+
+struct msghdr rmsg = {
+	0, 0,
+	rv, 2,
+	rc, sizeof rc,
+	0,
+};
+
+int fds[2];
+
+int main() {
+	int itrue = 1;
+	/* prepare cmsg to send */
+	struct cmsghdr *cm1 = CMSG_FIRSTHDR(&wmsg);
+	cm1->cmsg_len = CMSG_LEN(sizeof (struct ucred));
+	cm1->cmsg_level = AF_UNIX;
+	cm1->cmsg_type = SCM_CREDENTIALS;
+	struct ucred *uc = (void *)CMSG_DATA(cm1);
+	uc->pid = getpid();
+	uc->uid = getuid();
+	uc->gid = getgid();
+	struct cmsghdr *cm2 = CMSG_NXTHDR(&wmsg, cm1);
+	cm2->cmsg_len = CMSG_LEN(sizeof (int));
+	cm2->cmsg_level = AF_UNIX;
+	cm2->cmsg_type = SCM_RIGHTS;
+	int *pfd = (void *)CMSG_DATA(cm2);
+	*pfd = 2;
+	/* do the syscalls */
+	marker1();
+	socketpair(AF_UNIX, SOCK_DGRAM, 0, fds);
+	setsockopt(fds[0], SOL_SOCKET, SO_PASSCRED, &itrue, sizeof itrue);
+	sendmsg(fds[1], &wmsg, 0);
+	recvmsg(fds[0], &rmsg, 0);
+	marker2();
+	return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.exp b/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.exp
new file mode 100644
index 0000000..e4d2370
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-recvmsg-reverse.exp
@@ -0,0 +1,73 @@ 
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+#
+# This test tests linux socketpair and recvmsg syscalls for reverse execution.
+#
+
+if ![supports_reverse] {
+    return
+}
+
+
+if ![istarget "*linux*"] then {
+    verbose "Skipping linux syscall reverse tests."
+    return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+runto main
+
+if [supports_process_record] {
+    # Activate process record/replay
+    gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variables were recorded properly on syscall, the old contents will
+# be remembered.  If not, new contents will be used, and the test will fail.
+
+# rdata should be "xxxx", not "cdab"
+gdb_test "print rdata" ".* = \"xxxx\"" "check recvmsg record - rdata"
+
+# rmsg.msg_flags should be zeros, not MSG_TRUNC | MSG_CTRUNC
+gdb_test "print rmsg.msg_flags" ".* = 0" "check recvmsg record - rmsg"
+
+# rmsg.msg_controllen should be sizeof rc, not actual size of control data
+# (7 bytes less)
+gdb_test "print rmsg.msg_controllen - sizeof rc" ".* = 0" "check recvmsg record - rmsg"
+
+# rc should be zeros, not received cmsg
+gdb_test "print ((struct cmsghdr *)rc)->cmsg_len" ".* = 0" "check recvmsg record - cmsg"
diff --git a/gdb/testsuite/gdb.reverse/linux-time-reverse.c b/gdb/testsuite/gdb.reverse/linux-time-reverse.c
new file mode 100644
index 0000000..ab6cba8
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-time-reverse.c
@@ -0,0 +1,38 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2008-2015 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#define _GNU_SOURCE
+#include <time.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+time_t time_global = -1;
+
+int main() {
+  marker1();
+  syscall(SYS_time, &time_global);
+  marker2();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-time-reverse.exp b/gdb/testsuite/gdb.reverse/linux-time-reverse.exp
new file mode 100644
index 0000000..04ffe10
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-time-reverse.exp
@@ -0,0 +1,63 @@ 
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+#
+# This test tests linux time syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+    return
+}
+
+
+if ![istarget "*linux*"] then {
+    verbose "Skipping linux syscall reverse tests."
+    return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+runto main
+
+if [supports_process_record] {
+    # Activate process record/replay
+    gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variable was recorded properly on syscall, the old contents (-1)
+# will be remembered.  If not, new contents (current time) will be used,
+# and the test will fail.
+
+gdb_test "print time_global" ".* = -1" "check time record"
diff --git a/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c
new file mode 100644
index 0000000..31aaef0
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.c
@@ -0,0 +1,41 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2008-2015 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+
+void marker1 ()
+{
+}
+
+void marker2 ()
+{
+}
+
+int status;
+
+int main() {
+  marker1();
+  if (!fork()) {
+    _exit(123);
+  } else {
+    waitpid(-1, &status, 0);
+  }
+  marker2();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp
new file mode 100644
index 0000000..9aa85a5
--- /dev/null
+++ b/gdb/testsuite/gdb.reverse/linux-waitpid-reverse.exp
@@ -0,0 +1,63 @@ 
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+#
+# This test tests linux waitpid syscall for reverse execution.
+#
+
+if ![supports_reverse] {
+    return
+}
+
+
+if ![istarget "*linux*"] then {
+    verbose "Skipping linux syscall reverse tests."
+    return
+}
+
+standard_testfile
+
+if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
+    return -1
+}
+
+runto main
+
+if [supports_process_record] {
+    # Activate process record/replay
+    gdb_test_no_output "record" "Turn on process record"
+}
+
+gdb_test "break marker1" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker1"
+
+gdb_test "break marker2" \
+    "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
+    "set breakpoint at marker2"
+
+gdb_continue_to_breakpoint "marker1" ".*$srcfile:.*"
+
+gdb_continue_to_breakpoint "marker2" ".*$srcfile:.*"
+
+gdb_test "reverse-continue" ".*$srcfile:$decimal.*" "reverse to marker1"
+
+# If the variable was recorded properly on syscall, the old contents (-1)
+# will be remembered.  If not, new contents (status) will be # used, and
+# the test will fail.
+
+gdb_test "print status" ".* = -1" "check waitpid record"