Skip to content
Snippets Groups Projects
  1. Feb 28, 2023
    • Andrew Burgess's avatar
      gdb: fix mi breakpoint-deleted notifications for thread-specific b/p · 2968b79f
      Andrew Burgess authored
      Background
      ----------
      
      When a thread-specific breakpoint is deleted as a result of the
      specific thread exiting the function remove_threaded_breakpoints is
      called which sets the disposition of the breakpoint to
      disp_del_at_next_stop and sets the breakpoint number to 0.  Setting
      the breakpoint number to zero has the effect of hiding the breakpoint
      from the user.  We also print a message indicating that the breakpoint
      has been deleted.
      
      It was brought to my attention during a review of another patch[1]
      that setting a breakpoints number to zero will suppress the MI
      breakpoint-deleted notification for that breakpoint, and indeed, this
      can be seen to be true, in delete_breakpoint, if the breakpoint number
      is zero, then GDB will not notify the breakpoint_deleted observer.
      
      It seems wrong that a user created, thread-specific breakpoint, will
      have a =breakpoint-created notification, but will not have a
      =breakpoint-deleted notification.  I suspect that this is a bug.
      
      [1] https://sourceware.org/pipermail/gdb-patches/2023-February/196560.html
      
      The First Problem
      -----------------
      
      During my initial testing I wanted to see how GDB handled the
      breakpoint after it's number was set to zero.  To do this I created
      the testcase gdb.threads/thread-bp-deleted.exp.  This test creates a
      worker thread, which immediately exits.  After the worker thread has
      exited the main thread spins in a loop.
      
      In GDB I break once the worker thread has been created and place a
      thread-specific breakpoint, then use 'continue&' to resume the
      inferior in non-stop mode.  The worker thread then exits, but the main
      thread never stops - instead it sits in the spin.  I then tried to use
      'maint info breakpoints' to see what GDB thought of the
      thread-specific breakpoint.
      
      Unfortunately, GDB crashed like this:
      
        (gdb) continue&
        Continuing.
        (gdb) [Thread 0x7ffff7c5d700 (LWP 1202458) exited]
        Thread-specific breakpoint 3 deleted - thread 2 no longer in the thread list.
        maint info breakpoints
        ... snip some output ...
      
        Fatal signal: Segmentation fault
        ----- Backtrace -----
        0x5ffb62 gdb_internal_backtrace_1
                ../../src/gdb/bt-utils.c:122
        0x5ffc05 _Z22gdb_internal_backtracev
                ../../src/gdb/bt-utils.c:168
        0x89965e handle_fatal_signal
                ../../src/gdb/event-top.c:964
        0x8997ca handle_sigsegv
                ../../src/gdb/event-top.c:1037
        0x7f96f5971b1f ???
                /usr/src/debug/glibc-2.30-2-gd74461fa34/nptl/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
        0xe602b0 _Z15print_thread_idP11thread_info
                ../../src/gdb/thread.c:1439
        0x5b3d05 print_one_breakpoint_location
                ../../src/gdb/breakpoint.c:6542
        0x5b462e print_one_breakpoint
                ../../src/gdb/breakpoint.c:6702
        0x5b5354 breakpoint_1
                ../../src/gdb/breakpoint.c:6924
        0x5b58b8 maintenance_info_breakpoints
                ../../src/gdb/breakpoint.c:7009
        ... etc ...
      
      As the thread-specific breakpoint is set to disp_del_at_next_stop, and
      GDB hasn't stopped yet, then the breakpoint still exists in the global
      breakpoint list.
      
      The breakpoint will not show in 'info breakpoints' as its number is
      zero, but it will show in 'maint info breakpoints'.
      
      As GDB prints the breakpoint, the thread-id for the breakpoint is
      printed as part of the 'stop only in thread ...' line.  Printing the
      thread-id involves calling find_thread_global_id to convert the global
      thread-id into a thread_info*.  Then calling print_thread_id to
      convert the thread_info* into a string.
      
      The problem is that find_thread_global_id returns nullptr as the
      thread for the thread-specific breakpoint has exited.  The
      print_thread_id assumes it will be passed a non-nullptr.  As a result
      GDB crashes.
      
      In this commit I've added an assert to print_thread_id (gdb/thread.c)
      to check that the pointed passed in is not nullptr.  This assert would
      have triggered in the above case before GDB crashed.
      
      MI Notifications: The Dangers Of Changing A Breakpoint's Number
      ---------------------------------------------------------------
      
      Currently the delete_breakpoint function doesn't trigger the
      breakpoint_deleted observer for any breakpoint with the number zero.
      
      There is a comment explaining why this is the case in the code; it's
      something about watchpoints.  But I did consider just removing the 'is
      the number zero' guard and always triggering the breakpoint_deleted
      observer, figuring that I'd then fix the watchpoint issue some other
      way.
      
      But I realised this wasn't going to be good enough.  When the MI
      notification was delivered the number would be zero, so any frontend
      parsing the notifications would not be able to match
      =breakpoint-deleted notification to the earlier =breakpoint-created
      notification.
      
      What this means is that, at the point the breakpoint_deleted observer
      is called, the breakpoint's number must be correct.
      
      MI Notifications: The Dangers Of Delaying Deletion
      --------------------------------------------------
      
      The test I used to expose the above crash also brought another problem
      to my attention.  In the above test we used 'continue&' to resume,
      after which a thread exited, but the inferior didn't stop.  Recreating
      the same test in the MI looks like this:
      
        -break-insert -p 2 main
        ^done,bkpt={number="2",type="breakpoint",disp="keep",...<snip>...}
        (gdb)
        -exec-continue
        ^running
        *running,thread-id="all"
        (gdb)
        ~"[Thread 0x7ffff7c5d700 (LWP 987038) exited]\n"
        =thread-exited,id="2",group-id="i1"
        ~"Thread-specific breakpoint 2 deleted - thread 2 no longer in the thread list.\n"
      
      At this point the we have a single thread left, which is still
      running:
      
        -thread-info
        ^done,threads=[{id="1",target-id="Thread 0x7ffff7c5eb80 (LWP 987035)",name="thread-bp-delet",state="running",core="4"}],current-thread-id="1"
        (gdb)
      
      Notice that we got the =thread-exited notification from GDB as soon as
      the thread exited.  We also saw the CLI line from GDB, the line
      explaining that breakpoint 2 was deleted.  But, as expected, we didn't
      see the =breakpoint-deleted notification.
      
      I say "as expected" because the number was set to zero.  But, even if
      the number was not set to zero we still wouldn't see the
      notification.  The MI notification is driven by the breakpoint_deleted
      observer, which is only called when we actually delete the breakpoint,
      which is only done the next time GDB stops.
      
      Now, maybe this is fine.  The notification is delivered a little
      late.  But remember, by setting the number to zero the breakpoint will
      be hidden from the user, for example, the breakpoint is removed from
      the MI's -break-info command output.
      
      This means that GDB is in a position where the breakpoint doesn't show
      up in the breakpoint table, but a =breakpoint-deleted notification has
      not yet been sent out.  This doesn't seem right to me.
      
      What this means is that, when the thread exits, we should immediately
      be sending out the =breakpoint-deleted notification.  We should not
      wait for GDB to next stop before sending the notification.
      
      The Solution
      ------------
      
      My proposed solution is this; in remove_threaded_breakpoints, instead
      of setting the disposition to disp_del_at_next_stop and setting the
      number to zero, we now just call delete_breakpoint directly.
      
      The notification will now be sent out immediately; as soon as the
      thread exits.
      
      As the number has not changed when delete_breakpoint is called, the
      notification will have the correct number.
      
      And as the breakpoint is immediately removed from the breakpoint list,
      we no longer need to worry about 'maint info breakpoints' trying to
      print the thread-id for an exited thread.
      
      My only concern is that calling delete_breakpoint directly seems so
      obvious that I wonder why the original patch (that added
      remove_threaded_breakpoints) didn't take this approach.  This code was
      added in commit 49fa26b0, but the commit message offers no clues
      to why this approach was taken, and the original email thread offers
      no insights either[2].  There are no test regressions after making
      this change, so I'm hopeful that this is going to be fine.
      
      [2] https://sourceware.org/pipermail/gdb-patches/2013-September/106493.html
      
      
      
      The Complication
      ----------------
      
      Of course, it couldn't be that simple.
      
      The script gdb.python/py-finish-breakpoint.exp had some regressions
      during testing.
      
      The problem was with the FinishBreakpoint.out_of_scope callback
      implementation.  This callback is supposed to trigger whenever the
      FinishBreakpoint goes out of scope; and this includes when the thread
      for the breakpoint exits.
      
      The problem I ran into is the Python FinishBreakpoint implementation.
      Specifically, after this change I was loosing some of the out_of_scope
      calls.
      
      The problem is that the out_of_scope call (of which I'm interested) is
      triggered from the inferior_exit observer.  Before my change the
      observers were called in this order:
      
        thread_exit
        inferior_exit
        breakpoint_deleted
      
      The inferior_exit would trigger the out_of_scope call.
      
      After my change the breakpoint_deleted notification (for
      thread-specific breakpoints) occurs earlier, as soon as the
      thread-exits, so now the order is:
      
        thread_exit
        breakpoint_deleted
        inferior_exit
      
      Currently, after the breakpoint_deleted call the Python object
      associated with the breakpoint is released, so, when we get to the
      inferior_exit observer, there's no longer a Python object to call the
      out_of_scope method on.
      
      My solution is to follow the model for how bpfinishpy_pre_stop_hook
      and bpfinishpy_post_stop_hook are called, this is done from
      gdbpy_breakpoint_cond_says_stop in py-breakpoint.c.
      
      I've now added a new bpfinishpy_pre_delete_hook
      gdbpy_breakpoint_deleted in py-breakpoint.c, and from this new hook
      function I check and where needed call the out_of_scope method.
      
      With this fix in place I now see the
      gdb.python/py-finish-breakpoint.exp test fully passing again.
      
      Testing
      -------
      
      Tested on x86-64/Linux with unix, native-gdbserver, and
      native-extended-gdbserver boards.
      
      New tests added to covers all the cases I've discussed above.
      
      Approved-By: default avatarPedro Alves <pedro@palves.net>
      2968b79f
    • Kevin Buettner's avatar
      Python QUIT processing updates · b940a061
      Kevin Buettner authored
      See the previous patches in this series for the motivation behind
      these changes.
      
      This commit contains updates to Python's QUIT handling.  Ideally, we'd
      like to throw gdb_exception_forced_quit through the extension
      language; I made an attempt to do this for gdb_exception_quit in an
      earlier version of this patch, but Pedro pointed out that it is
      (almost certainly) not safe to do so.
      
      Still, we definitely don't want to swallow the exception representing
      a SIGTERM for GDB, nor do we want to force modules written in the
      extension language to have to explicitly handle this case.  Since the
      idea is for GDB to cleanup and quit for this exception, we'll simply
      call quit_force() just as if the gdb_exception_forced_quit propagation
      had managed to make it back to the top level.
      
      Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=26761
      
      
      Tested-by: default avatarTom de Vries <tdevries@suse.de>
      Approved-By: default avatarPedro Alves <pedro@palves.net>
      b940a061
  2. Feb 27, 2023
    • Tom Tromey's avatar
      Fix value chain use-after-free · f3d3bbbc
      Tom Tromey authored
      Hannes filed a bug showing a crash, where a pretty-printer written in
      Python could cause a use-after-free.  He sent a patch, but I thought a
      different approach was needed.
      
      In a much earlier patch (see bug #12533), we changed the Python code
      to release new values from the value chain when constructing a
      gdb.Value.  The rationale for this is that if you write a command that
      does a lot of computations in a loop, all the values will be kept live
      by the value chain, resulting in gdb using a large amount of memory.
      
      However, suppose a value is passed to Python from some code in gdb
      that needs to use the value after the call into Python.  In this
      scenario, value_to_value_object will still release the value -- and
      because gdb code doesn't generally keep strong references to values (a
      consequence of the ancient decision to use the value chain to avoid
      memory management), this will result in a use-after-free.
      
      This scenario can happen, as it turns out, when a value is passed to
      Python for pretty-printing.  Now, normally this route boxes the value
      via value_to_value_object_no_release, avoiding the problematic release
      from the value chain.  However, if you then call Value.cast, the
      underlying value API might return the same value, when is then
      released from the chain.
      
      This patch fixes the problem by changing how value boxing is done.
      value_to_value_object no longer removes a value from the chain.
      Instead, every spot in gdb that might construct new values uses a
      scoped_value_mark to ensure that the requirements of bug #12533 are
      met.  And, because incoming values aren't ever released from the chain
      (the Value.cast one comes earlier on the chain than the
      scoped_value_mark), the bug can no longer occur.  (Note that many
      spots in the Python layer already take this approach, so not many
      places needed to be touched.)
      
      In the future I think we should replace the use of raw "value *" with
      value_ref_ptr pretty much everywhere.  This will ensure lifetime
      safety throughout gdb.
      
      The test case in this patch comes from Hannes' original patch.  I only
      made a trivial ("require") change to it.  However, while this fails
      for him, I can't make it fail on this machine; nevertheless, he tried
      my patch and reported the bug as being fixed.
      
      Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30044
      f3d3bbbc
  3. Jan 01, 2023
  4. Dec 31, 2022
    • Tom de Vries's avatar
      [gdb/python] Fix gdb.python/py-finish-breakpoint2.exp for -m32 · 64760036
      Tom de Vries authored
      [ Partial resubmission of an earlier submission by Andrew (
      https://sourceware.org/pipermail/gdb-patches/2012-September/096347.html
      
       ), so
      listing him as co-author. ]
      
      With x86_64-linux and target board unix/-m32, we have:
      ...
      (gdb) continue^M
      Continuing.^M
      Exception #10^M
      ^M
      Breakpoint 3, throw_exception_1 (e=10) at py-finish-breakpoint2.cc:23^M
      23        throw new int (e);^M
      (gdb) FAIL: gdb.python/py-finish-breakpoint2.exp: \
        check FinishBreakpoint in catch()
      ...
      
      The following scenario happens:
      - set breakpoint in throw_exception_1, a function that throws an exception
      - continue
      - hit breakpoint, with call stack main.c:38 -> throw_exception_1
      - set a finish breakpoint
      - continue
      - hit the breakpoint again, with call stack main.c:48 -> throw_exception
        -> throw_exception_1
      
      Due to the exception, the function call did not properly terminate, and the
      finish breakpoint didn't trigger.  This is expected behaviour.
      
      However, the intention is that gdb detects this situation at the next stop
      and calls the out_of_scope callback, which would result here in this test-case
      in a rather confusing "exception did not finish" message.  So the problem is
      that this message doesn't show up, in other words, the out_of_scope callback
      is not called.
      
      [ Note that the fact that the situation is detected only at the next stop
      (wherever that happens to be) could be improved upon, and the earlier
      submission did that by setting a longjmp breakpoint.  But I'm considering this
      problem out-of-scope for this patch. ]
      
      Note that the message does show up later, at thread exit:
      ...
      [Inferior 1 (process 20046) exited with code 0236]^M
      exception did not finish ...^M
      ...
      
      The decision on whether to call the out_of_scope call back is taken in
      bpfinishpy_detect_out_scope_cb, and the interesting bit is here:
      ...
                   if (b->pspace == current_inferior ()->pspace
                       && (!target_has_registers ()
                           || frame_find_by_id (b->frame_id) == NULL))
                     bpfinishpy_out_of_scope (finish_bp);
      ...
      
      In the case of the thread exit, the callback triggers because
      target_has_registers () == 0.
      
      So why doesn't the callback trigger in the case of the breakpoint?
      
      Well, the b->frame_id is the frame_id of the frame of main (the frame
      in which the finish breakpoint is supposed to trigger), so AFAIU
      frame_find_by_id (b->frame_id) == NULL will only be true once we've
      left main, at which point I guess we don't stop till thread exit.
      
      Fix this by saving the frame in which the finish breakpoint was created, and
      using frame_find_by_id () == NULL on that frame instead, such that we have:
      ...
      (gdb) continue^M
      Continuing.^M
      Exception #10^M
      ^M
      Breakpoint 3, throw_exception_1 (e=10) at py-finish-breakpoint2.cc:23^M
      23        throw new int (e);^M
      exception did not finish ...^M
      (gdb) FAIL: gdb.python/py-finish-breakpoint2.exp: \
        check FinishBreakpoint in catch()
      ...
      
      Still, the test-case is failing because it's setup to match the behaviour that
      we get on x86_64-linux with target board unix/-m64:
      ...
      (gdb) continue^M
      Continuing.^M
      Exception #10^M
      stopped at ExceptionFinishBreakpoint^M
      (gdb) PASS: gdb.python/py-finish-breakpoint2.exp: \
        check FinishBreakpoint in catch()
      ...
      
      So what happens here?  Again, due to the exception, the function call did not
      properly terminate, but the finish breakpoint still triggers.  This is somewhat
      unexpected.  This happens because it just so happens to be that the frame
      return address at which the breakpoint is set, is also the first instruction
      after the exception has been handled.  This is a know problem, filed as
      PR29909, so KFAIL it, and modify the test-case to expect the out_of_scope
      callback.
      
      Also add a breakpoint after setting the finish breakpoint but before throwing
      the exception, to check that we don't call the out_of_scope callback too early.
      
      Tested on x86_64-linux, with target boards unix/-m32.
      
      Co-Authored-By: default avatarAndrew Burgess <aburgess@redhat.com>
      PR python/27247
      Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=27247
      64760036
  5. Dec 13, 2022
    • Johnson Sun's avatar
      Replace gdbpy_should_stop with gdbpy_breakpoint_cond_says_stop · d0d41b77
      Johnson Sun authored
      
      In 2014, the function `gdbpy_should_stop' has been replaced with
      `gdbpy_breakpoint_cond_says_stop'
      
      This replaces `gdbpy_should_stop' with `gdbpy_breakpoint_cond_says_stop' in the
      comments.
      
      Since `gdbpy_should_stop' has been renamed as noted in `gdb/ChangeLog-2014':
      
      	* python/py-breakpoint.c (gdbpy_breakpoint_cond_says_stop): Renamed
      	from gdbpy_should_stop.  Change result type to enum scr_bp_stop.
      
      Change-Id: I0ef3491ce5e057c5e75ef8b569803b30a5838575
      Approved-By: default avatarSimon Marchi <simon.marchi@efficios.com>
      d0d41b77
  6. Nov 18, 2022
    • Johnson Sun's avatar
      Fix deletion of FinishBreakpoints · 6533cbee
      Johnson Sun authored
      Currently, FinishBreakpoints are set at the return address of a frame based on
      the `finish' command, and are meant to be temporary breakpoints. However, they
      are not being cleaned up after use, as reported in PR python/18655. This was
      happening because the disposition of the breakpoint was not being set
      correctly.
      
      This commit fixes this issue by correctly setting the disposition in the
      post-stop hook of the breakpoint. It also adds a test to ensure this feature
      isn't regressed in the future.
      
      Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=18655
      6533cbee
  7. Oct 20, 2022
    • Andrew Burgess's avatar
      gdb/python: break more dependencies between gdbpy_initialize_* functions · 8a3b1706
      Andrew Burgess authored
      In a later commit in this series I will propose removing all of the
      explicit gdbpy_initialize_* calls from python.c and replace these
      calls with a more generic mechanism.
      
      One of the side effects of this generic mechanism is that the order in
      which the various Python sub-systems within GDB are initialized is no
      longer guaranteed.
      
      On the whole I don't think this matters, most of the sub-systems are
      independent of each other, though testing did reveal a few places
      where we did have dependencies, though I don't think those
      dependencies were explicitly documented in comment anywhere.
      
      This commit is similar to the previous one, and fixes the second
      dependency issue that I found.
      
      In this case the finish_breakpoint_object_type uses the
      breakpoint_object_type as its tp_base, this means that
      breakpoint_object_type must have been initialized with a call to
      PyType_Ready before finish_breakpoint_object_type can be initialized.
      
      Previously we depended on the ordering of calls to
      gdbpy_initialize_breakpoints and gdbpy_initialize_finishbreakpoints in
      python.c.
      
      After this commit a new function gdbpy_breakpoint_init_breakpoint_type
      exists, this function ensures that breakpoint_object_type has been
      initialized, and can be called from any gdbpy_initialize_* function.
      
      I feel that this change makes the dependency explicit, which I think
      is a good thing.
      
      There should be no user visible changes after this commit.
      8a3b1706
  8. Oct 18, 2022
  9. Oct 10, 2022
    • Tom Tromey's avatar
      Change GDB to use frame_info_ptr · bd2b40ac
      Tom Tromey authored
      
      This changes GDB to use frame_info_ptr instead of frame_info *
      The substitution was done with multiple sequential `sed` commands:
      
      sed 's/^struct frame_info;/class frame_info_ptr;/'
      sed 's/struct frame_info \*/frame_info_ptr /g' - which left some
          issues in a few files, that were manually fixed.
      sed 's/\<frame_info \*/frame_info_ptr /g'
      sed 's/frame_info_ptr $/frame_info_ptr/g' - used to remove whitespace
          problems.
      
      The changed files were then manually checked and some 'sed' changes
      undone, some constructors and some gets were added, according to what
      made sense, and what Tromey originally did
      
      Co-Authored-By: default avatarBruno Larsen <blarsen@redhat.com>
      Approved-by: default avatarTom Tomey <tom@tromey.com>
      bd2b40ac
    • Tom Tromey's avatar
      Remove frame_id_eq · a0cbd650
      Tom Tromey authored
      
      This replaces frame_id_eq with operator== and operator!=.  I wrote
      this for a version of this series that I later abandoned; but since it
      simplifies the code, I left this patch in.
      
      Approved-by: default avatarTom Tomey <tom@tromey.com>
      a0cbd650
  10. Sep 21, 2022
  11. Jun 17, 2022
    • Pedro Alves's avatar
      event_location -> location_spec · 264f9890
      Pedro Alves authored
      Currently, GDB internally uses the term "location" for both the
      location specification the user input (linespec, explicit location, or
      an address location), and for actual resolved locations, like the
      breakpoint locations, or the result of decoding a location spec to
      SaLs.  This is expecially confusing in the breakpoints module, as
      struct breakpoint has these two fields:
      
        breakpoint::location;
        breakpoint::loc;
      
      "location" is the location spec, and "loc" is the resolved locations.
      
      And then, we have a method called "locations()", which returns the
      resolved locations as range...
      
      The location spec type is presently called event_location:
      
        /* Location we used to set the breakpoint.  */
        event_location_up location;
      
      and it is described like this:
      
        /* The base class for all an event locations used to set a stop event
           in the inferior.  */
      
        struct event_location
        {
      
      and even that is incorrect...  Location specs are used for finding
      actual locations in the program in scenarios that have nothing to do
      with stop events.  E.g., "list" works with location specs.
      
      To clean all this confusion up, this patch renames "event_location" to
      "location_spec" throughout, and then all the variables that hold a
      location spec, they are renamed to include "spec" in their name, like
      e.g., "location" -> "locspec".  Similarly, functions that work with
      location specs, and currently have just "location" in their name are
      renamed to include "spec" in their name too.
      
      Change-Id: I5814124798aa2b2003e79496e78f95c74e5eddca
      264f9890
  12. May 20, 2022
    • Pedro Alves's avatar
      Rename base_breakpoint -> code_breakpoint · 74421c0b
      Pedro Alves authored
      Even after the previous patches reworking the inheritance of several
      breakpoint types, the present breakpoint hierarchy looks a bit
      surprising, as we have "breakpoint" as the superclass, and then
      "base_breakpoint" inherits from "breakpoint".  Like so, simplified:
      
         breakpoint
             base_breakpoint
                ordinary_breakpoint
      	  internal_breakpoint
      	  momentary_breakpoint
      	  ada_catchpoint
      	  exception_catchpoint
             tracepoint
             watchpoint
             catchpoint
      	  exec_catchpoint
      	  ...
      
      The surprising part to me is having "base_breakpoint" being a subclass
      of "breakpoint".  I'm just refering to naming here -- I mean, you'd
      expect that it would be the top level baseclass that would be called
      "base".
      
      Just flipping the names of breakpoint and base_breakpoint around
      wouldn't be super great for us, IMO, given we think of every type of
      *point as a breakpoint at the user visible level.  E.g., "info
      breakpoints" shows watchpoints, tracepoints, etc.  So it makes to call
      the top level class breakpoint.
      
      Instead, I propose renaming base_breakpoint to code_breakpoint.  The
      previous patches made sure that all code breakpoints inherit from
      base_breakpoint, so it's fitting.  Also, "code breakpoint" contrasts
      nicely with a watchpoint also being typically known as a "data
      breakpoint".
      
      After this commit, the resulting hierarchy looks like:
      
         breakpoint
             code_breakpoint
                ordinary_breakpoint
      	  internal_breakpoint
      	  momentary_breakpoint
      	  ada_catchpoint
      	  exception_catchpoint
             tracepoint
             watchpoint
             catchpoint
      	  exec_catchpoint
      	  ...
      
      ... which makes a lot more sense to me.
      
      I've left this patch as last in the series in case people want to
      bikeshed on the naming.
      
      "code" has a nice property that it's exactly as many letters as
      "base", so this patch didn't require any reindentation.  :-)
      
      Change-Id: Id8dc06683a69fad80d88e674f65e826d6a4e3f66
      74421c0b
  13. Apr 30, 2022
    • Tom Tromey's avatar
      Remove vtable_breakpoint_ops · a0cd5f08
      Tom Tromey authored
      There's no need to have vtable_breakpoint_ops any more, so remove it
      in favor of base_breakpoint_ops.
      
      a0cd5f08
    • Tom Tromey's avatar
      Convert ordinary breakpoints to vtable ops · 7dd8e7ae
      Tom Tromey authored
      This converts "ordinary" breakpoint to use vtable_breakpoint_ops.
      Recall that an ordinary breakpoint is both the kind normally created
      by users, and also a base class used by other classes.
      
      
      7dd8e7ae
  14. Feb 15, 2022
    • Lancelot SIX's avatar
      gdb: add a symbol* argument to get_return_value · e6b36367
      Lancelot SIX authored
      
      Add an argument to the get_return_value function to indicate the symbol
      of the function the debuggee is returning from.  This will be used by
      the following patch.
      
      Since the function return type can be deduced from the symbol remove the
      value_type argument which becomes redundant.
      
      No user visible change after this patch.
      
      Tested on x86_64-linux.
      
      Change-Id: Idf1279f1f7199f5022738a6679e0fa63fbd22edc
      Co-authored-by: default avatarSimon Marchi <simon.marchi@polymtl.ca>
      e6b36367
  15. Feb 06, 2022
    • Simon Marchi's avatar
      gdb: remove SYMBOL_TYPE macro · 5f9c5a63
      Simon Marchi authored
      Add a getter and a setter for a symbol's type.  Remove the corresponding
      macro and adjust all callers.
      
      Change-Id: Ie1a137744c5bfe1df4d4f9ae5541c5299577c8de
      5f9c5a63
  16. Jan 26, 2022
    • Tom Tromey's avatar
      Change how Python architecture and language are handled · 1da5d0e6
      Tom Tromey authored
      Currently, gdb's Python layer captures the current architecture and
      language when "entering" Python code.  This has some undesirable
      effects, and so this series changes how this is handled.
      
      First, there is code like this:
      
        gdbpy_enter enter_py (python_gdbarch, python_language);
      
      This is incorrect, because both of these are NULL when not otherwise
      assigned.  This can cause crashes in some cases -- I've added one to
      the test suite.  (Note that this crasher is just an example, other
      ones along the same lines are possible.)
      
      Second, when the language is captured in this way, it means that
      Python code cannot affect the current language for its own purposes.
      It's reasonable to want to write code like this:
      
          gdb.execute('set language mumble')
          ... stuff using the current language
          gdb.execute('set language previous-value')
      
      However, this won't actually work, because the language is captured on
      entry.  I've added a test to show this as well.
      
      This patch changes gdb to try to avoid capturing the current values.
      The Python concept of the current gdbarch is only set in those few
      cases where a non-default value is computed or needed; and the
      language is not captured at all -- instead, in the cases where it's
      required, the current language is temporarily changed.
      
      1da5d0e6
  17. Jan 01, 2022
  18. Nov 08, 2021
    • Simon Marchi's avatar
      gdb: remove bpstat typedef, rename bpstats to bpstat · 313f3b21
      Simon Marchi authored
      I don't find that the bpstat typedef, which hides a pointer, is
      particularly useful.  In fact, it confused me many times, and I just see
      it as something to remember that adds cognitive load.  Also, with C++,
      we might want to be able to pass bpstats objects by const-reference, not
      necessarily by pointer.
      
      So, remove the bpstat typedef and rename struct bpstats to bpstat (since
      it represents one bpstat, it makes sense that it is singular).
      
      Change-Id: I52e763b6e54ee666a9e045785f686d37b4f5f849
      313f3b21
  19. May 27, 2021
    • Simon Marchi's avatar
      gdb: remove iterate_over_breakpoints function · 240edef6
      Simon Marchi authored
      Now that we have range functions that let us use ranged for loops, we
      can remove iterate_over_breakpoints in favor of those, which are easier
      to read and write.  This requires exposing the declaration of
      all_breakpoints and all_breakpoints_safe in breakpoint.h, as well as the
      supporting types.
      
      Change some users of iterate_over_breakpoints to use all_breakpoints,
      when they don't need to delete the breakpoint, and all_breakpoints_safe
      otherwise.
      
      gdb/ChangeLog:
      
      	* breakpoint.h (iterate_over_breakpoints): Remove.  Update
      	callers to use all_breakpoints or all_breakpoints_safe.
      	(breakpoint_range, all_breakpoints, breakpoint_safe_range,
      	all_breakpoints_safe): Move here.
      	* breakpoint.c (all_breakpoints, all_breakpoints_safe): Make
      	non-static.
      	(iterate_over_breakpoints): Remove.
      	* python/py-finishbreakpoint.c (bpfinishpy_detect_out_scope_cb):
      	Return void.
      	* python/py-breakpoint.c (build_bp_list): Add comment, reverse
      	return value logic.
      	* guile/scm-breakpoint.c (bpscm_build_bp_list): Return void.
      
      Change-Id: Idde764a1f577de0423e4f2444a7d5cdb01ba5e48
      240edef6
  20. Apr 25, 2021
    • Simon Marchi's avatar
      gdbsupport, gdb: give names to observers · c90e7d63
      Simon Marchi authored
      Give a name to each observer, this will help produce more meaningful
      debug message.
      
      gdbsupport/ChangeLog:
      
      	* observable.h (class observable) <struct observer> <observer>:
      	Add name parameter.
      	<name>: New field.
      	<attach>: Add name parameter, update all callers.
      
      Change-Id: Ie0cc4664925215b8d2b09e026011b7803549fba0
      c90e7d63
  21. Apr 21, 2021
    • Tankut Baris Aktemur's avatar
      gdb/breakpoint: add a 'force_condition' parameter to 'create_breakpoint' · 10a636cc
      Tankut Baris Aktemur authored
      The 'create_breakpoint' function takes a 'parse_extra' argument that
      determines whether the condition, thread, and force-condition
      specifiers should be parsed from the extra string or be used from the
      function arguments.  However, for the case when 'parse_extra' is
      false, there is no way to pass the force-condition specifier.  This
      patch adds it as a new argument.
      
      Also, in the case when parse_extra is false, the current behavior is
      as if the condition is being forced.  This is a bug.  The default
      behavior should reject the breakpoint.  See below for a demo of this
      incorrect behavior.  (The MI command '-break-insert' uses the
      'create_breakpoint' function with parse_extra=0.)
      
        $ gdb -q --interpreter=mi3 /tmp/simple
        =thread-group-added,id="i1"
        =cmd-param-changed,param="history save",value="on"
        =cmd-param-changed,param="auto-load safe-path",value="/"
        ~"Reading symbols from /tmp/simple...\n"
        (gdb)
        -break-insert -c junk -f main
        &"warning: failed to validate condition at location 1, disabling:\n  "
        &"No symbol \"junk\" in current context.\n"
        ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="<MULTIPLE>",cond="junk",times="0",original-location="main",locations=[{number="1.1",enabled="N",addr="0x000000000000114e",func="main",file="/tmp/simple.c",fullname="/tmp/simple.c",line="2",thread-groups=["i1"]}]}
        (gdb)
        break main if junk
        &"break main if junk\n"
        &"No symbol \"junk\" in current context.\n"
        ^error,msg="No symbol \"junk\" in current context."
        (gdb)
        break main -force-condition if junk
        &"break main -force-condition if junk\n"
        ~"Note: breakpoint 1 also set at pc 0x114e.\n"
        &"warning: failed to validate condition at location 1, disabling:\n  "
        &"No symbol \"junk\" in current context.\n"
        ~"Breakpoint 2 at 0x114e: file /tmp/simple.c, line 2.\n"
        =breakpoint-created,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="<MULTIPLE>",cond="junk",times="0",original-location="main",locations=[{number="2.1",enabled="N",addr="0x000000000000114e",func="main",file="/tmp/simple.c",fullname="/tmp/simple.c",line="2",thread-groups=["i1"]}]}
        ^done
        (gdb)
      
      After applying this patch, we get the behavior below:
      
        (gdb)
        -break-insert -c junk -f main
        ^error,msg="No symbol \"junk\" in current context."
      
      This restores the behavior that is present in the existing releases.
      
      gdb/ChangeLog:
      2021-04-21  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
      
      	* breakpoint.h (create_breakpoint): Add a new parameter,
      	'force_condition'.
      	* breakpoint.c (create_breakpoint): Use the 'force_condition'
      	argument when 'parse_extra' is false to check if the condition
      	is invalid at all of the breakpoint locations.
      	Update the users below.
      	(break_command_1)
      	(dprintf_command)
      	(trace_command)
      	(ftrace_command)
      	(strace_command)
      	(create_tracepoint_from_upload): Update.
      	* guile/scm-breakpoint.c (gdbscm_register_breakpoint_x): Update.
      	* mi/mi-cmd-break.c (mi_cmd_break_insert_1): Update.
      	* python/py-breakpoint.c (bppy_init): Update.
      	* python/py-finishbreakpoint.c (bpfinishpy_init): Update.
      
      gdb/testsuite/ChangeLog:
      2021-04-21  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
      
      	* gdb.mi/mi-break.exp: Extend with checks for invalid breakpoint
      	conditions.
      10a636cc
  22. Jan 01, 2021
  23. Nov 02, 2020
    • Simon Marchi's avatar
      gdb, gdbserver, gdbsupport: fix leading space vs tabs issues · dda83cd7
      Simon Marchi authored
      Many spots incorrectly use only spaces for indentation (for example,
      there are a lot of spots in ada-lang.c).  I've always found it awkward
      when I needed to edit one of these spots: do I keep the original wrong
      indentation, or do I fix it?  What if the lines around it are also
      wrong, do I fix them too?  I probably don't want to fix them in the same
      patch, to avoid adding noise to my patch.
      
      So I propose to fix as much as possible once and for all (hopefully).
      
      One typical counter argument for this is that it makes code archeology
      more difficult, because git-blame will show this commit as the last
      change for these lines.  My counter counter argument is: when
      git-blaming, you often need to do "blame the file at the parent commit"
      anyway, to go past some other refactor that touched the line you are
      interested in, but is not the change you are looking for.  So you
      already need a somewhat efficient way to do this.
      
      Using some interactive tool, rather than plain git-blame, makes this
      trivial.  For example, I use "tig blame <file>", where going back past
      the commit that changed the currently selected line is one keystroke.
      It looks like Magit in Emacs does it too (though I've never used it).
      Web viewers of Github and Gitlab do it too.  My point is that it won't
      really make archeology more difficult.
      
      The other typical counter argument is that it will cause conflicts with
      existing patches.  That's true... but it's a one time cost, and those
      are not conflicts that are difficult to resolve.  I have also tried "git
      rebase --ignore-whitespace", it seems to work well.  Although that will
      re-introduce the faulty indentation, so one needs to take care of fixing
      the indentation in the patch after that (which is easy).
      
      gdb/ChangeLog:
      
      	* aarch64-linux-tdep.c: Fix indentation.
      	* aarch64-ravenscar-thread.c: Fix indentation.
      	* aarch64-tdep.c: Fix indentation.
      	* aarch64-tdep.h: Fix indentation.
      	* ada-lang.c: Fix indentation.
      	* ada-lang.h: Fix indentation.
      	* ada-tasks.c: Fix indentation.
      	* ada-typeprint.c: Fix indentation.
      	* ada-valprint.c: Fix indentation.
      	* ada-varobj.c: Fix indentation.
      	* addrmap.c: Fix indentation.
      	* addrmap.h: Fix indentation.
      	* agent.c: Fix indentation.
      	* aix-thread.c: Fix indentation.
      	* alpha-bsd-nat.c: Fix indentation.
      	* alpha-linux-tdep.c: Fix indentation.
      	* alpha-mdebug-tdep.c: Fix indentation.
      	* alpha-nbsd-tdep.c: Fix indentation.
      	* alpha-obsd-tdep.c: Fix indentation.
      	* alpha-tdep.c: Fix indentation.
      	* amd64-bsd-nat.c: Fix indentation.
      	* amd64-darwin-tdep.c: Fix indentation.
      	* amd64-linux-nat.c: Fix indentation.
      	* amd64-linux-tdep.c: Fix indentation.
      	* amd64-nat.c: Fix indentation.
      	* amd64-obsd-tdep.c: Fix indentation.
      	* amd64-tdep.c: Fix indentation.
      	* amd64-windows-tdep.c: Fix indentation.
      	* annotate.c: Fix indentation.
      	* arc-tdep.c: Fix indentation.
      	* arch-utils.c: Fix indentation.
      	* arch/arm-get-next-pcs.c: Fix indentation.
      	* arch/arm.c: Fix indentation.
      	* arm-linux-nat.c: Fix indentation.
      	* arm-linux-tdep.c: Fix indentation.
      	* arm-nbsd-tdep.c: Fix indentation.
      	* arm-pikeos-tdep.c: Fix indentation.
      	* arm-tdep.c: Fix indentation.
      	* arm-tdep.h: Fix indentation.
      	* arm-wince-tdep.c: Fix indentation.
      	* auto-load.c: Fix indentation.
      	* auxv.c: Fix indentation.
      	* avr-tdep.c: Fix indentation.
      	* ax-gdb.c: Fix indentation.
      	* ax-general.c: Fix indentation.
      	* bfin-linux-tdep.c: Fix indentation.
      	* block.c: Fix indentation.
      	* block.h: Fix indentation.
      	* blockframe.c: Fix indentation.
      	* bpf-tdep.c: Fix indentation.
      	* break-catch-sig.c: Fix indentation.
      	* break-catch-syscall.c: Fix indentation.
      	* break-catch-throw.c: Fix indentation.
      	* breakpoint.c: Fix indentation.
      	* breakpoint.h: Fix indentation.
      	* bsd-uthread.c: Fix indentation.
      	* btrace.c: Fix indentation.
      	* build-id.c: Fix indentation.
      	* buildsym-legacy.h: Fix indentation.
      	* buildsym.c: Fix indentation.
      	* c-typeprint.c: Fix indentation.
      	* c-valprint.c: Fix indentation.
      	* c-varobj.c: Fix indentation.
      	* charset.c: Fix indentation.
      	* cli/cli-cmds.c: Fix indentation.
      	* cli/cli-decode.c: Fix indentation.
      	* cli/cli-decode.h: Fix indentation.
      	* cli/cli-script.c: Fix indentation.
      	* cli/cli-setshow.c: Fix indentation.
      	* coff-pe-read.c: Fix indentation.
      	* coffread.c: Fix indentation.
      	* compile/compile-cplus-types.c: Fix indentation.
      	* compile/compile-object-load.c: Fix indentation.
      	* compile/compile-object-run.c: Fix indentation.
      	* completer.c: Fix indentation.
      	* corefile.c: Fix indentation.
      	* corelow.c: Fix indentation.
      	* cp-abi.h: Fix indentation.
      	* cp-namespace.c: Fix indentation.
      	* cp-support.c: Fix indentation.
      	* cp-valprint.c: Fix indentation.
      	* cris-linux-tdep.c: Fix indentation.
      	* cris-tdep.c: Fix indentation.
      	* darwin-nat-info.c: Fix indentation.
      	* darwin-nat.c: Fix indentation.
      	* darwin-nat.h: Fix indentation.
      	* dbxread.c: Fix indentation.
      	* dcache.c: Fix indentation.
      	* disasm.c: Fix indentation.
      	* dtrace-probe.c: Fix indentation.
      	* dwarf2/abbrev.c: Fix indentation.
      	* dwarf2/attribute.c: Fix indentation.
      	* dwarf2/expr.c: Fix indentation.
      	* dwarf2/frame.c: Fix indentation.
      	* dwarf2/index-cache.c: Fix indentation.
      	* dwarf2/index-write.c: Fix indentation.
      	* dwarf2/line-header.c: Fix indentation.
      	* dwarf2/loc.c: Fix indentation.
      	* dwarf2/macro.c: Fix indentation.
      	* dwarf2/read.c: Fix indentation.
      	* dwarf2/read.h: Fix indentation.
      	* elfread.c: Fix indentation.
      	* eval.c: Fix indentation.
      	* event-top.c: Fix indentation.
      	* exec.c: Fix indentation.
      	* exec.h: Fix indentation.
      	* expprint.c: Fix indentation.
      	* f-lang.c: Fix indentation.
      	* f-typeprint.c: Fix indentation.
      	* f-valprint.c: Fix indentation.
      	* fbsd-nat.c: Fix indentation.
      	* fbsd-tdep.c: Fix indentation.
      	* findvar.c: Fix indentation.
      	* fork-child.c: Fix indentation.
      	* frame-unwind.c: Fix indentation.
      	* frame-unwind.h: Fix indentation.
      	* frame.c: Fix indentation.
      	* frv-linux-tdep.c: Fix indentation.
      	* frv-tdep.c: Fix indentation.
      	* frv-tdep.h: Fix indentation.
      	* ft32-tdep.c: Fix indentation.
      	* gcore.c: Fix indentation.
      	* gdb_bfd.c: Fix indentation.
      	* gdbarch.sh: Fix indentation.
      	* gdbarch.c: Re-generate
      	* gdbarch.h: Re-generate.
      	* gdbcore.h: Fix indentation.
      	* gdbthread.h: Fix indentation.
      	* gdbtypes.c: Fix indentation.
      	* gdbtypes.h: Fix indentation.
      	* glibc-tdep.c: Fix indentation.
      	* gnu-nat.c: Fix indentation.
      	* gnu-nat.h: Fix indentation.
      	* gnu-v2-abi.c: Fix indentation.
      	* gnu-v3-abi.c: Fix indentation.
      	* go32-nat.c: Fix indentation.
      	* guile/guile-internal.h: Fix indentation.
      	* guile/scm-cmd.c: Fix indentation.
      	* guile/scm-frame.c: Fix indentation.
      	* guile/scm-iterator.c: Fix indentation.
      	* guile/scm-math.c: Fix indentation.
      	* guile/scm-ports.c: Fix indentation.
      	* guile/scm-pretty-print.c: Fix indentation.
      	* guile/scm-value.c: Fix indentation.
      	* h8300-tdep.c: Fix indentation.
      	* hppa-linux-nat.c: Fix indentation.
      	* hppa-linux-tdep.c: Fix indentation.
      	* hppa-nbsd-nat.c: Fix indentation.
      	* hppa-nbsd-tdep.c: Fix indentation.
      	* hppa-obsd-nat.c: Fix indentation.
      	* hppa-tdep.c: Fix indentation.
      	* hppa-tdep.h: Fix indentation.
      	* i386-bsd-nat.c: Fix indentation.
      	* i386-darwin-nat.c: Fix indentation.
      	* i386-darwin-tdep.c: Fix indentation.
      	* i386-dicos-tdep.c: Fix indentation.
      	* i386-gnu-nat.c: Fix indentation.
      	* i386-linux-nat.c: Fix indentation.
      	* i386-linux-tdep.c: Fix indentation.
      	* i386-nto-tdep.c: Fix indentation.
      	* i386-obsd-tdep.c: Fix indentation.
      	* i386-sol2-nat.c: Fix indentation.
      	* i386-tdep.c: Fix indentation.
      	* i386-tdep.h: Fix indentation.
      	* i386-windows-tdep.c: Fix indentation.
      	* i387-tdep.c: Fix indentation.
      	* i387-tdep.h: Fix indentation.
      	* ia64-libunwind-tdep.c: Fix indentation.
      	* ia64-libunwind-tdep.h: Fix indentation.
      	* ia64-linux-nat.c: Fix indentation.
      	* ia64-linux-tdep.c: Fix indentation.
      	* ia64-tdep.c: Fix indentation.
      	* ia64-tdep.h: Fix indentation.
      	* ia64-vms-tdep.c: Fix indentation.
      	* infcall.c: Fix indentation.
      	* infcmd.c: Fix indentation.
      	* inferior.c: Fix indentation.
      	* infrun.c: Fix indentation.
      	* iq2000-tdep.c: Fix indentation.
      	* language.c: Fix indentation.
      	* linespec.c: Fix indentation.
      	* linux-fork.c: Fix indentation.
      	* linux-nat.c: Fix indentation.
      	* linux-tdep.c: Fix indentation.
      	* linux-thread-db.c: Fix indentation.
      	* lm32-tdep.c: Fix indentation.
      	* m2-lang.c: Fix indentation.
      	* m2-typeprint.c: Fix indentation.
      	* m2-valprint.c: Fix indentation.
      	* m32c-tdep.c: Fix indentation.
      	* m32r-linux-tdep.c: Fix indentation.
      	* m32r-tdep.c: Fix indentation.
      	* m68hc11-tdep.c: Fix indentation.
      	* m68k-bsd-nat.c: Fix indentation.
      	* m68k-linux-nat.c: Fix indentation.
      	* m68k-linux-tdep.c: Fix indentation.
      	* m68k-tdep.c: Fix indentation.
      	* machoread.c: Fix indentation.
      	* macrocmd.c: Fix indentation.
      	* macroexp.c: Fix indentation.
      	* macroscope.c: Fix indentation.
      	* macrotab.c: Fix indentation.
      	* macrotab.h: Fix indentation.
      	* main.c: Fix indentation.
      	* mdebugread.c: Fix indentation.
      	* mep-tdep.c: Fix indentation.
      	* mi/mi-cmd-catch.c: Fix indentation.
      	* mi/mi-cmd-disas.c: Fix indentation.
      	* mi/mi-cmd-env.c: Fix indentation.
      	* mi/mi-cmd-stack.c: Fix indentation.
      	* mi/mi-cmd-var.c: Fix indentation.
      	* mi/mi-cmds.c: Fix indentation.
      	* mi/mi-main.c: Fix indentation.
      	* mi/mi-parse.c: Fix indentation.
      	* microblaze-tdep.c: Fix indentation.
      	* minidebug.c: Fix indentation.
      	* minsyms.c: Fix indentation.
      	* mips-linux-nat.c: Fix indentation.
      	* mips-linux-tdep.c: Fix indentation.
      	* mips-nbsd-tdep.c: Fix indentation.
      	* mips-tdep.c: Fix indentation.
      	* mn10300-linux-tdep.c: Fix indentation.
      	* mn10300-tdep.c: Fix indentation.
      	* moxie-tdep.c: Fix indentation.
      	* msp430-tdep.c: Fix indentation.
      	* namespace.h: Fix indentation.
      	* nat/fork-inferior.c: Fix indentation.
      	* nat/gdb_ptrace.h: Fix indentation.
      	* nat/linux-namespaces.c: Fix indentation.
      	* nat/linux-osdata.c: Fix indentation.
      	* nat/netbsd-nat.c: Fix indentation.
      	* nat/x86-dregs.c: Fix indentation.
      	* nbsd-nat.c: Fix indentation.
      	* nbsd-tdep.c: Fix indentation.
      	* nios2-linux-tdep.c: Fix indentation.
      	* nios2-tdep.c: Fix indentation.
      	* nto-procfs.c: Fix indentation.
      	* nto-tdep.c: Fix indentation.
      	* objfiles.c: Fix indentation.
      	* objfiles.h: Fix indentation.
      	* opencl-lang.c: Fix indentation.
      	* or1k-tdep.c: Fix indentation.
      	* osabi.c: Fix indentation.
      	* osabi.h: Fix indentation.
      	* osdata.c: Fix indentation.
      	* p-lang.c: Fix indentation.
      	* p-typeprint.c: Fix indentation.
      	* p-valprint.c: Fix indentation.
      	* parse.c: Fix indentation.
      	* ppc-linux-nat.c: Fix indentation.
      	* ppc-linux-tdep.c: Fix indentation.
      	* ppc-nbsd-nat.c: Fix indentation.
      	* ppc-nbsd-tdep.c: Fix indentation.
      	* ppc-obsd-nat.c: Fix indentation.
      	* ppc-ravenscar-thread.c: Fix indentation.
      	* ppc-sysv-tdep.c: Fix indentation.
      	* ppc64-tdep.c: Fix indentation.
      	* printcmd.c: Fix indentation.
      	* proc-api.c: Fix indentation.
      	* producer.c: Fix indentation.
      	* producer.h: Fix indentation.
      	* prologue-value.c: Fix indentation.
      	* prologue-value.h: Fix indentation.
      	* psymtab.c: Fix indentation.
      	* python/py-arch.c: Fix indentation.
      	* python/py-bpevent.c: Fix indentation.
      	* python/py-event.c: Fix indentation.
      	* python/py-event.h: Fix indentation.
      	* python/py-finishbreakpoint.c: Fix indentation.
      	* python/py-frame.c: Fix indentation.
      	* python/py-framefilter.c: Fix indentation.
      	* python/py-inferior.c: Fix indentation.
      	* python/py-infthread.c: Fix indentation.
      	* python/py-objfile.c: Fix indentation.
      	* python/py-prettyprint.c: Fix indentation.
      	* python/py-registers.c: Fix indentation.
      	* python/py-signalevent.c: Fix indentation.
      	* python/py-stopevent.c: Fix indentation.
      	* python/py-stopevent.h: Fix indentation.
      	* python/py-threadevent.c: Fix indentation.
      	* python/py-tui.c: Fix indentation.
      	* python/py-unwind.c: Fix indentation.
      	* python/py-value.c: Fix indentation.
      	* python/py-xmethods.c: Fix indentation.
      	* python/python-internal.h: Fix indentation.
      	* python/python.c: Fix indentation.
      	* ravenscar-thread.c: Fix indentation.
      	* record-btrace.c: Fix indentation.
      	* record-full.c: Fix indentation.
      	* record.c: Fix indentation.
      	* reggroups.c: Fix indentation.
      	* regset.h: Fix indentation.
      	* remote-fileio.c: Fix indentation.
      	* remote.c: Fix indentation.
      	* reverse.c: Fix indentation.
      	* riscv-linux-tdep.c: Fix indentation.
      	* riscv-ravenscar-thread.c: Fix indentation.
      	* riscv-tdep.c: Fix indentation.
      	* rl78-tdep.c: Fix indentation.
      	* rs6000-aix-tdep.c: Fix indentation.
      	* rs6000-lynx178-tdep.c: Fix indentation.
      	* rs6000-nat.c: Fix indentation.
      	* rs6000-tdep.c: Fix indentation.
      	* rust-lang.c: Fix indentation.
      	* rx-tdep.c: Fix indentation.
      	* s12z-tdep.c: Fix indentation.
      	* s390-linux-tdep.c: Fix indentation.
      	* score-tdep.c: Fix indentation.
      	* ser-base.c: Fix indentation.
      	* ser-mingw.c: Fix indentation.
      	* ser-uds.c: Fix indentation.
      	* ser-unix.c: Fix indentation.
      	* serial.c: Fix indentation.
      	* sh-linux-tdep.c: Fix indentation.
      	* sh-nbsd-tdep.c: Fix indentation.
      	* sh-tdep.c: Fix indentation.
      	* skip.c: Fix indentation.
      	* sol-thread.c: Fix indentation.
      	* solib-aix.c: Fix indentation.
      	* solib-darwin.c: Fix indentation.
      	* solib-frv.c: Fix indentation.
      	* solib-svr4.c: Fix indentation.
      	* solib.c: Fix indentation.
      	* source.c: Fix indentation.
      	* sparc-linux-tdep.c: Fix indentation.
      	* sparc-nbsd-tdep.c: Fix indentation.
      	* sparc-obsd-tdep.c: Fix indentation.
      	* sparc-ravenscar-thread.c: Fix indentation.
      	* sparc-tdep.c: Fix indentation.
      	* sparc64-linux-tdep.c: Fix indentation.
      	* sparc64-nbsd-tdep.c: Fix indentation.
      	* sparc64-obsd-tdep.c: Fix indentation.
      	* sparc64-tdep.c: Fix indentation.
      	* stabsread.c: Fix indentation.
      	* stack.c: Fix indentation.
      	* stap-probe.c: Fix indentation.
      	* stubs/ia64vms-stub.c: Fix indentation.
      	* stubs/m32r-stub.c: Fix indentation.
      	* stubs/m68k-stub.c: Fix indentation.
      	* stubs/sh-stub.c: Fix indentation.
      	* stubs/sparc-stub.c: Fix indentation.
      	* symfile-mem.c: Fix indentation.
      	* symfile.c: Fix indentation.
      	* symfile.h: Fix indentation.
      	* symmisc.c: Fix indentation.
      	* symtab.c: Fix indentation.
      	* symtab.h: Fix indentation.
      	* target-float.c: Fix indentation.
      	* target.c: Fix indentation.
      	* target.h: Fix indentation.
      	* tic6x-tdep.c: Fix indentation.
      	* tilegx-linux-tdep.c: Fix indentation.
      	* tilegx-tdep.c: Fix indentation.
      	* top.c: Fix indentation.
      	* tracefile-tfile.c: Fix indentation.
      	* tracepoint.c: Fix indentation.
      	* tui/tui-disasm.c: Fix indentation.
      	* tui/tui-io.c: Fix indentation.
      	* tui/tui-regs.c: Fix indentation.
      	* tui/tui-stack.c: Fix indentation.
      	* tui/tui-win.c: Fix indentation.
      	* tui/tui-winsource.c: Fix indentation.
      	* tui/tui.c: Fix indentation.
      	* typeprint.c: Fix indentation.
      	* ui-out.h: Fix indentation.
      	* unittests/copy_bitwise-selftests.c: Fix indentation.
      	* unittests/memory-map-selftests.c: Fix indentation.
      	* utils.c: Fix indentation.
      	* v850-tdep.c: Fix indentation.
      	* valarith.c: Fix indentation.
      	* valops.c: Fix indentation.
      	* valprint.c: Fix indentation.
      	* valprint.h: Fix indentation.
      	* value.c: Fix indentation.
      	* value.h: Fix indentation.
      	* varobj.c: Fix indentation.
      	* vax-tdep.c: Fix indentation.
      	* windows-nat.c: Fix indentation.
      	* windows-tdep.c: Fix indentation.
      	* xcoffread.c: Fix indentation.
      	* xml-syscall.c: Fix indentation.
      	* xml-tdesc.c: Fix indentation.
      	* xstormy16-tdep.c: Fix indentation.
      	* xtensa-config.c: Fix indentation.
      	* xtensa-linux-nat.c: Fix indentation.
      	* xtensa-linux-tdep.c: Fix indentation.
      	* xtensa-tdep.c: Fix indentation.
      
      gdbserver/ChangeLog:
      
      	* ax.cc: Fix indentation.
      	* dll.cc: Fix indentation.
      	* inferiors.h: Fix indentation.
      	* linux-low.cc: Fix indentation.
      	* linux-nios2-low.cc: Fix indentation.
      	* linux-ppc-ipa.cc: Fix indentation.
      	* linux-ppc-low.cc: Fix indentation.
      	* linux-x86-low.cc: Fix indentation.
      	* linux-xtensa-low.cc: Fix indentation.
      	* regcache.cc: Fix indentation.
      	* server.cc: Fix indentation.
      	* tracepoint.cc: Fix indentation.
      
      gdbsupport/ChangeLog:
      
      	* common-exceptions.h: Fix indentation.
      	* event-loop.cc: Fix indentation.
      	* fileio.cc: Fix indentation.
      	* filestuff.cc: Fix indentation.
      	* gdb-dlfcn.cc: Fix indentation.
      	* gdb_string_view.h: Fix indentation.
      	* job-control.cc: Fix indentation.
      	* signals.cc: Fix indentation.
      
      Change-Id: I4bad7ae6be0fbe14168b8ebafb98ffe14964a695
      dda83cd7
  24. Sep 29, 2020
    • Tom Tromey's avatar
      Remove target_has_registers macro · 9dccd06e
      Tom Tromey authored
      This removes the target_has_registers object-like macro, replacing it
      with the underlying function.
      
      gdb/ChangeLog
      2020-09-28  Tom Tromey  <tom@tromey.com>
      
      	* tui/tui-regs.c (tui_get_register)
      	(tui_data_window::show_registers): Update.
      	* thread.c (scoped_restore_current_thread::restore)
      	(scoped_restore_current_thread::scoped_restore_current_thread):
      	Update.
      	* regcache-dump.c (regcache_print): Update.
      	* python/py-finishbreakpoint.c (bpfinishpy_detect_out_scope_cb):
      	Update.
      	* mi/mi-main.c (mi_cmd_data_write_register_values): Update.
      	* mep-tdep.c (current_me_module, current_options): Update.
      	* linux-thread-db.c (thread_db_load): Update.
      	* infcmd.c (registers_info, info_vector_command)
      	(info_float_command): Update.
      	* ia64-tdep.c (ia64_frame_prev_register)
      	(ia64_sigtramp_frame_prev_register): Update.
      	* ia64-libunwind-tdep.c (libunwind_frame_prev_register): Update.
      	* gcore.c (derive_stack_segment): Update.
      	* frame.c (get_current_frame, has_stack_frames): Update.
      	* findvar.c (language_defn::read_var_value): Update.
      	* arm-tdep.c (arm_pc_is_thumb): Update.
      	* target.c (target_has_registers): Rename from
      	target_has_registers_1.
      	* target.h (target_has_registers): Remove macro.
      	(target_has_registers): Rename from target_has_registers_1.
      9dccd06e
  25. May 14, 2020
    • Simon Marchi's avatar
      gdb: remove TYPE_CODE macro · 78134374
      Simon Marchi authored
      Remove TYPE_CODE, changing all the call sites to use type::code
      directly.  This is quite a big diff, but this was mostly done using sed
      and coccinelle.  A few call sites were done by hand.
      
      gdb/ChangeLog:
      
      	* gdbtypes.h (TYPE_CODE): Remove.  Change all call sites to use
      	type::code instead.
      78134374
  26. Jan 01, 2020
  27. Nov 18, 2019
    • Philippe Waroquiers's avatar
      Fix a bunch of python leaks due to missing calls to tp_free in *_dealloc functions. · 2e953aca
      Philippe Waroquiers authored
      valgrind reports leaks in many python tests, such as:
      ==17162== VALGRIND_GDB_ERROR_BEGIN
      ==17162== 8,208 (5,472 direct, 2,736 indirect) bytes in 57 blocks are definitely lost in loss record 7,551 of 7,679
      ==17162==    at 0x4835753: malloc (vg_replace_malloc.c:307)
      ==17162==    by 0x6EAFD1: _PyObject_New (object.c:279)
      ==17162==    by 0x4720E6: blpy_iter(_object*) (py-block.c:92)
      ==17162==    by 0x698772: PyObject_GetIter (abstract.c:2577)
      ==17162==    by 0x2343BE: _PyEval_EvalFrameDefault (ceval.c:3159)
      ==17162==    by 0x22E9E2: function_code_fastcall (call.c:283)
      ==17162==    by 0x2340A8: _PyObject_Vectorcall (abstract.h:127)
      ==17162==    by 0x2340A8: call_function (ceval.c:4987)
      ==17162==    by 0x2340A8: _PyEval_EvalFrameDefault (ceval.c:3486)
      ==17162==    by 0x22E9E2: function_code_fastcall (call.c:283)
      ==17162==    by 0x82172B: _PyObject_Vectorcall (abstract.h:127)
      ==17162==    by 0x82172B: method_vectorcall (classobject.c:67)
      ==17162==    by 0x6AF474: _PyObject_Vectorcall (abstract.h:127)
      ==17162==    by 0x6AF474: _PyObject_CallNoArg (abstract.h:153)
      ==17162==    by 0x6AF474: _PyObject_CallFunctionVa (call.c:914)
      ==17162==    by 0x6B0673: callmethod (call.c:1010)
      ==17162==    by 0x6B0673: _PyObject_CallMethod_SizeT (call.c:1103)
      ==17162==    by 0x477DFE: gdb_PyObject_CallMethod<> (python-internal.h:182)
      ==17162==    by 0x477DFE: get_py_iter_from_func(_object*, char const*) (py-framefilter.c:272)
      ==17162==    by 0x4791B4: py_print_args (py-framefilter.c:706)
      ==17162==    by 0x4791B4: py_print_frame(_object*, enum_flags<frame_filter_flag>, ext_lang_frame_args, ui_out*, int, htab*) (py-framefilter.c:960)
      ==17162==    by 0x47A130: gdbpy_apply_frame_filter(extension_language_defn const*, frame_info*, enum_flags<frame_filter_flag>, ext_lang_frame_args, ui_out*, int, int) (py-framefilter.c:1236)
      ==17162==    by 0x369C39: apply_ext_lang_frame_filter(frame_info*, enum_flags<frame_filter_flag>, ext_lang_frame_args, ui_out*, int, int) (extension.c:563)
      ==17162==    by 0x4EC9C9: backtrace_command_1 (stack.c:2031)
      ==17162==    by 0x4EC9C9: backtrace_command(char const*, int) (stack.c:2183)
      ...
      
      Most of the leaks in python tests are due to the fact that many
      PyObject xxxxx_dealloc functions are missing the line to free self
      or obj such as:
         Py_TYPE (self)->tp_free (self);
      or
         Py_TYPE (obj)->tp_free (obj);
      
      With this patch, the number of python tests leaking decreases from 52 to 12.
      
      gdb/ChangeLog
      
      2019-11-18  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
      
      	* python/py-block.c (blpy_dealloc): Call tp_free.
      	(blpy_block_syms_dealloc): Likewise.
      	* python/py-finishbreakpoint.c (bpfinishpy_dealloc): Likewise.
      	* python/py-inferior.c (infpy_dealloc): Likewise.
      	* python/py-lazy-string.c (stpy_dealloc): Likewise.
      	* python/py-linetable.c (ltpy_iterator_dealloc): Likewise.
      	* python/py-symbol.c (sympy_dealloc): Likewise.
      	* python/py-symtab.c (stpy_dealloc): Likewise.
      	* python/py-type.c (typy_iterator_dealloc): Likewise.
      2e953aca
  28. Oct 15, 2019
    • Christian Biesinger's avatar
      Change iterate_over_breakpoints to take a function_view · 95da600f
      Christian Biesinger authored
      This allows callers to pass in capturing lambdas.  Also changes the return
      type to bool.
      
      gdb/ChangeLog:
      
      2019-10-15  Christian Biesinger  <cbiesinger@google.com>
      
      	* breakpoint.c (iterate_over_breakpoints): Change function pointer
      	to a gdb::function_view and return value to bool.
      	* breakpoint.h (iterate_over_breakpoints): Likewise.
      	* dummy-frame.c (pop_dummy_frame_bpt): Update.
      	(pop_dummy_frame): Update.
      	* guile/scm-breakpoint.c (bpscm_build_bp_list): Update.
      	(gdbscm_breakpoints): Update.
      	* python/py-breakpoint.c (build_bp_list): Update.
      	(gdbpy_breakpoints): Update.
      	* python/py-finishbreakpoint.c (bpfinishpy_detect_out_scope_cb):
      	Update.
      	(bpfinishpy_handle_stop): Update.
      	(bpfinishpy_handle_exit): Update.
      	* solib-svr4.c (svr4_update_solib_event_breakpoint): Update.
      	(svr4_update_solib_event_breakpoints): Update.
      
      Change-Id: Ia9de4deecae562a70a40f5cd49f5a74d64570251
      95da600f
  29. Apr 08, 2019
    • Tom Tromey's avatar
      Rename gdb exception types · 230d2906
      Tom Tromey authored
      This renames the gdb exception types.  The old types were only needed
      due to the macros in common-exception.h that are now gone.
      
      The intermediate layer of gdb_exception_RETURN_MASK_ALL did not seem
      needed, so this patch removes it entirely.
      
      gdb/ChangeLog
      2019-04-08  Tom Tromey  <tom@tromey.com>
      
      	* common/common-exceptions.h (gdb_exception_RETURN_MASK_ALL):
      	Remove.
      	(gdb_exception_error): Rename from
      	gdb_exception_RETURN_MASK_ERROR.
      	(gdb_exception_quit): Rename from gdb_exception_RETURN_MASK_QUIT.
      	(gdb_quit_bad_alloc): Update.
      	* aarch64-tdep.c: Update.
      	* ada-lang.c: Update.
      	* ada-typeprint.c: Update.
      	* ada-valprint.c: Update.
      	* amd64-tdep.c: Update.
      	* arch-utils.c: Update.
      	* break-catch-throw.c: Update.
      	* breakpoint.c: Update.
      	* btrace.c: Update.
      	* c-varobj.c: Update.
      	* cli/cli-cmds.c: Update.
      	* cli/cli-interp.c: Update.
      	* cli/cli-script.c: Update.
      	* common/common-exceptions.c: Update.
      	* common/new-op.c: Update.
      	* common/selftest.c: Update.
      	* compile/compile-c-symbols.c: Update.
      	* compile/compile-cplus-symbols.c: Update.
      	* compile/compile-object-load.c: Update.
      	* compile/compile-object-run.c: Update.
      	* completer.c: Update.
      	* corelow.c: Update.
      	* cp-abi.c: Update.
      	* cp-support.c: Update.
      	* cp-valprint.c: Update.
      	* darwin-nat.c: Update.
      	* disasm-selftests.c: Update.
      	* dtrace-probe.c: Update.
      	* dwarf-index-cache.c: Update.
      	* dwarf-index-write.c: Update.
      	* dwarf2-frame-tailcall.c: Update.
      	* dwarf2-frame.c: Update.
      	* dwarf2loc.c: Update.
      	* dwarf2read.c: Update.
      	* eval.c: Update.
      	* event-loop.c: Update.
      	* event-top.c: Update.
      	* exec.c: Update.
      	* f-valprint.c: Update.
      	* fbsd-tdep.c: Update.
      	* frame-unwind.c: Update.
      	* frame.c: Update.
      	* gdbtypes.c: Update.
      	* gnu-v3-abi.c: Update.
      	* guile/guile-internal.h: Update.
      	* guile/scm-block.c: Update.
      	* guile/scm-breakpoint.c: Update.
      	* guile/scm-cmd.c: Update.
      	* guile/scm-disasm.c: Update.
      	* guile/scm-frame.c: Update.
      	* guile/scm-lazy-string.c: Update.
      	* guile/scm-math.c: Update.
      	* guile/scm-param.c: Update.
      	* guile/scm-ports.c: Update.
      	* guile/scm-pretty-print.c: Update.
      	* guile/scm-symbol.c: Update.
      	* guile/scm-symtab.c: Update.
      	* guile/scm-type.c: Update.
      	* guile/scm-value.c: Update.
      	* i386-linux-tdep.c: Update.
      	* i386-tdep.c: Update.
      	* inf-loop.c: Update.
      	* infcall.c: Update.
      	* infcmd.c: Update.
      	* infrun.c: Update.
      	* jit.c: Update.
      	* language.c: Update.
      	* linespec.c: Update.
      	* linux-fork.c: Update.
      	* linux-nat.c: Update.
      	* linux-tdep.c: Update.
      	* linux-thread-db.c: Update.
      	* main.c: Update.
      	* mi/mi-cmd-break.c: Update.
      	* mi/mi-cmd-stack.c: Update.
      	* mi/mi-interp.c: Update.
      	* mi/mi-main.c: Update.
      	* objc-lang.c: Update.
      	* p-valprint.c: Update.
      	* parse.c: Update.
      	* ppc-linux-tdep.c: Update.
      	* printcmd.c: Update.
      	* python/py-arch.c: Update.
      	* python/py-breakpoint.c: Update.
      	* python/py-cmd.c: Update.
      	* python/py-finishbreakpoint.c: Update.
      	* python/py-frame.c: Update.
      	* python/py-framefilter.c: Update.
      	* python/py-gdb-readline.c: Update.
      	* python/py-inferior.c: Update.
      	* python/py-infthread.c: Update.
      	* python/py-lazy-string.c: Update.
      	* python/py-linetable.c: Update.
      	* python/py-objfile.c: Update.
      	* python/py-param.c: Update.
      	* python/py-prettyprint.c: Update.
      	* python/py-progspace.c: Update.
      	* python/py-record-btrace.c: Update.
      	* python/py-record.c: Update.
      	* python/py-symbol.c: Update.
      	* python/py-type.c: Update.
      	* python/py-unwind.c: Update.
      	* python/py-utils.c: Update.
      	* python/py-value.c: Update.
      	* python/python.c: Update.
      	* record-btrace.c: Update.
      	* record-full.c: Update.
      	* remote-fileio.c: Update.
      	* remote.c: Update.
      	* riscv-tdep.c: Update.
      	* rs6000-aix-tdep.c: Update.
      	* rs6000-tdep.c: Update.
      	* rust-exp.y: Update.
      	* rust-lang.c: Update.
      	* s390-tdep.c: Update.
      	* selftest-arch.c: Update.
      	* solib-dsbt.c: Update.
      	* solib-frv.c: Update.
      	* solib-spu.c: Update.
      	* solib-svr4.c: Update.
      	* solib.c: Update.
      	* sparc64-linux-tdep.c: Update.
      	* stack.c: Update.
      	* symfile-mem.c: Update.
      	* symmisc.c: Update.
      	* target.c: Update.
      	* thread.c: Update.
      	* top.c: Update.
      	* tracefile-tfile.c: Update.
      	* tui/tui.c: Update.
      	* typeprint.c: Update.
      	* unittests/cli-utils-selftests.c: Update.
      	* unittests/parse-connection-spec-selftests.c: Update.
      	* valops.c: Update.
      	* valprint.c: Update.
      	* value.c: Update.
      	* varobj.c: Update.
      	* windows-nat.c: Update.
      	* x86-linux-nat.c: Update.
      	* xml-support.c: Update.
      
      gdb/gdbserver/ChangeLog
      2019-04-08  Tom Tromey  <tom@tromey.com>
      
      	* gdbreplay.c: Update.
      	* linux-low.c: Update.
      	* server.c: Update.
      230d2906
    • Tom Tromey's avatar
      Rewrite TRY/CATCH · a70b8144
      Tom Tromey authored
      This rewrites gdb's TRY/CATCH to plain C++ try/catch.  The patch was
      largely written by script, though one change (to a comment in
      common-exceptions.h) was reverted by hand.
      
      gdb/ChangeLog
      2019-04-08  Tom Tromey  <tom@tromey.com>
      
      	* xml-support.c: Use C++ exception handling.
      	* x86-linux-nat.c: Use C++ exception handling.
      	* windows-nat.c: Use C++ exception handling.
      	* varobj.c: Use C++ exception handling.
      	* value.c: Use C++ exception handling.
      	* valprint.c: Use C++ exception handling.
      	* valops.c: Use C++ exception handling.
      	* unittests/parse-connection-spec-selftests.c: Use C++ exception
      	handling.
      	* unittests/cli-utils-selftests.c: Use C++ exception handling.
      	* typeprint.c: Use C++ exception handling.
      	* tui/tui.c: Use C++ exception handling.
      	* tracefile-tfile.c: Use C++ exception handling.
      	* top.c: Use C++ exception handling.
      	* thread.c: Use C++ exception handling.
      	* target.c: Use C++ exception handling.
      	* symmisc.c: Use C++ exception handling.
      	* symfile-mem.c: Use C++ exception handling.
      	* stack.c: Use C++ exception handling.
      	* sparc64-linux-tdep.c: Use C++ exception handling.
      	* solib.c: Use C++ exception handling.
      	* solib-svr4.c: Use C++ exception handling.
      	* solib-spu.c: Use C++ exception handling.
      	* solib-frv.c: Use C++ exception handling.
      	* solib-dsbt.c: Use C++ exception handling.
      	* selftest-arch.c: Use C++ exception handling.
      	* s390-tdep.c: Use C++ exception handling.
      	* rust-lang.c: Use C++ exception handling.
      	* rust-exp.y: Use C++ exception handling.
      	* rs6000-tdep.c: Use C++ exception handling.
      	* rs6000-aix-tdep.c: Use C++ exception handling.
      	* riscv-tdep.c: Use C++ exception handling.
      	* remote.c: Use C++ exception handling.
      	* remote-fileio.c: Use C++ exception handling.
      	* record-full.c: Use C++ exception handling.
      	* record-btrace.c: Use C++ exception handling.
      	* python/python.c: Use C++ exception handling.
      	* python/py-value.c: Use C++ exception handling.
      	* python/py-utils.c: Use C++ exception handling.
      	* python/py-unwind.c: Use C++ exception handling.
      	* python/py-type.c: Use C++ exception handling.
      	* python/py-symbol.c: Use C++ exception handling.
      	* python/py-record.c: Use C++ exception handling.
      	* python/py-record-btrace.c: Use C++ exception handling.
      	* python/py-progspace.c: Use C++ exception handling.
      	* python/py-prettyprint.c: Use C++ exception handling.
      	* python/py-param.c: Use C++ exception handling.
      	* python/py-objfile.c: Use C++ exception handling.
      	* python/py-linetable.c: Use C++ exception handling.
      	* python/py-lazy-string.c: Use C++ exception handling.
      	* python/py-infthread.c: Use C++ exception handling.
      	* python/py-inferior.c: Use C++ exception handling.
      	* python/py-gdb-readline.c: Use C++ exception handling.
      	* python/py-framefilter.c: Use C++ exception handling.
      	* python/py-frame.c: Use C++ exception handling.
      	* python/py-finishbreakpoint.c: Use C++ exception handling.
      	* python/py-cmd.c: Use C++ exception handling.
      	* python/py-breakpoint.c: Use C++ exception handling.
      	* python/py-arch.c: Use C++ exception handling.
      	* printcmd.c: Use C++ exception handling.
      	* ppc-linux-tdep.c: Use C++ exception handling.
      	* parse.c: Use C++ exception handling.
      	* p-valprint.c: Use C++ exception handling.
      	* objc-lang.c: Use C++ exception handling.
      	* mi/mi-main.c: Use C++ exception handling.
      	* mi/mi-interp.c: Use C++ exception handling.
      	* mi/mi-cmd-stack.c: Use C++ exception handling.
      	* mi/mi-cmd-break.c: Use C++ exception handling.
      	* main.c: Use C++ exception handling.
      	* linux-thread-db.c: Use C++ exception handling.
      	* linux-tdep.c: Use C++ exception handling.
      	* linux-nat.c: Use C++ exception handling.
      	* linux-fork.c: Use C++ exception handling.
      	* linespec.c: Use C++ exception handling.
      	* language.c: Use C++ exception handling.
      	* jit.c: Use C++ exception handling.
      	* infrun.c: Use C++ exception handling.
      	* infcmd.c: Use C++ exception handling.
      	* infcall.c: Use C++ exception handling.
      	* inf-loop.c: Use C++ exception handling.
      	* i386-tdep.c: Use C++ exception handling.
      	* i386-linux-tdep.c: Use C++ exception handling.
      	* guile/scm-value.c: Use C++ exception handling.
      	* guile/scm-type.c: Use C++ exception handling.
      	* guile/scm-symtab.c: Use C++ exception handling.
      	* guile/scm-symbol.c: Use C++ exception handling.
      	* guile/scm-pretty-print.c: Use C++ exception handling.
      	* guile/scm-ports.c: Use C++ exception handling.
      	* guile/scm-param.c: Use C++ exception handling.
      	* guile/scm-math.c: Use C++ exception handling.
      	* guile/scm-lazy-string.c: Use C++ exception handling.
      	* guile/scm-frame.c: Use C++ exception handling.
      	* guile/scm-disasm.c: Use C++ exception handling.
      	* guile/scm-cmd.c: Use C++ exception handling.
      	* guile/scm-breakpoint.c: Use C++ exception handling.
      	* guile/scm-block.c: Use C++ exception handling.
      	* guile/guile-internal.h: Use C++ exception handling.
      	* gnu-v3-abi.c: Use C++ exception handling.
      	* gdbtypes.c: Use C++ exception handling.
      	* frame.c: Use C++ exception handling.
      	* frame-unwind.c: Use C++ exception handling.
      	* fbsd-tdep.c: Use C++ exception handling.
      	* f-valprint.c: Use C++ exception handling.
      	* exec.c: Use C++ exception handling.
      	* event-top.c: Use C++ exception handling.
      	* event-loop.c: Use C++ exception handling.
      	* eval.c: Use C++ exception handling.
      	* dwarf2read.c: Use C++ exception handling.
      	* dwarf2loc.c: Use C++ exception handling.
      	* dwarf2-frame.c: Use C++ exception handling.
      	* dwarf2-frame-tailcall.c: Use C++ exception handling.
      	* dwarf-index-write.c: Use C++ exception handling.
      	* dwarf-index-cache.c: Use C++ exception handling.
      	* dtrace-probe.c: Use C++ exception handling.
      	* disasm-selftests.c: Use C++ exception handling.
      	* darwin-nat.c: Use C++ exception handling.
      	* cp-valprint.c: Use C++ exception handling.
      	* cp-support.c: Use C++ exception handling.
      	* cp-abi.c: Use C++ exception handling.
      	* corelow.c: Use C++ exception handling.
      	* completer.c: Use C++ exception handling.
      	* compile/compile-object-run.c: Use C++ exception handling.
      	* compile/compile-object-load.c: Use C++ exception handling.
      	* compile/compile-cplus-symbols.c: Use C++ exception handling.
      	* compile/compile-c-symbols.c: Use C++ exception handling.
      	* common/selftest.c: Use C++ exception handling.
      	* common/new-op.c: Use C++ exception handling.
      	* cli/cli-script.c: Use C++ exception handling.
      	* cli/cli-interp.c: Use C++ exception handling.
      	* cli/cli-cmds.c: Use C++ exception handling.
      	* c-varobj.c: Use C++ exception handling.
      	* btrace.c: Use C++ exception handling.
      	* breakpoint.c: Use C++ exception handling.
      	* break-catch-throw.c: Use C++ exception handling.
      	* arch-utils.c: Use C++ exception handling.
      	* amd64-tdep.c: Use C++ exception handling.
      	* ada-valprint.c: Use C++ exception handling.
      	* ada-typeprint.c: Use C++ exception handling.
      	* ada-lang.c: Use C++ exception handling.
      	* aarch64-tdep.c: Use C++ exception handling.
      
      gdb/gdbserver/ChangeLog
      2019-04-08  Tom Tromey  <tom@tromey.com>
      
      	* server.c: Use C++ exception handling.
      	* linux-low.c: Use C++ exception handling.
      	* gdbreplay.c: Use C++ exception handling.
      a70b8144
  30. Jan 23, 2019
    • Tom Tromey's avatar
      Do not include py-ref.h in most files · 3fabc016
      Tom Tromey authored
      py-ref.h can really only be included from a specific spot in
      python-internal.h.  The other includes are not useful, and cause
      compilation errors if the includes are ever sorted.  So, remove these
      includes.
      
      Arguably, py-ref.h should simply not be a separate header.
      
      gdb/ChangeLog
      2019-01-22  Tom Tromey  <tom@tromey.com>
      
      	* python/py-arch.c: Do not include py-ref.h.
      	* python/py-bpevent.c: Do not include py-ref.h.
      	* python/py-cmd.c: Do not include py-ref.h.
      	* python/py-continueevent.c: Do not include py-ref.h.
      	* python/py-event.h: Do not include py-ref.h.
      	* python/py-evtregistry.c: Do not include py-ref.h.
      	* python/py-finishbreakpoint.c: Do not include py-ref.h.
      	* python/py-frame.c: Do not include py-ref.h.
      	* python/py-framefilter.c: Do not include py-ref.h.
      	* python/py-function.c: Do not include py-ref.h.
      	* python/py-infevents.c: Do not include py-ref.h.
      	* python/py-linetable.c: Do not include py-ref.h.
      	* python/py-objfile.c: Do not include py-ref.h.
      	* python/py-param.c: Do not include py-ref.h.
      	* python/py-prettyprint.c: Do not include py-ref.h.
      	* python/py-progspace.c: Do not include py-ref.h.
      	* python/py-symbol.c: Do not include py-ref.h.
      	* python/py-symtab.c: Do not include py-ref.h.
      	* python/py-type.c: Do not include py-ref.h.
      	* python/py-unwind.c: Do not include py-ref.h.
      	* python/py-utils.c: Do not include py-ref.h.
      	* python/py-value.c: Do not include py-ref.h.
      	* python/py-varobj.c: Do not include py-ref.h.
      	* python/py-xmethods.c: Do not include py-ref.h.
      	* python/python.c: Do not include py-ref.h.
      	* varobj.c: Do not include py-ref.h.
      3fabc016
  31. Jan 06, 2019
    • Tom Tromey's avatar
      Fix crash in "finish" · f097f5ad
      Tom Tromey authored
      PR gdb/28155 notes a crash in "finish" that occurs with a particular
      source file compiled by clang.
      
      The bug is the typical gdb problem of a missing call to check_typedef.
      clang emits a function whose return type is a typedef to void.
      get_return_value asserts that the return type is not void, but the
      callers were not using check_typedef first.
      
      gdb/ChangeLog
      2019-01-06  Tom Tromey  <tom@tromey.com>
      
      	PR gdb/28155:
      	* python/py-finishbreakpoint.c (bpfinishpy_init): Use
      	check_typedef.
      	* infcmd.c (finish_command_fsm_should_stop): Use check_typedef.
      	(print_return_value): Likewise.
      
      gdb/testsuite/ChangeLog
      2019-01-06  Tom Tromey  <tom@tromey.com>
      
      	PR gdb/28155:
      	* gdb.dwarf2/typedef-void-finish.exp: New file.
      f097f5ad
  32. Jan 01, 2019
    • Joel Brobecker's avatar
      Update copyright year range in all GDB files. · 42a4f53d
      Joel Brobecker authored
      This commit applies all changes made after running the gdb/copyright.py
      script.
      
      Note that one file was flagged by the script, due to an invalid
      copyright header
      (gdb/unittests/basic_string_view/element_access/char/empty.cc).
      As the file was copied from GCC's libstdc++-v3 testsuite, this commit
      leaves this file untouched for the time being; a patch to fix the header
      was sent to gcc-patches first.
      
      gdb/ChangeLog:
      
      	Update copyright year range in all GDB files.
      42a4f53d
  33. Jun 21, 2018
    • Pedro Alves's avatar
      Use thread_info and inferior pointers more throughout · 00431a78
      Pedro Alves authored
      This is more preparation bits for multi-target support.
      
      In a multi-target scenario, we need to address the case of different
      processes/threads running on different targets that happen to have the
      same PID/PTID.  E.g., we can have both process 123 in target 1, and
      process 123 in target 2, while they're in reality different processes
      running on different machines.  Or maybe we've loaded multiple
      instances of the same core file.  Etc.
      
      To address this, in my WIP multi-target branch, threads and processes
      are uniquely identified by the (process_stratum target_ops *, ptid_t)
      and (process_stratum target_ops *, pid) tuples respectively.  I.e.,
      each process_stratum instance has its own thread/process number space.
      
      As you can imagine, that requires passing around target_ops * pointers
      in a number of functions where we're currently passing only a ptid_t
      or an int.  E.g., when we look up a thread_info object by ptid_t in
      find_thread_ptid, the ptid_t alone isn't sufficient.
      
      In many cases though, we already have the thread_info or inferior
      pointer handy, but we "lose" it somewhere along the call stack, only
      to look it up again by ptid_t/pid.  Since thread_info or inferior
      objects know their parent target, if we pass around thread_info or
      inferior pointers when possible, we avoid having to add extra
      target_ops parameters to many functions, and also, we eliminate a
      number of by ptid_t/int lookups.
      
      So that's what this patch does.  In a bit more detail:
      
      - Changes a number of functions and methods to take a thread_info or
        inferior pointer instead of a ptid_t or int parameter.
      
      - Changes a number of structure fields from ptid_t/int to inferior or
        thread_info pointers.
      
      - Uses the inferior_thread() function whenever possible instead of
        inferior_ptid.
      
      - Uses thread_info pointers directly when possible instead of the
        is_running/is_stopped etc. routines that require a lookup.
      
      - A number of functions are eliminated along the way, such as:
      
        int valid_gdb_inferior_id (int num);
        int pid_to_gdb_inferior_id (int pid);
        int gdb_inferior_id_to_pid (int num);
        int in_inferior_list (int pid);
      
      - A few structures and places hold a thread_info pointer across
        inferior execution, so now they take a strong reference to the
        (refcounted) thread_info object to avoid the thread_info pointer
        getting stale.  This is done in enable_thread_stack_temporaries and
        in the infcall.c code.
      
      - Related, there's a spot in infcall.c where using a RAII object to
        handle the refcount would be handy, so a gdb::ref_ptr specialization
        for thread_info is added (thread_info_ref, in gdbthread.h), along
        with a gdb_ref_ptr policy that works for all refcounted_object types
        (in common/refcounted-object.h).
      
      gdb/ChangeLog:
      2018-06-21  Pedro Alves  <palves@redhat.com>
      
      	* ada-lang.h (ada_get_task_number): Take a thread_info pointer
      	instead of a ptid_t.  All callers adjusted.
      	* ada-tasks.c (ada_get_task_number): Likewise.  All callers
      	adjusted.
      	(print_ada_task_info, display_current_task_id, task_command_1):
      	Adjust.
      	* breakpoint.c (watchpoint_in_thread_scope): Adjust to use
      	inferior_thread.
      	(breakpoint_kind): Adjust.
      	(remove_breakpoints_pid): Rename to ...
      	(remove_breakpoints_inf): ... this.  Adjust to take an inferior
      	pointer.  All callers adjusted.
      	(bpstat_clear_actions): Use inferior_thread.
      	(get_bpstat_thread): New.
      	(bpstat_do_actions): Use it.
      	(bpstat_check_breakpoint_conditions, bpstat_stop_status): Adjust
      	to take a thread_info pointer.  All callers adjusted.
      	(set_longjmp_breakpoint_for_call_dummy, set_momentary_breakpoint)
      	(breakpoint_re_set_thread): Use inferior_thread.
      	* breakpoint.h (struct inferior): Forward declare.
      	(bpstat_stop_status): Update.
      	(remove_breakpoints_pid): Delete.
      	(remove_breakpoints_inf): New.
      	* bsd-uthread.c (bsd_uthread_target::wait)
      	(bsd_uthread_target::update_thread_list): Use find_thread_ptid.
      	* btrace.c (btrace_add_pc, btrace_enable, btrace_fetch)
      	(maint_btrace_packet_history_cmd)
      	(maint_btrace_clear_packet_history_cmd): Adjust.
      	(maint_btrace_clear_cmd, maint_info_btrace_cmd): Adjust to use
      	inferior_thread.
      	* cli/cli-interp.c: Include "inferior.h".
      	* common/refcounted-object.h (struct
      	refcounted_object_ref_policy): New.
      	* compile/compile-object-load.c: Include gdbthread.h.
      	(store_regs): Use inferior_thread.
      	* corelow.c (core_target::close): Use current_inferior.
      	(core_target_open): Adjust to use first_thread_of_inferior and use
      	the current inferior.
      	* ctf.c (ctf_target::close): Adjust to use current_inferior.
      	* dummy-frame.c (dummy_frame_id) <ptid>: Delete, replaced by ...
      	<thread>: ... this new field.  All references adjusted.
      	(dummy_frame_pop, dummy_frame_discard, register_dummy_frame_dtor):
      	Take a thread_info pointer instead of a ptid_t.
      	* dummy-frame.h (dummy_frame_push, dummy_frame_pop)
      	(dummy_frame_discard, register_dummy_frame_dtor): Take a
      	thread_info pointer instead of a ptid_t.
      	* elfread.c: Include "inferior.h".
      	(elf_gnu_ifunc_resolver_stop, elf_gnu_ifunc_resolver_return_stop):
      	Use inferior_thread.
      	* eval.c (evaluate_subexp): Likewise.
      	* frame.c (frame_pop, has_stack_frames, find_frame_sal): Use
      	inferior_thread.
      	* gdb_proc_service.h (struct thread_info): Forward declare.
      	(struct ps_prochandle) <ptid>: Delete, replaced by ...
      	<thread>: ... this new field.  All references adjusted.
      	* gdbarch.h, gdbarch.c: Regenerate.
      	* gdbarch.sh (get_syscall_number): Replace 'ptid' parameter with a
      	'thread' parameter.  All implementations and callers adjusted.
      	* gdbthread.h (thread_info) <set_running>: New method.
      	(delete_thread, delete_thread_silent): Take a thread_info pointer
      	instead of a ptid.
      	(global_thread_id_to_ptid, ptid_to_global_thread_id): Delete.
      	(first_thread_of_process): Delete, replaced by ...
      	(first_thread_of_inferior): ... this new function.  All callers
      	adjusted.
      	(any_live_thread_of_process): Delete, replaced by ...
      	(any_live_thread_of_inferior): ... this new function.  All callers
      	adjusted.
      	(switch_to_thread, switch_to_no_thread): Declare.
      	(is_executing): Delete.
      	(enable_thread_stack_temporaries): Update comment.
      	<enable_thread_stack_temporaries>: Take a thread_info pointer
      	instead of a ptid_t.  Incref the thread.
      	<~enable_thread_stack_temporaries>: Decref the thread.
      	<m_ptid>: Delete
      	<m_thr>: New.
      	(thread_stack_temporaries_enabled_p, push_thread_stack_temporary)
      	(get_last_thread_stack_temporary)
      	(value_in_thread_stack_temporaries, can_access_registers_thread):
      	Take a thread_info pointer instead of a ptid_t.  All callers
      	adjusted.
      	* infcall.c (get_call_return_value): Use inferior_thread.
      	(run_inferior_call): Work with thread pointers instead of ptid_t.
      	(call_function_by_hand_dummy): Work with thread pointers instead
      	of ptid_t.  Use thread_info_ref.
      	* infcmd.c (proceed_thread_callback): Access thread's state
      	directly.
      	(ensure_valid_thread, ensure_not_running): Use inferior_thread,
      	access thread's state directly.
      	(continue_command): Use inferior_thread.
      	(info_program_command): Use find_thread_ptid and access thread
      	state directly.
      	(proceed_after_attach_callback): Use thread state directly.
      	(notice_new_inferior): Take a thread_info pointer instead of a
      	ptid_t.  All callers adjusted.
      	(exit_inferior): Take an inferior pointer instead of a pid.  All
      	callers adjusted.
      	(exit_inferior_silent): New.
      	(detach_inferior): Delete.
      	(valid_gdb_inferior_id, pid_to_gdb_inferior_id)
      	(gdb_inferior_id_to_pid, in_inferior_list): Delete.
      	(detach_inferior_command, kill_inferior_command): Use
      	find_inferior_id instead of valid_gdb_inferior_id and
      	gdb_inferior_id_to_pid.
      	(inferior_command): Use inferior and thread pointers.
      	* inferior.h (struct thread_info): Forward declare.
      	(notice_new_inferior): Take a thread_info pointer instead of a
      	ptid_t.  All callers adjusted.
      	(detach_inferior): Delete declaration.
      	(exit_inferior, exit_inferior_silent): Take an inferior pointer
      	instead of a pid.  All callers adjusted.
      	(gdb_inferior_id_to_pid, pid_to_gdb_inferior_id, in_inferior_list)
      	(valid_gdb_inferior_id): Delete.
      	* infrun.c (follow_fork_inferior, proceed_after_vfork_done)
      	(handle_vfork_child_exec_or_exit, follow_exec): Adjust.
      	(struct displaced_step_inferior_state) <pid>: Delete, replaced by
      	...
      	<inf>: ... this new field.
      	<step_ptid>: Delete, replaced by ...
      	<step_thread>: ... this new field.
      	(get_displaced_stepping_state): Take an inferior pointer instead
      	of a pid.  All callers adjusted.
      	(displaced_step_in_progress_any_inferior): Adjust.
      	(displaced_step_in_progress_thread): Take a thread pointer instead
      	of a ptid_t.  All callers adjusted.
      	(displaced_step_in_progress, add_displaced_stepping_state): Take
      	an inferior pointer instead of a pid.  All callers adjusted.
      	(get_displaced_step_closure_by_addr): Adjust.
      	(remove_displaced_stepping_state): Take an inferior pointer
      	instead of a pid.  All callers adjusted.
      	(displaced_step_prepare_throw, displaced_step_prepare)
      	(displaced_step_fixup): Take a thread pointer instead of a ptid_t.
      	All callers adjusted.
      	(start_step_over): Adjust.
      	(infrun_thread_ptid_changed): Remove bit updating ptids in the
      	displaced step queue.
      	(do_target_resume): Adjust.
      	(fetch_inferior_event): Use inferior_thread.
      	(context_switch, get_inferior_stop_soon): Take an
      	execution_control_state pointer instead of a ptid_t.  All callers
      	adjusted.
      	(switch_to_thread_cleanup): Delete.
      	(stop_all_threads): Use scoped_restore_current_thread.
      	* inline-frame.c: Include "gdbthread.h".
      	(inline_state) <inline_state>: Take a thread pointer instead of a
      	ptid_t.  All callers adjusted.
      	<ptid>: Delete, replaced by ...
      	<thread>: ... this new field.
      	(find_inline_frame_state): Take a thread pointer instead of a
      	ptid_t.  All callers adjusted.
      	(skip_inline_frames, step_into_inline_frame)
      	(inline_skipped_frames, inline_skipped_symbol): Take a thread
      	pointer instead of a ptid_t.  All callers adjusted.
      	* inline-frame.h (skip_inline_frames, step_into_inline_frame)
      	(inline_skipped_frames, inline_skipped_symbol): Likewise.
      	* linux-fork.c (delete_checkpoint_command): Adjust to use thread
      	pointers directly.
      	* linux-nat.c (get_detach_signal): Likewise.
      	* linux-thread-db.c (thread_from_lwp): New 'stopped' parameter.
      	(thread_db_notice_clone): Adjust.
      	(thread_db_find_new_threads_silently)
      	(thread_db_find_new_threads_2, thread_db_find_new_threads_1): Take
      	a thread pointer instead of a ptid_t.  All callers adjusted.
      	* mi/mi-cmd-var.c: Include "inferior.h".
      	(mi_cmd_var_update_iter): Update to use thread pointers.
      	* mi/mi-interp.c (mi_new_thread): Update to use the thread's
      	inferior directly.
      	(mi_output_running_pid, mi_inferior_count): Delete, bits factored
      	out to ...
      	(mi_output_running): ... this new function.
      	(mi_on_resume_1): Adjust to use it.
      	(mi_user_selected_context_changed): Adjust to use inferior_thread.
      	* mi/mi-main.c (proceed_thread): Adjust to use thread pointers
      	directly.
      	(interrupt_thread_callback): : Adjust to use thread and inferior
      	pointers.
      	* proc-service.c: Include "gdbthread.h".
      	(ps_pglobal_lookup): Adjust to use the thread's inferior directly.
      	* progspace-and-thread.c: Include "inferior.h".
      	* progspace.c: Include "inferior.h".
      	* python/py-exitedevent.c (create_exited_event_object): Adjust to
      	hold a reference to an inferior_object.
      	* python/py-finishbreakpoint.c (bpfinishpy_init): Adjust to use
      	inferior_thread.
      	* python/py-inferior.c (struct inferior_object): Give the type a
      	tag name instead of a typedef.
      	(python_on_normal_stop): No need to check if the current thread is
      	listed.
      	(inferior_to_inferior_object): Change return type to
      	inferior_object.  All callers adjusted.
      	(find_thread_object): Delete, bits factored out to ...
      	(thread_to_thread_object): ... this new function.
      	* python/py-infthread.c (create_thread_object): Use
      	inferior_to_inferior_object.
      	(thpy_is_stopped): Use thread pointer directly.
      	(gdbpy_selected_thread): Use inferior_thread.
      	* python/py-record-btrace.c (btpy_list_object) <ptid>: Delete
      	field, replaced with ...
      	<thread>: ... this new field.  All users adjusted.
      	(btpy_insn_or_gap_new): Drop const.
      	(btpy_list_new): Take a thread pointer instead of a ptid_t.  All
      	callers adjusted.
      	* python/py-record.c: Include "gdbthread.h".
      	(recpy_insn_new, recpy_func_new): Take a thread pointer instead of
      	a ptid_t.  All callers adjusted.
      	(gdbpy_current_recording): Use inferior_thread.
      	* python/py-record.h (recpy_record_object) <ptid>: Delete
      	field, replaced with ...
      	<thread>: ... this new field.  All users adjusted.
      	(recpy_element_object) <ptid>: Delete
      	field, replaced with ...
      	<thread>: ... this new field.  All users adjusted.
      	(recpy_insn_new, recpy_func_new): Take a thread pointer instead of
      	a ptid_t.  All callers adjusted.
      	* python/py-threadevent.c: Include "gdbthread.h".
      	(get_event_thread): Use thread_to_thread_object.
      	* python/python-internal.h (struct inferior_object): Forward
      	declare.
      	(find_thread_object, find_inferior_object): Delete declarations.
      	(thread_to_thread_object, inferior_to_inferior_object): New
      	declarations.
      	* record-btrace.c: Include "inferior.h".
      	(require_btrace_thread): Use inferior_thread.
      	(record_btrace_frame_sniffer)
      	(record_btrace_tailcall_frame_sniffer): Use inferior_thread.
      	(get_thread_current_frame): Use scoped_restore_current_thread and
      	switch_to_thread.
      	(get_thread_current_frame): Use thread pointer directly.
      	(record_btrace_replay_at_breakpoint): Use thread's inferior
      	pointer directly.
      	* record-full.c: Include "inferior.h".
      	* regcache.c: Include "gdbthread.h".
      	(get_thread_arch_regcache): Use the inferior's address space
      	directly.
      	(get_thread_regcache, registers_changed_thread): New.
      	* regcache.h (get_thread_regcache(thread_info *thread)): New
      	overload.
      	(registers_changed_thread): New.
      	(remote_target) <remote_detach_1>: Swap order of parameters.
      	(remote_add_thread): <remote_add_thread>: Return the new thread.
      	(get_remote_thread_info(ptid_t)): New overload.
      	(remote_target::remote_notice_new_inferior): Use thread pointers
      	directly.
      	(remote_target::process_initial_stop_replies): Use
      	thread_info::set_running.
      	(remote_target::remote_detach_1, remote_target::detach)
      	(extended_remote_target::detach): Adjust.
      	* stack.c (frame_show_address): Use inferior_thread.
      	* target-debug.h (target_debug_print_thread_info_pp): New.
      	* target-delegates.c: Regenerate.
      	* target.c (default_thread_address_space): Delete.
      	(memory_xfer_partial_1): Use current_inferior.
      	(target_detach): Use current_inferior.
      	(target_thread_address_space): Delete.
      	(generic_mourn_inferior): Use current_inferior.
      	* target.h (struct target_ops) <thread_address_space>: Delete.
      	(target_thread_address_space): Delete.
      	* thread.c (init_thread_list): Use ALL_THREADS_SAFE.  Use thread
      	pointers directly.
      	(delete_thread_1, delete_thread, delete_thread_silent): Take a
      	thread pointer instead of a ptid_t.  Adjust all callers.
      	(ptid_to_global_thread_id, global_thread_id_to_ptid): Delete.
      	(first_thread_of_process): Delete, replaced by ...
      	(first_thread_of_inferior): ... this new function.  All callers
      	adjusted.
      	(any_thread_of_process): Rename to ...
      	(any_thread_of_inferior): ... this, and take an inferior pointer.
      	(any_live_thread_of_process): Rename to ...
      	(any_live_thread_of_inferior): ... this, and take an inferior
      	pointer.
      	(thread_stack_temporaries_enabled_p, push_thread_stack_temporary)
      	(value_in_thread_stack_temporaries)
      	(get_last_thread_stack_temporary): Take a thread pointer instead
      	of a ptid_t.  Adjust all callers.
      	(thread_info::set_running): New.
      	(validate_registers_access): Use inferior_thread.
      	(can_access_registers_ptid): Rename to ...
      	(can_access_registers_thread): ... this, and take a thread
      	pointer.
      	(print_thread_info_1): Adjust to compare thread pointers instead
      	of ptids.
      	(switch_to_no_thread, switch_to_thread): Make extern.
      	(scoped_restore_current_thread::~scoped_restore_current_thread):
      	Use m_thread pointer directly.
      	(scoped_restore_current_thread::scoped_restore_current_thread):
      	Use inferior_thread.
      	(thread_command): Use thread pointer directly.
      	(thread_num_make_value_helper): Use inferior_thread.
      	* top.c (execute_command): Use inferior_thread.
      	* tui/tui-interp.c: Include "inferior.h".
      	* varobj.c (varobj_create): Use inferior_thread.
      	(value_of_root_1): Use find_thread_global_id instead of
      	global_thread_id_to_ptid.
      00431a78
  34. Mar 19, 2018
    • Tom Tromey's avatar
      Convert observers to C++ · 76727919
      Tom Tromey authored
      This converts observers from using a special source-generating script
      to be plain C++.  This version of the patch takes advantage of C++11
      by using std::function and variadic templates; incorporates Pedro's
      patches; and renames the header file to "observable.h" (this change
      eliminates the need for a clean rebuild).
      
      Note that Pedro's patches used a template lambda in tui-hooks.c, but
      this failed to compile on some buildbot instances (presumably due to
      differing C++ versions); I replaced this with an ordinary template
      function.
      
      Regression tested on the buildbot.
      
      gdb/ChangeLog
      2018-03-19  Pedro Alves  <palves@redhat.com>
      	    Tom Tromey  <tom@tromey.com>
      
      	* unittests/observable-selftests.c: New file.
      	* common/observable.h: New file.
      	* observable.h: New file.
      	* ada-lang.c, ada-tasks.c, agent.c, aix-thread.c, annotate.c,
      	arm-tdep.c, auto-load.c, auxv.c, break-catch-syscall.c,
      	breakpoint.c, bsd-uthread.c, cli/cli-interp.c, cli/cli-setshow.c,
      	corefile.c, dummy-frame.c, event-loop.c, event-top.c, exec.c,
      	extension.c, frame.c, gdbarch.c, guile/scm-breakpoint.c,
      	infcall.c, infcmd.c, inferior.c, inflow.c, infrun.c, jit.c,
      	linux-tdep.c, linux-thread-db.c, m68klinux-tdep.c,
      	mi/mi-cmd-break.c, mi/mi-interp.c, mi/mi-main.c, objfiles.c,
      	ppc-linux-nat.c, ppc-linux-tdep.c, printcmd.c, procfs.c,
      	python/py-breakpoint.c, python/py-finishbreakpoint.c,
      	python/py-inferior.c, python/py-unwind.c, ravenscar-thread.c,
      	record-btrace.c, record-full.c, record.c, regcache.c, remote.c,
      	riscv-tdep.c, sol-thread.c, solib-aix.c, solib-spu.c, solib.c,
      	spu-multiarch.c, spu-tdep.c, stack.c, symfile-mem.c, symfile.c,
      	symtab.c, thread.c, top.c, tracepoint.c, tui/tui-hooks.c,
      	tui/tui-interp.c, valops.c: Update all users.
      	* tui/tui-hooks.c (tui_bp_created_observer)
      	(tui_bp_deleted_observer, tui_bp_modified_observer)
      	(tui_inferior_exit_observer, tui_before_prompt_observer)
      	(tui_normal_stop_observer, tui_register_changed_observer):
      	Remove.
      	(tui_observers_token): New global.
      	(attach_or_detach, tui_attach_detach_observers): New functions.
      	(tui_install_hooks, tui_remove_hooks): Use
      	tui_attach_detach_observers.
      	* record-btrace.c (record_btrace_thread_observer): Remove.
      	(record_btrace_thread_observer_token): New global.
      	* observer.sh: Remove.
      	* observer.c: Rename to observable.c.
      	* observable.c (namespace gdb_observers): Define new objects.
      	(observer_debug): Move into gdb_observers namespace.
      	(struct observer, struct observer_list, xalloc_observer_list_node)
      	(xfree_observer_list_node, generic_observer_attach)
      	(generic_observer_detach, generic_observer_notify): Remove.
      	(_initialize_observer): Update.
      	Don't include observer.inc.
      	* Makefile.in (generated_files): Remove observer.h, observer.inc.
      	(clean mostlyclean): Likewise.
      	(observer.h, observer.inc): Remove targets.
      	(SUBDIR_UNITTESTS_SRCS): Add observable-selftests.c.
      	(COMMON_SFILES): Use observable.c, not observer.c.
      	* .gitignore: Remove observer.h.
      
      gdb/doc/ChangeLog
      2018-03-19  Tom Tromey  <tom@tromey.com>
      
      	* observer.texi: Remove.
      
      gdb/testsuite/ChangeLog
      2018-03-19  Tom Tromey  <tom@tromey.com>
      
      	* gdb.gdb/observer.exp: Remove.
      76727919
  35. Jan 02, 2018
  36. Apr 12, 2017
    • Tom Tromey's avatar
      Introduce event_location_up · ffc2605c
      Tom Tromey authored
      This removes make_cleanup_delete_event_location and instead changes
      the various location functions to return an event_location_up, a new
      unique_ptr typedef.
      
      This is largely straightforward, but be sure to examine the
      init_breakpoint_sal change.  I believe the code I deleted there is
      dead, because "location != NULL" can never be true in that branch; but
      you should double-check.
      
      gdb/ChangeLog
      2017-04-12  Tom Tromey  <tom@tromey.com>
      
      	* tracepoint.c (scope_info): Update.
      	* spu-tdep.c (spu_catch_start): Update.
      	* python/python.c (gdbpy_decode_line): Update.
      	* python/py-finishbreakpoint.c (bpfinishpy_init): Update.
      	* python/py-breakpoint.c (bppy_init): Update.
      	* probe.c (parse_probes): Update.
      	* mi/mi-cmd-break.c (mi_cmd_break_insert_1): Update.
      	* location.h (event_location_deleter): New struct.
      	(event_location_up): New typedef.
      	(new_linespec_location, new_address_location, new_probe_location)
      	(new_explicit_location, copy_event_location)
      	(string_to_event_location, string_to_event_location_basic)
      	(string_to_explicit_location): Update return type.
      	(make_cleanup_delete_event_location): Remove.
      	* location.c (new_linespec_location, new_address_location)
      	(new_probe_location, new_explicit_location, copy_event_location):
      	Return event_location_up.
      	(delete_event_location_cleanup)
      	(make_cleanup_delete_event_location): Remove.
      	(string_to_explicit_location, string_to_event_location_basic)
      	(string_to_event_location): Return event_location_up.
      	* linespec.c (canonicalize_linespec, event_location_to_sals)
      	(decode_line_with_current_source)
      	(decode_line_with_last_displayed, decode_objc): Update.
      	* guile/scm-breakpoint.c (gdbscm_register_breakpoint_x): Update.
      	* completer.c (location_completer): Update.
      	* cli/cli-cmds.c (edit_command, list_command): Update.
      	* breakpoint.c (create_overlay_event_breakpoint)
      	(create_longjmp_master_breakpoint)
      	(create_std_terminate_master_breakpoint)
      	(create_exception_master_breakpoint)
      	(create_thread_event_breakpoint): Update.
      	(init_breakpoint_sal): Update.  Remove some dead code.
      	(create_breakpoint_sal): Change type of "location".  Update.
      	(create_breakpoints_sal, create_breakpoint, break_command_1)
      	(dprintf_command, break_range_command, until_break_command)
      	(init_ada_exception_breakpoint)
      	(strace_marker_create_sals_from_location)
      	(update_static_tracepoint, trace_command, ftrace_command)
      	(strace_command, create_tracepoint_from_upload): Update.
      	* break-catch-throw.c (re_set_exception_catchpoint): Update.
      	* ax-gdb.c (agent_command_1): Update.
      ffc2605c
Loading