Skip to content
Snippets Groups Projects
  1. May 09, 2023
    • Dan Callaghan's avatar
      Support higher baud rates when they are defined · 78d16865
      Dan Callaghan authored
      On Linux at least, baud rate codes are defined up to B4000000. Allow the
      user to select them if they are present in the system headers.
      
      Change-Id: I393ff32e4a4b6127bdf97e3306ad5b6ebf7c934e
      78d16865
    • Simon Marchi's avatar
      gdb: fix use-after-free in check_longjmp_breakpoint_for_call_dummy · 1fba7b3a
      Simon Marchi authored
      
      Commit 7a8de0c3 ("Remove ALL_BREAKPOINTS_SAFE") introduced a
      use-after-free in the breakpoints iterations (see below for full ASan
      report).  This makes gdb.base/stale-infcall.exp fail when GDB is build
      with ASan.
      
      check_longjmp_breakpoint_for_call_dummy iterates on all breakpoints,
      possibly deleting the current breakpoint as well as related breakpoints.
      The problem arises when a breakpoint in the B->related_breakpoint chain
      is also B->next.  In that case, deleting that related breakpoint frees
      the breakpoint that all_breakpoints_safe has saved.
      
      The old code worked around that by manually changing B_TMP, which was
      the next breakpoint saved by the "safe iterator":
      
      	while (b->related_breakpoint != b)
      	  {
      	    if (b_tmp == b->related_breakpoint)
      	      b_tmp = b->related_breakpoint->next;
      	    delete_breakpoint (b->related_breakpoint);
      	  }
      
      (Note that this seemed to assume that b->related_breakpoint->next was
      the same as b->next->next, not sure this is guaranteed.)
      
      The new code kept the B_TMP variable, but it's not useful in that
      context.  We can't go change the next breakpoint as saved by the safe
      iterator, like we did before.  I suggest fixing that by saving the
      breakpoints to delete in a map and deleting them all at the end.
      
      Here's the full ASan report:
      
          (gdb) PASS: gdb.base/stale-infcall.exp: continue to breakpoint: break-run1
          print infcall ()
          =================================================================
          ==47472==ERROR: AddressSanitizer: heap-use-after-free on address 0x611000034980 at pc 0x563f7012c7bc bp 0x7ffdf3804d70 sp 0x7ffdf3804d60
          READ of size 8 at 0x611000034980 thread T0
              #0 0x563f7012c7bb in next_iterator<breakpoint>::operator++() /home/smarchi/src/binutils-gdb/gdb/../gdbsupport/next-iterator.h:66
              #1 0x563f702ce8c0 in basic_safe_iterator<next_iterator<breakpoint> >::operator++() /home/smarchi/src/binutils-gdb/gdb/../gdbsupport/safe-iterator.h:84
              #2 0x563f7021522a in check_longjmp_breakpoint_for_call_dummy(thread_info*) /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:7611
              #3 0x563f714567b1 in process_event_stop_test /home/smarchi/src/binutils-gdb/gdb/infrun.c:6881
              #4 0x563f71454e07 in handle_signal_stop /home/smarchi/src/binutils-gdb/gdb/infrun.c:6769
              #5 0x563f7144b680 in handle_inferior_event /home/smarchi/src/binutils-gdb/gdb/infrun.c:6023
              #6 0x563f71436165 in fetch_inferior_event() /home/smarchi/src/binutils-gdb/gdb/infrun.c:4387
              #7 0x563f7136ff51 in inferior_event_handler(inferior_event_type) /home/smarchi/src/binutils-gdb/gdb/inf-loop.c:42
              #8 0x563f7168038d in handle_target_event /home/smarchi/src/binutils-gdb/gdb/linux-nat.c:4219
              #9 0x563f72fccb6d in handle_file_event /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:573
              #10 0x563f72fcd503 in gdb_wait_for_event /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:694
              #11 0x563f72fcaf2b in gdb_do_one_event(int) /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:217
              #12 0x563f7262b9bb in wait_sync_command_done() /home/smarchi/src/binutils-gdb/gdb/top.c:426
              #13 0x563f7137a7c3 in run_inferior_call /home/smarchi/src/binutils-gdb/gdb/infcall.c:650
              #14 0x563f71381295 in call_function_by_hand_dummy(value*, type*, gdb::array_view<value*>, void (*)(void*, int), void*) /home/smarchi/src/binutils-gdb/gdb/infcall.c:1332
              #15 0x563f7137c0e2 in call_function_by_hand(value*, type*, gdb::array_view<value*>) /home/smarchi/src/binutils-gdb/gdb/infcall.c:780
              #16 0x563f70fe5960 in evaluate_subexp_do_call(expression*, noside, value*, gdb::array_view<value*>, char const*, type*) /home/smarchi/src/binutils-gdb/gdb/eval.c:649
              #17 0x563f70fe6617 in expr::operation::evaluate_funcall(type*, expression*, noside, char const*, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/eval.c:677
              #18 0x563f6fd19668 in expr::operation::evaluate_funcall(type*, expression*, noside, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/expression.h:136
              #19 0x563f70fe6bba in expr::var_value_operation::evaluate_funcall(type*, expression*, noside, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/eval.c:689
              #20 0x563f704b71dc in expr::funcall_operation::evaluate(type*, expression*, noside) /home/smarchi/src/binutils-gdb/gdb/expop.h:2219
              #21 0x563f70fe0f02 in expression::evaluate(type*, noside) /home/smarchi/src/binutils-gdb/gdb/eval.c:110
              #22 0x563f71b1373e in process_print_command_args /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1319
              #23 0x563f71b1391b in print_command_1 /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1332
              #24 0x563f71b147ec in print_command /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1465
              #25 0x563f706029b8 in do_simple_func /home/smarchi/src/binutils-gdb/gdb/cli/cli-decode.c:95
              #26 0x563f7061972a in cmd_func(cmd_list_element*, char const*, int) /home/smarchi/src/binutils-gdb/gdb/cli/cli-decode.c:2735
              #27 0x563f7262d0ef in execute_command(char const*, int) /home/smarchi/src/binutils-gdb/gdb/top.c:572
              #28 0x563f7100ed9c in command_handler(char const*) /home/smarchi/src/binutils-gdb/gdb/event-top.c:543
              #29 0x563f7101014b in command_line_handler(std::unique_ptr<char, gdb::xfree_deleter<char> >&&) /home/smarchi/src/binutils-gdb/gdb/event-top.c:779
              #30 0x563f72777942 in tui_command_line_handler /home/smarchi/src/binutils-gdb/gdb/tui/tui-interp.c:104
              #31 0x563f7100d059 in gdb_rl_callback_handler /home/smarchi/src/binutils-gdb/gdb/event-top.c:250
              #32 0x7f5a80418246 in rl_callback_read_char (/usr/lib/libreadline.so.8+0x3b246) (BuildId: 092e91fc4361b0ef94561e3ae03a75f69398acbb)
              #33 0x563f7100ca06 in gdb_rl_callback_read_char_wrapper_noexcept /home/smarchi/src/binutils-gdb/gdb/event-top.c:192
              #34 0x563f7100cc5e in gdb_rl_callback_read_char_wrapper /home/smarchi/src/binutils-gdb/gdb/event-top.c:225
              #35 0x563f728c70db in stdin_event_handler /home/smarchi/src/binutils-gdb/gdb/ui.c:155
              #36 0x563f72fccb6d in handle_file_event /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:573
              #37 0x563f72fcd503 in gdb_wait_for_event /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:694
              #38 0x563f72fcb15c in gdb_do_one_event(int) /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:264
              #39 0x563f7177ec1c in start_event_loop /home/smarchi/src/binutils-gdb/gdb/main.c:412
              #40 0x563f7177f12e in captured_command_loop /home/smarchi/src/binutils-gdb/gdb/main.c:476
              #41 0x563f717846e4 in captured_main /home/smarchi/src/binutils-gdb/gdb/main.c:1320
              #42 0x563f71784821 in gdb_main(captured_main_args*) /home/smarchi/src/binutils-gdb/gdb/main.c:1339
              #43 0x563f6fcedfbd in main /home/smarchi/src/binutils-gdb/gdb/gdb.c:32
              #44 0x7f5a7e43984f  (/usr/lib/libc.so.6+0x2384f) (BuildId: 2f005a79cd1a8e385972f5a102f16adba414d75e)
              #45 0x7f5a7e439909 in __libc_start_main (/usr/lib/libc.so.6+0x23909) (BuildId: 2f005a79cd1a8e385972f5a102f16adba414d75e)
              #46 0x563f6fcedd84 in _start (/home/smarchi/build/binutils-gdb/gdb/gdb+0xafb0d84) (BuildId: 50bd32e6e9d5e84543e9897b8faca34858ca3995)
      
          0x611000034980 is located 0 bytes inside of 208-byte region [0x611000034980,0x611000034a50)
          freed by thread T0 here:
              #0 0x7f5a7fce312a in operator delete(void*, unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:164
              #1 0x563f702bd1fa in momentary_breakpoint::~momentary_breakpoint() /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:304
              #2 0x563f702771c5 in delete_breakpoint(breakpoint*) /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:12404
              #3 0x563f702150a7 in check_longjmp_breakpoint_for_call_dummy(thread_info*) /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:7673
              #4 0x563f714567b1 in process_event_stop_test /home/smarchi/src/binutils-gdb/gdb/infrun.c:6881
              #5 0x563f71454e07 in handle_signal_stop /home/smarchi/src/binutils-gdb/gdb/infrun.c:6769
              #6 0x563f7144b680 in handle_inferior_event /home/smarchi/src/binutils-gdb/gdb/infrun.c:6023
              #7 0x563f71436165 in fetch_inferior_event() /home/smarchi/src/binutils-gdb/gdb/infrun.c:4387
              #8 0x563f7136ff51 in inferior_event_handler(inferior_event_type) /home/smarchi/src/binutils-gdb/gdb/inf-loop.c:42
              #9 0x563f7168038d in handle_target_event /home/smarchi/src/binutils-gdb/gdb/linux-nat.c:4219
              #10 0x563f72fccb6d in handle_file_event /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:573
              #11 0x563f72fcd503 in gdb_wait_for_event /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:694
              #12 0x563f72fcaf2b in gdb_do_one_event(int) /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:217
              #13 0x563f7262b9bb in wait_sync_command_done() /home/smarchi/src/binutils-gdb/gdb/top.c:426
              #14 0x563f7137a7c3 in run_inferior_call /home/smarchi/src/binutils-gdb/gdb/infcall.c:650
              #15 0x563f71381295 in call_function_by_hand_dummy(value*, type*, gdb::array_view<value*>, void (*)(void*, int), void*) /home/smarchi/src/binutils-gdb/gdb/infcall.c:1332
              #16 0x563f7137c0e2 in call_function_by_hand(value*, type*, gdb::array_view<value*>) /home/smarchi/src/binutils-gdb/gdb/infcall.c:780
              #17 0x563f70fe5960 in evaluate_subexp_do_call(expression*, noside, value*, gdb::array_view<value*>, char const*, type*) /home/smarchi/src/binutils-gdb/gdb/eval.c:649
              #18 0x563f70fe6617 in expr::operation::evaluate_funcall(type*, expression*, noside, char const*, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/eval.c:677
              #19 0x563f6fd19668 in expr::operation::evaluate_funcall(type*, expression*, noside, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/expression.h:136
              #20 0x563f70fe6bba in expr::var_value_operation::evaluate_funcall(type*, expression*, noside, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/eval.c:689
              #21 0x563f704b71dc in expr::funcall_operation::evaluate(type*, expression*, noside) /home/smarchi/src/binutils-gdb/gdb/expop.h:2219
              #22 0x563f70fe0f02 in expression::evaluate(type*, noside) /home/smarchi/src/binutils-gdb/gdb/eval.c:110
              #23 0x563f71b1373e in process_print_command_args /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1319
              #24 0x563f71b1391b in print_command_1 /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1332
              #25 0x563f71b147ec in print_command /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1465
              #26 0x563f706029b8 in do_simple_func /home/smarchi/src/binutils-gdb/gdb/cli/cli-decode.c:95
              #27 0x563f7061972a in cmd_func(cmd_list_element*, char const*, int) /home/smarchi/src/binutils-gdb/gdb/cli/cli-decode.c:2735
              #28 0x563f7262d0ef in execute_command(char const*, int) /home/smarchi/src/binutils-gdb/gdb/top.c:572
              #29 0x563f7100ed9c in command_handler(char const*) /home/smarchi/src/binutils-gdb/gdb/event-top.c:543
      
          previously allocated by thread T0 here:
              #0 0x7f5a7fce2012 in operator new(unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_new_delete.cpp:95
              #1 0x563f7029a9a3 in new_momentary_breakpoint<program_space*&, frame_id&, int&> /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:8129
              #2 0x563f702212f6 in momentary_breakpoint_from_master /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:8169
              #3 0x563f70212db1 in set_longjmp_breakpoint_for_call_dummy() /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:7582
              #4 0x563f713804db in call_function_by_hand_dummy(value*, type*, gdb::array_view<value*>, void (*)(void*, int), void*) /home/smarchi/src/binutils-gdb/gdb/infcall.c:1260
              #5 0x563f7137c0e2 in call_function_by_hand(value*, type*, gdb::array_view<value*>) /home/smarchi/src/binutils-gdb/gdb/infcall.c:780
              #6 0x563f70fe5960 in evaluate_subexp_do_call(expression*, noside, value*, gdb::array_view<value*>, char const*, type*) /home/smarchi/src/binutils-gdb/gdb/eval.c:649
              #7 0x563f70fe6617 in expr::operation::evaluate_funcall(type*, expression*, noside, char const*, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/eval.c:677
              #8 0x563f6fd19668 in expr::operation::evaluate_funcall(type*, expression*, noside, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/expression.h:136
              #9 0x563f70fe6bba in expr::var_value_operation::evaluate_funcall(type*, expression*, noside, std::__debug::vector<std::unique_ptr<expr::operation, std::default_delete<expr::operation> >, std::allocator<std::unique_ptr<expr::operation, std::default_delete<expr::operation> > > > const&) /home/smarchi/src/binutils-gdb/gdb/eval.c:689
              #10 0x563f704b71dc in expr::funcall_operation::evaluate(type*, expression*, noside) /home/smarchi/src/binutils-gdb/gdb/expop.h:2219
              #11 0x563f70fe0f02 in expression::evaluate(type*, noside) /home/smarchi/src/binutils-gdb/gdb/eval.c:110
              #12 0x563f71b1373e in process_print_command_args /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1319
              #13 0x563f71b1391b in print_command_1 /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1332
              #14 0x563f71b147ec in print_command /home/smarchi/src/binutils-gdb/gdb/printcmd.c:1465
              #15 0x563f706029b8 in do_simple_func /home/smarchi/src/binutils-gdb/gdb/cli/cli-decode.c:95
              #16 0x563f7061972a in cmd_func(cmd_list_element*, char const*, int) /home/smarchi/src/binutils-gdb/gdb/cli/cli-decode.c:2735
              #17 0x563f7262d0ef in execute_command(char const*, int) /home/smarchi/src/binutils-gdb/gdb/top.c:572
              #18 0x563f7100ed9c in command_handler(char const*) /home/smarchi/src/binutils-gdb/gdb/event-top.c:543
              #19 0x563f7101014b in command_line_handler(std::unique_ptr<char, gdb::xfree_deleter<char> >&&) /home/smarchi/src/binutils-gdb/gdb/event-top.c:779
              #20 0x563f72777942 in tui_command_line_handler /home/smarchi/src/binutils-gdb/gdb/tui/tui-interp.c:104
              #21 0x563f7100d059 in gdb_rl_callback_handler /home/smarchi/src/binutils-gdb/gdb/event-top.c:250
              #22 0x7f5a80418246 in rl_callback_read_char (/usr/lib/libreadline.so.8+0x3b246) (BuildId: 092e91fc4361b0ef94561e3ae03a75f69398acbb)
      
      Change-Id: Id00c17ab677f847fbf4efdf0f4038373668d3d88
      Approved-By: default avatarTom Tromey <tom@tromey.com>
      1fba7b3a
    • Enze Li's avatar
      d9cc4b06
    • Alan Modra's avatar
      stack overflow in debug_write_type · 55a75aae
      Alan Modra authored
      Another fuzzer attack.  This one was a "set" with elements using an
      indirect type pointing back at the set.  The existing recursion check
      only prevented simple recursion.
      
      	* debug.c (struct debug_type_s): Add mark.
      	(debug_write_type): Set mark and check before recursing into
      	indirect types.
      55a75aae
    • Alan Modra's avatar
      alpha-vms reloc sanity check · 06ba6be6
      Alan Modra authored
      Stops fuzzed files triggering reads past the end of the reloc buffer.
      
      	* vms-alpha.c (alpha_vms_slurp_relocs): Sanity check reloc records.
      06ba6be6
    • Alan Modra's avatar
      regen ld/Makefile.in · 5f38307a
      Alan Modra authored
      5f38307a
    • GDB Administrator's avatar
      Automatic date update in version.in · 39453f9d
      GDB Administrator authored
      39453f9d
  2. May 08, 2023
    • John Baldwin's avatar
      gdbserver: Clear upper ZMM registers in the right location. · 642a9739
      John Baldwin authored
      
      This was previously clearing the upper 32 bytes of ZMM0-15 rather than
      ZMM16-31.
      
      Approved-By: default avatarSimon Marchi <simon.marchi@efficios.com>
      642a9739
    • John Baldwin's avatar
      x86-fbsd-nat: Add missing public label. · fa0ea504
      John Baldwin authored
      These two methods are both overrides of public methods in base
      classes.
      fa0ea504
    • Felix Willgerodt's avatar
      gdb: Avoid warning for the jump command inside an inline function. · c239019c
      Felix Willgerodt authored
      
      When stopped inside an inline function, trying to jump to a different line
      of the same function currently results in a warning about jumping to another
      function.  Fix this by taking inline functions into account.
      
      Before:
        Breakpoint 1, function_inline (x=510) at jump-inline.cpp:22
        22        a = a + x;             /* inline-funct */
        (gdb) j 21
        Line 21 is not in `function_inline(int)'.  Jump anyway? (y or n)
      
      After:
        Breakpoint 2, function_inline (x=510) at jump-inline.cpp:22
        22        a = a + x;            /* inline-funct */
        (gdb) j 21
        Continuing at 0x400679.
      
        Breakpoint 1, function_inline (x=510) at jump-inline.cpp:21
        21        a += 1020 + a;                /* increment-funct */
      
      This was regression-tested on X86-64 Linux.
      
      Co-Authored-by: default avatarCristian Sandu <cristian.sandu@intel.com>
      Approved-By: default avatarAndrew Burgess <aburgess@redhat.com>
      c239019c
    • Alan Modra's avatar
      pe.em and pep.em make_import_fixup · f35cc0de
      Alan Modra authored
      This is a little cleanup that I made when looking at pr30343 that
      makes it more obvious that make_import_fixup in both files are
      identical (and in fact the new pep.em read_addend could be used in
      both files).
      
      	* emultempl/pep.em (read_addend): Extract from..
      	(make_import_fixup): ..here.
      	* emultempl/pe.em (read_addend): Similarly.
      	(make_import_fixup): Similarly.  Add debug code from pep.em.
      f35cc0de
    • Alan Modra's avatar
      PR30343, LTO ignores linker reference to _pei386_runtime_relocator · defb8817
      Alan Modra authored
      Make a reference to _pei386_runtime_relocator before LTO recompilation.
      This is done regardless of whether such a reference will be used,
      because it can't be known whether it is needed before LTO.
      
      I also found it necessary to enable long section names for the bfd
      created in make_runtime_pseudo_reloc, because otherwise when writing
      it out to the bfd-in-memory we get the section written as .rdata_r
      which when read back in leads to a linker warning ".rdata_r: section
      below image base" and likely runtime misbehaviour.
      
      	PR 30343
      	* emultempl/pe.em (make_runtime_ref): New function.
      	(gld${EMULATION_NAME}_before_plugin_all_symbols_read): New function.
      	(LDEMUL_BEFORE_PLUGIN_ALL_SYMBOLS_READ): Define.
      	* emultempl/pep.em: Similarly to pe.em.
      	* pe-dll.c (make_runtime_pseudo_reloc): Set long section names.
      defb8817
    • GDB Administrator's avatar
      Automatic date update in version.in · 8406216e
      GDB Administrator authored
      8406216e
  3. May 07, 2023
  4. May 06, 2023
  5. May 05, 2023
    • Tom Tromey's avatar
      Filter out types from DAP scopes request · 28b59491
      Tom Tromey authored
      The DAP scopes request examines the symbols in a block tree, but
      neglects to omit types.  This patch fixes the problem.
      
      28b59491
    • Tom Tromey's avatar
      Use discrete_position in ada-valprint.c · 100c7a99
      Tom Tromey authored
      
      I found a couple of spots in ada-valprint.c that use an explicit loop,
      but where discrete_position could be used instead.
      
      Reviewed-by: default avatarKeith Seitz <keiths@redhat.com>
      100c7a99
    • Andrew Burgess's avatar
      gdb/python: add mechanism to manage Python initialization functions · 3965bff5
      Andrew Burgess authored
      Currently, when we add a new python sub-system to GDB,
      e.g. py-inferior.c, we end up having to create a new function like
      gdbpy_initialize_inferior, which then has to be called from the
      function do_start_initialization in python.c.
      
      In some cases (py-micmd.c and py-tui.c), we have two functions
      gdbpy_initialize_*, and gdbpy_finalize_*, with the second being called
      from finalize_python which is also in python.c.
      
      This commit proposes a mechanism to manage these initialization and
      finalization calls, this means that adding a new Python subsystem will
      no longer require changes to python.c or python-internal.h, instead,
      the initialization and finalization functions will be registered
      directly from the sub-system file, e.g. py-inferior.c, or py-micmd.c.
      
      The initialization and finalization functions are managed through a
      new class gdbpy_initialize_file in python-internal.h.  This class
      contains a single global vector of all the initialization and
      finalization functions.
      
      In each Python sub-system we create a new gdbpy_initialize_file
      object, the object constructor takes care of registering the two
      callback functions.
      
      Now from python.c we can call static functions on the
      gdbpy_initialize_file class which take care of walking the callback
      list and invoking each callback in turn.
      
      To slightly simplify the Python sub-system files I added a new macro
      GDBPY_INITIALIZE_FILE, which hides the need to create an object.  We
      can now just do this:
      
        GDBPY_INITIALIZE_FILE (gdbpy_initialize_registers);
      
      One possible problem with this change is that there is now no
      guaranteed ordering of how the various sub-systems are initialized (or
      finalized).  To try and avoid dependencies creeping in I have added a
      use of the environment variable GDB_REVERSE_INIT_FUNCTIONS, this is
      the same environment variable used in the generated init.c file.
      
      Just like with init.c, when this environment variable is set we
      reverse the list of Python initialization (and finalization)
      functions.  As there is already a test that starts GDB with the
      environment variable set then this should offer some level of
      protection against dependencies creeping in - though for full
      protection I guess we'd need to run all gdb.python/*.exp tests with
      the variable set.
      
      I have tested this patch with the environment variable set, and saw no
      regressions, so I think we are fine right now.
      
      One other change of note was for gdbpy_initialize_gdb_readline, this
      function previously returned void.  In order to make this function
      have the correct signature I've updated its return type to int, and we
      now return 0 to indicate success.
      
      All of the other initialize (and finalize) functions have been made
      static within their respective sub-system files.
      
      There should be no user visible changes after this commit.
      3965bff5
    • Andrew Burgess's avatar
      gdb/testsuite: more newline pattern cleanup · a5d3f94c
      Andrew Burgess authored
      After this commit:
      
        commit e2f62013
        Date:   Thu Mar 30 13:26:25 2023 +0100
      
            gdb/testsuite: change newline patterns used in gdb_test
      
      It was pointed out in PR gdb/30403 that the same patterns can be found
      in other lib/gdb.exp procs and that it would probably be a good idea
      if these procs remained in sync with gdb_test.  Actually, the bug
      specifically calls out gdb_test_multiple when using with '-wrap', but
      I found a couple of other locations in gdb_continue_to_breakpoint,
      gdb_test_multiline, get_valueof, and get_local_valueof.
      
      In all these locations one or both of the following issues are
      addressed:
      
        1. A leading pattern of '[\r\n]*' is pointless.  If there is a
        newline it will be matched, but if there is not then the testsuite
        doesn't care.  Also, as expect is happy to skip non-matched output
        at the start of a pattern, if there is a newline expect is happy to
        skip over it before matching the rest.  As such, this leading
        pattern is removed.
      
        2. Using '\[\r\n\]*$gdb_prompt' means that we will swallow
        unexpected blank lines at the end of a command's output, but also,
        if the pattern from the test script ends with a '\r', '\n', or '.'
        then these will partially match the trailing newline, with the
        remainder of the newline matched by the pattern from gdb.exp.  This
        split matching doesn't add any value, it's just something that has
        appeared as a consequence of how gdb.exp was originally written.  In
        this case the '\[\r\n\]*' is replaced with '\r\n'.
      
      I've rerun the testsuite and fixed the regressions that I saw, these
      were places where GDB emits a blank line at the end of the command
      output, which we now need to explicitly match in the test script, this
      was for:
      
        gdb.dwarf2/dw2-out-of-range-end-of-seq.exp
        gdb.guile/guile.exp
        gdb.python/python.exp
      
      Or a location where the test script was matching part of the newline
      sequence, while gdb.exp was previously matching the remainder of the
      newline sequence.  Now we rely on gdb.exp to match the complete
      newline sequence, this was for:
      
        gdb.base/commands.exp
      
      Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30403
      a5d3f94c
    • Tom de Vries's avatar
      [gdb/testsuite] Generate long string in gdb.base/page.exp · c5ba639d
      Tom de Vries authored
      I noticed in gdb.base/page.exp:
      ...
      set fours [string repeat 4 40]
      ...
      but then shortly afterwards:
      ...
          [list 1\r\n 2\r\n 3\r\n 444444444444444444444444444444]
      ...
      
      Summarize the long string in the same way using string repeat:
      ...
          [list 1\r\n 2\r\n 3\r\n [string repeat 4 30]]
      ...
      
      Tested on x86_64-linux.
      c5ba639d
    • Andrew Burgess's avatar
      gdb/testsuite: tighten patterns in build-id-no-debug-warning.exp · 58d047ac
      Andrew Burgess authored
      Tighten the expected output pattern in the test script:
      
        gdb.debuginfod/build-id-no-debug-warning.exp
      
      While working on some other patch I broke GDB such that this warning:
      
        warning: "FILENAME": separate debug info file has no debug info
      
      (which is generated in build-id.c) didn't actually include the
      FILENAME any more -- yet this test script continued to pass.  It turns
      out that this script doesn't actually check for FILENAME.
      
      This commit extends the test pattern to check for the full warning
      string, including FILENAME, and also removes some uses of '.*' to make
      the test stricter.
      58d047ac
    • Tom Tromey's avatar
      Simplify decode_locdesc · 23323938
      Tom Tromey authored
      While looking into another bug, I noticed that the DWARF cooked
      indexer picks up an address for this symbol:
      
       <1><82>: Abbrev Number: 2 (DW_TAG_variable)
          <83>   DW_AT_specification: <0x9f>
          <87>   DW_AT_location    : 10 byte block: e 0 0 0 0 0 0 0 0 e0 	(DW_OP_const8u: 0 0; DW_OP_GNU_push_tls_address or DW_OP_HP_unknown)
          <92>   DW_AT_linkage_name: (indirect string, offset: 0x156): _ZN9container8tlsvar_0E
      
      This happens because decode_locdesc allows the use of
      DW_OP_GNU_push_tls_address.
      
      This didn't make sense to me.  I looked into it a bit more, and I
      think decode_locdesc is used in three ways:
      
      1. Find a constant address of a symbol that happens to be encoded as a
         location expression.
      
      2. Find the offset of a function in a virtual table.  (This one should
         probably be replaced by code to just evaluate the expression in
         gnu-v3-abi.c -- but there's no point yet because no compiler
         actually seems to emit correct DWARF here, see the bug linked in
         the patch.)
      
      3. Find the offset of a field, if the offset is a constant.
      
      None of these require TLS.
      
      This patch simplifies decode_locdesc by removing any opcodes that
      don't fit into the above.  It also changes the API a little, to make
      it less difficult to use.
      
      Regression tested on x86-64 Fedora 36.
      
      23323938
    • Tom Tromey's avatar
      Simplify auto_load_expand_dir_vars and remove substitute_path_component · 02601231
      Tom Tromey authored
      This simplifies auto_load_expand_dir_vars to first split the string,
      then do any needed substitutions.  This was suggested by Simon, and is
      much simpler than the current approach.
      
      Then this patch also removes substitute_path_component, as it is no
      longer called.  This is nice because it helps with the long term goal
      of removing utils.h.
      
      Regression tested on x86-64 Fedora 36.
      
      
      02601231
    • Tom de Vries's avatar
      [gdb/testsuite] Add gdb.base/wrap-line.exp · 4891c459
      Tom de Vries authored
      Add a test-case that tests prompt edit wrapping in CLI, both
      for TERM=xterm and TERM=ansi, both with auto-detected and hard-coded width.
      
      In the TERM=ansi case with auto-detected width we run into PR cli/30346, so
      add a KFAIL for that failure mode.
      
      Tested on x86_64-linux.
      4891c459
    • Tom de Vries's avatar
      [gdb/testsuite] Add gdb.tui/wrap-line.exp · c2a0fca0
      Tom de Vries authored
      Add a test-case that tests prompt edit wrapping behaviour in the tuiterm, both
      for CLI and TUI, both with auto-detected and hard-coded width.
      
      In the CLI case with auto-detected width we run into PR cli/30411, so add a
      KFAIL for that failure mode.
      
      Tested on x86_64-linux.
      c2a0fca0
    • Nick Clifton's avatar
      Debug info is lost for functions only called from functions marked with cmse_nonsecure_entr · e4fbcd83
      Nick Clifton authored
        PR 30354
        * elf32-arm.c (elf32_arm_gc_mark_extra_sections): If any debug sections are marked then rerun the extra marking in order to pick up any dependencies.
      e4fbcd83
    • GDB Administrator's avatar
      Automatic date update in version.in · 6c8a5ab9
      GDB Administrator authored
      6c8a5ab9
  6. May 04, 2023
    • Bruno Larsen's avatar
      Revert "gdb/testsuite: add KFAILs to gdb.reverse/step-reverse.exp" · 34e2d487
      Bruno Larsen authored
      
      This reverts commit 476410b3.
      
      One of Simon's recent commits (2a740b3b)
      changed the way recording a remote target works and fixed the underlying
      issue of the bug, so the KFails can be removed from the test.
      
      Approved-By: default avatarTom Tromey <tom@tromey.com>
      34e2d487
    • Gareth Rees's avatar
      Don't treat references to compound values as "simple". · 51f8dafb
      Gareth Rees authored
      SUMMARY
      
      The '--simple-values' argument to '-stack-list-arguments' and similar
      GDB/MI commands does not take reference types into account, so that
      references to arbitrarily large structures are considered "simple" and
      printed. This means that the '--simple-values' argument cannot be used
      by IDEs when tracing the stack due to the time taken to print large
      structures passed by reference.
      
      DETAILS
      
      Various GDB/MI commands ('-stack-list-arguments', '-stack-list-locals',
      '-stack-list-variables' and so on) take a PRINT-VALUES argument which
      may be '--no-values' (0), '--all-values' (1) or '--simple-values' (2).
      In the '--simple-values' case, the command is supposed to print the
      name, type, and value of variables with simple types, and print only the
      name and type of variables with compound types.
      
      The '--simple-values' argument ought to be suitable for IDEs that need
      to update their user interface with the program's call stack every time
      the program stops. However, it does not take C++ reference types into
      account, and this makes the argument unsuitable for this purpose.
      
      For example, consider the following C++ program:
      
          struct s {
              int v[10];
          };
      
          int
          sum(const struct s &s)
          {
              int total = 0;
              for (int i = 0; i < 10; ++i) total += s.v[i];
              return total;
          }
      
          int
          main(void)
          {
              struct s s = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } };
              return sum(s);
          }
      
      If we start GDB in MI mode and continue to 'sum', the behaviour of
      '-stack-list-arguments' is as follows:
      
          (gdb)
          -stack-list-arguments --simple-values
          ^done,stack-args=[frame={level="0",args=[{name="s",type="const s &",value="@0x7fffffffe310: {v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}"}]},frame={level="1",args=[]}]
      
      Note that the value of the argument 's' was printed, even though 's' is
      a reference to a structure, which is not a simple value.
      
      See https://github.com/microsoft/MIEngine/pull/673 for a case where this
      behaviour caused Microsoft to avoid the use of '--simple-values' in
      their MIEngine debug adapter, because it caused Visual Studio Code to
      take too long to refresh the call stack in the user interface.
      
      SOLUTIONS
      
      There are two ways we could fix this problem, depending on whether we
      consider the current behaviour to be a bug.
      
      1. If the current behaviour is a bug, then we can update the behaviour
         of '--simple-values' so that it takes reference types into account:
         that is, a value is simple if it is neither an array, struct, or
         union, nor a reference to an array, struct or union.
      
         In this case we must add a feature to the '-list-features' command so
         that IDEs can detect that it is safe to use the '--simple-values'
         argument when refreshing the call stack.
      
      2. If the current behaviour is not a bug, then we can add a new option
         for the PRINT-VALUES argument, for example, '--scalar-values' (3),
         that would be suitable for use by IDEs.
      
         In this case we must add a feature to the '-list-features' command
         so that IDEs can detect that the '--scalar-values' argument is
         available for use when refreshing the call stack.
      
      PATCH
      
      This patch implements solution (1) as I think the current behaviour of
      not printing structures, but printing references to structures, is
      contrary to reasonable expectation.
      
      Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29554
      51f8dafb
    • Nick Clifton's avatar
      Stop the linker from loosing the entry point for COFF/PE code when compiling with LTO enabled. · 35394145
      Nick Clifton authored
        PR 30300
        * emultempl/pep.em (set_entry_point): Add an undefined reference to the entry point if it has been constructed heuristically.
        * emultempl/pe.em (set_entry_point): Likewise.
      35394145
    • Dimitar Dimitrov's avatar
      ld: pru: Place exception-handling sections correctly · 35130e73
      Dimitar Dimitrov authored
        * scripttempl/pru.sc (OUTPUT_SECTION_ALIGN): New helper variable to place at end of DMEM output sections.
        (.data): Use the helper variable.
        (.eh_frame): New output section.
        (.gnu_extab): Ditto.
        (.gcc_except_table): Ditto.
        (.resource_table): Use the helper variable.
      35130e73
    • Jan Beulich's avatar
      RISC-V: tighten post-relocation-operator separator expectation · 654dfab0
      Jan Beulich authored
      As per the spec merely a blank isn't okay as a separator, the operand
      to the relocation function ought to be parenthesized. Enforcing this
      then also eliminates an inconsistency in that
      
      	lui	t0, %hi sym
      	lui	t0, %hi 0x1000
      
      were accepted, but
      
      	lui	t0, %hi +sym
      	lui	t0, %hi -0x1000
      
      were not.
      654dfab0
    • Ilya Leoshkevich's avatar
      gas: fix building tc-bpf.c on s390x · c9819077
      Ilya Leoshkevich authored
      char is unsigned on s390x, so there are a lot of warnings like:
      
          gas/config/tc-bpf.c: In function 'get_token':
          gas/config/tc-bpf.c:900:14: error: comparison is always false due to limited range of data type [-Werror=type-limits]
            900 |       if (ch == EOF || len > MAX_TOKEN_SZ)
                |              ^~
      
      Change its type to int, like in the other similar code.
      
      There is also:
      
          gas/config/tc-bpf.c:735:30: error: 'bpf_endianness' may be used uninitialized in this function [-Werror=maybe-uninitialized]
            735 |    dst, be ? size[endianness - BPF_BE16] : size[endianness - BPF_LE16]);
                |                   ~~~~~~~~~~~^~~~~~~~~~
      
      -Wmaybe-uninitialized doesn't seem to understand the FSM; just
      initialize bpf_endianness to silence it.  Add an assertion to
      build_bpf_endianness() in order to catch potential bugs.
      c9819077
Loading