[binutils-gdb] sim: don't rely on inferior_ptid in gdbsim_target::wait

Simon Marchi simark@sourceware.org
Mon Jan 20 00:48:00 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=cf1d9e092f871df3b34a58cfcde915c689ac9067

commit cf1d9e092f871df3b34a58cfcde915c689ac9067
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Sun Jan 19 19:47:49 2020 -0500

    sim: don't rely on inferior_ptid in gdbsim_target::wait
    
    When running a program with the simulator target, I get:
    
        /home/simark/src/binutils-gdb/gdb/inferior.c:279: internal-error: inferior* find_inferior_pid(process_stratum_target*, int): Assertion `pid != 0' failed.
    
    This can be reproduced by building a GDB for --target=arm-none-gnueabi,
    and running with
    
        $ ./gdb -nx --data-directory=data-directory a.out -ex "target sim" -ex load -ex "b main" -ex r
    
    Where a.out is any program with a main.
    
    The problem is that gdbsim_target::wait assumes that inferior_ptid has
    the value of the thread it wants to report an event for.
    
    Actually, it's the target's responsibility to come up with the ptid of
    the thread the event is for.  In the sim target, that ptid is stored in
    sim_inferior_data::remote_sim_ptid, so return that instead of
    inferior_ptid.
    
    ChangeLog:
    
    	* remote-sim.c (gdbsim_target::wait): Return
    	sim_data->remote_sim_ptid instead of inferior_ptid.

Diff:
---
 ChangeLog        | 5 +++++
 gdb/remote-sim.c | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index e75c8c2..582d1f2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-19  Simon Marchi  <simon.marchi@polymtl.ca>
+
+	* remote-sim.c (gdbsim_target::wait): Return
+	sim_data->remote_sim_ptid instead of inferior_ptid.
+
 2020-01-18  Nick Clifton  <nickc@redhat.com>
 
 	Binutils 2.34 branch created.
diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index ac3b4d3..caa9446 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -1022,7 +1022,7 @@ gdbsim_target::wait (ptid_t ptid, struct target_waitstatus *status, int options)
       break;
     }
 
-  return inferior_ptid;
+  return sim_data->remote_sim_ptid;
 }
 
 /* Get ready to modify the registers array.  On machines which store



More information about the Binutils-cvs mailing list