aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2017-11-19Remove usage of find_inferior in reset_lwp_ptrace_options_callbackSimon Marchi2-30/+26
Replace with for_each_thread, and inline code from reset_lwp_ptrace_options_callback. gdb/gdbserver/ChangeLog: * linux-low.c (reset_lwp_ptrace_options_callback): Remove. (linux_handle_new_gdb_connection): Use for_each_thread, inline code from reset_lwp_ptrace_options_callback.
2017-11-19Remove usages of find_inferior in linux-arm-low.cSimon Marchi2-29/+33
Replace two usages with the overload of for_each_thread that filters on pid. It allows to simplify the callback a little bit. gdb/gdbserver/ChangeLog: * linux-arm-low.c (struct update_registers_data): Remove. (update_registers_callback): Return void, take arguments directly, don't check thread's pid. (arm_insert_point, arm_remove_point): Use for_each_thread.
2017-11-19Remove usage of find_inferior in win32-low.cSimon Marchi2-6/+12
Replace with for_each_thread. gdb/gdbserver/ChangeLog: * win32-low.c (continue_one_thread): Return void, take argument directly. (child_continue): Use for_each_thread.
2017-11-19Remove usage of find_inferior in win32-i386-low.cSimon Marchi2-20/+16
Straightforward replacement of find_inferior with the overload of for_each_thread that filters on pid. I am able to build-test this patch, but not run it. gdb/gdbserver/ChangeLog: * win32-i386-low.c (update_debug_registers_callback): Rename to ... (update_debug_registers): ... this, return void, remove pid_p arg. (x86_dr_low_set_addr, x86_dr_low_set_control): Use for_each_thread.
2017-11-19Fix typo in ChangeLog entry.Cary Coutant1-2/+2
2017-11-19Fix DWARF reader to use correct size for DW_FORM_ref_addr.Cary Coutant3-2/+33
2017-11-19 Ian Lance Taylor <iant@google.com> Cary Coutant <ccoutant@gmail.com> gold/ * gold/dwarf_reader.h (class Dwarf_info_reader): Add ref_addr_size method. * gold/dwarf_reader.cc (Dwarf_die::read_attributes): Use ref_addr_size for DW_FORM_ref_addr_size. (Dwarf_die::skip_attributes): Likewise.
2017-11-20Automatic date update in version.inGDB Administrator1-1/+1
2017-11-18Fix error message typo.Jim Wilson2-1/+6
bfd/ * elfnn-riscv.c (_bfd_riscv_relax_align): Add space between alignment and to in error message.
2017-11-19Automatic date update in version.inGDB Administrator1-1/+1
2017-11-19PR22443, Global buffer overflow in _bfd_elf_get_symbol_version_stringAlan Modra3-10/+25
Symbols like *ABS* defined in bfd/section.c:global_syms are not elf_symbol_type. They can appear on relocs and perhaps other places in an ELF bfd, so a number of places in nm.c and objdump.c are wrong to cast an asymbol based on the bfd being ELF. I think we lose nothing by excluding all section symbols, not just the global_syms. PR 22443 * nm.c (sort_symbols_by_size): Don't attempt to access section symbol internal_elf_sym. (print_symbol): Likewise. Don't call bfd_get_symbol_version_string for section symbols. * objdump.c (compare_symbols): Don't attempt to access section symbol internal_elf_sym. (objdump_print_symname): Don't call bfd_get_symbol_version_string for section symbols.
2017-11-18Automatic date update in version.inGDB Administrator1-1/+1
2017-11-17Finish fixing riscv gas lns-common-1 failure, and lns-duplicate.Jim Wilson2-2/+174
binutils/ * readelf.c (elf/riscv.h): Alphabetize include. (is_32bit_inplace_add_reloc, is_32bit_inplace_sub_reloc) (is_64bit_inplace_add_reloc, is_64bit_inplace_sub_reloc) (is_16bit_inplace_add_reloc, is_16bit_inplace_sub_reloc) (is_8bit_inplace_add_reloc, is_8bit_inplace_sub_reloc): New. (apply_relocations): New locals reloc_inplace and reloc_subtract. Call the new functions and set the new locals. Call byte_get if reloc_inplace. Subtract sym->st_value if reloc_subtract.
2017-11-17Use an enum to represent subclasses of symbolTom Tromey4-11/+32
This changes struct symbol to use an enum to encode the concrete subclass of a particular symbol. Note that "enum class" doesn't work properly with bitfields, so a plain enum is used. 2017-11-17 Tom Tromey <tom@tromey.com> * symtab.h (enum symbol_subclass_kind): New. (struct symbol) <is_cplus_template_function, is_rust_vtable>: Remove. <subclass>: New member. (SYMBOL_IS_CPLUS_TEMPLATE_FUNCTION): Update. * rust-lang.c (rust_get_trait_object_pointer): Update. * dwarf2read.c (read_func_scope): Update. (read_variable): Update.
2017-11-17Make template_symbol derive from symbolTom Tromey4-10/+11
This changes template_symbol to derive from symbol, which seems a bit cleaner; and also more consistent with rust_vtable_symbol. 2017-11-17 Tom Tromey <tom@tromey.com> * dwarf2read.c (read_func_scope): Update. * symtab.h (struct template_symbol): Derive from symbol. <base>: Remove.
2017-11-17Handle dereferencing Rust trait objectsTom Tromey12-0/+405
In Rust, virtual tables work a bit differently than they do in C++. In C++, as you know, they are connected to a particular class hierarchy. Rust, instead, can generate a virtual table for potentially any type -- in fact, one such virtual table for each trait (a trait is similar to an abstract class or to a Java interface) that a type implements. Objects that are referenced via a trait can't currently be inspected by gdb. This patch implements the Rust equivalent of "set print object". gdb relies heavily on the C++ ABI to decode virtual tables; primarily to make "set print object" work; but also "info vtbl". However, Rust does not currently have a specified ABI, so this approach seems unwise to emulate. Instead, I've changed the Rust compiler to emit some DWARF that describes trait objects (previously their internal structure was opaque), vtables (currently just a size -- but I hope to expand this in the future), and the concrete type for which a vtable was emitted. The concrete type is expressed as a DW_AT_containing_type on the vtable's type. This is a small extension to DWARF. This patch adds a new entry to quick_symbol_functions to return the symtab that holds a data address. Previously there was no way in gdb to look up a full (only minimal) non-text symbol by address. The psymbol implementation of this method works by lazily filling in a map that is added to the objfile. This avoids slowing down psymbol reading for a feature that is likely to not be used too frequently. I did not update .gdb_index. My thinking here is that the DWARF 5 indices will obsolete .gdb_index soon-ish, meaning that adding a new feature to them is probably wasted work. If necessary I can update the DWARF 5 index code when it lands in gdb. Regression tested on x86-64 Fedora 25. 2017-11-17 Tom Tromey <tom@tromey.com> * symtab.h (struct symbol) <is_rust_vtable>: New member. (struct rust_vtable_symbol): New. (find_symbol_at_address): Declare. * symtab.c (find_symbol_at_address): New function. * symfile.h (struct quick_symbol_functions) <find_compunit_symtab_by_address>: New member. * symfile-debug.c (debug_qf_find_compunit_symtab_by_address): New function. (debug_sym_quick_functions): Link to debug_qf_find_compunit_symtab_by_address. * rust-lang.c (rust_get_trait_object_pointer): New function. (rust_evaluate_subexp) <case UNOP_IND>: New case. Call rust_get_trait_object_pointer. * psymtab.c (psym_relocate): Clear psymbol_map. (psym_fill_psymbol_map, psym_find_compunit_symtab_by_address): New functions. (psym_functions): Link to psym_find_compunit_symtab_by_address. * objfiles.h (struct objfile) <psymbol_map>: New member. * dwarf2read.c (dwarf2_gdb_index_functions): Update. (process_die) <DW_TAG_variable>: New case. Call read_variable. (rust_containing_type, read_variable): New functions. 2017-11-17 Tom Tromey <tom@tromey.com> * gdb.rust/traits.rs: New file. * gdb.rust/traits.exp: New file.
2017-11-17Remove DEF_VEC_I (int)Simon Marchi2-2/+4
Now that all its usages are removed, we can get rid of DEF_VEC_I (int). gdb/ChangeLog: * common/gdb_vecs.h (DEF_VEC_I (int)): Remove.
2017-11-17Make process_info::syscalls_to_catch an std::vectorSimon Marchi5-28/+36
This patch makes the syscalls_to_catch field of process_info an std::vector<int>. The process_info structure must now be newed/deleted. In handle_extended_wait, the code that handles exec events destroys the existing process_info and creates a new one. It moves the content of syscalls_to_catch from the old to the new vector. I used std::move for that (through an intermediary variable), which should have the same behavior as the old code. gdb/gdbserver/ChangeLog: * inferiors.h (struct process_info): Add constructor, initialize fields.. <syscalls_to_catch>: Change type to std::vector<int>. * inferiors.c (add_process): Allocate process_info with new. (remove_process): Free process_info with delete. * linux-low.c (handle_extended_wait): Adjust. (gdb_catching_syscalls_p, gdb_catch_this_syscall_p): Adjust. * server.c (handle_general_set): Adjust.
2017-11-17Make open_fds an std::vectorSimon Marchi2-19/+19
Simple replacement of VEC with std::vector. gdb/ChangeLog: * common/filestuff.c: Include <algorithm>. (open_fds): Change type to std::vector<int>. (do_mark_open_fd): Adjust. (unmark_fd_no_cloexec): Adjust. (do_close): Adjust.
2017-11-17Make output_thread_groups take an std::vector<int>Simon Marchi2-10/+12
A simple replacement of VEC with std::vector. gdb/ChangeLog: * breakpoint.c (output_thread_groups): Take an std::vector. (print_one_breakpoint_location): Adjust.
2017-11-17(Ada) fix handling of minimal symbols (UNOP_CAST and UNOP_ADDR)Joel Brobecker9-10/+192
Consider a program which provides a symbol without debugging information. For instance, compiling the following code without -g: Some_Minimal_Symbol : Integer := 1234; pragma Export (C, Some_Minimal_Symbol, "some_minsym"); Trying to print this variable with GDB now causes an error, which is now expected: (gdb) p some_minsym 'some_minsym' has unknown type; cast it to its declared type However, trying to cast this symbol, or to take its address does not work: (gdb) p integer(some_minsym) 'some_minsym' has unknown type; cast it to its declared type (gdb) p &some_minsym 'some_minsym' has unknown type; cast it to its declared type Another manisfestation of this issue can be seen when trying to insert an Ada exception catchpoint for a specific standard exception (this only occurs if the Ada runtime is built without debugging information, which is the default). For instance: $ (gdb) catch exception constraint_error warning: failed to reevaluate internal exception condition for catchpoint 0: 'constraint_error' has unknown type; cast it to its declared type This is because, internally, the cachtpoint uses a condition referencing a minimal symbol, more precisely: long_integer (e) = long_integer (&constraint_error) This patch fixes all issues listed above: 1. resolve_subexp: Special-case the handling of OP_VAR_MSYM_VALUE expression elements, where there are no ambiguities to be resolved in that situation; 2. ada_evaluate_subexp: Enhance the handling of the UNOP_CAST handling so as to process the case where the target of the cast is a minimal symbol (as well as a symbol with debugging information). This mimics what's done in C. gdb/ChangeLog: * ada-lang.c (resolve_subexp): Add handling of OP_VAR_MSYM_VALUE. (ada_evaluate_subexp_for_cast): New function. (ada_evaluate_subexp) <UNOP_CAST>: Replace code by call to ada_evaluate_subexp_for_cast. (ada_evaluate_subexp) <nosideret>: Replace code by call to eval_skip_value. * eval.c (evaluate_var_value): Make non-static. (evaluate_var_msym_value, eval_skip_value): Likewise. * value.h (evaluate_var_value, evaluate_var_msym_value) (eval_skip_value): Declare. gdb/testsuite/ChangeLog: * gdb.ada/minsyms: New testcase. Tested on x86_64-linux. No regression. Fixes the following failures: catch_ex.exp: continuing to Program_Error exception catch_ex.exp: continuing to failed assertion catch_ex.exp: continuing to unhandled exception catch_ex.exp: continuing to program completion complete.exp: p <Exported_Capitalized> complete.exp: p Exported_Capitalized complete.exp: p exported_capitalized mi_catch_ex.exp: catch Program_Error (unexpected output) mi_catch_ex.exp: continue to exception catchpoint hit (unknown output after running) mi_catch_ex.exp: continue to assert failure catchpoint hit (unknown output after running) mi_catch_ex.exp: continue to unhandled exception catchpoint hit (unknown output after running) mi_ex_cond.exp: catch C_E if i = 2 (unexpected output)
2017-11-17Fix a memory leak when processing archives.Nick Clifton2-0/+6
PR 22449 * ar.c (write_archive): Free the temporary file name.
2017-11-17x86: Pass "%F%P:" to linker callback in case of errorH.J. Lu2-10/+15
We should pass "%F%P:" to linker callback in case of error. Otherwise, linker will report: : failed to create GNU property section * elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Pass "%F%P:", instead of "%F:", to linker callback in case of error.
2017-11-17Fix a snafu in a previous update to readelf that stopped it from printing ↵Nick Clifton2-0/+6
archive member names along with the archive file name. -- This patch causes problems for glibc linknamespace tests because of how it changes the output format of readelf on .a files. Previously, "readelf -W -s libc.a" would produce output starting e.g.: File: /scratch/jmyers/glibc/many8/build/glibcs/x86_64-linux-gnu/glibc/libc.a(init-first.o) Symbol table '.symtab' contains 30 entries: and continuing with symbol information for each object in that .a file. After this commit, instead it starts: File: /scratch/jmyers/glibc/many8/build/glibcs/x86_64-linux-gnu/glibc/libc.a Symbol table '.symtab' contains 30 entries: and every object's symbol information starts with the same File: line, missing any information about which object's symbols (within libc.a) are being listed. I think the previous File: lines that said libc.a(init-first.o) etc., identifying the particular object within libc.a, were clearly preferable, and the glibc linknamespace tests rely on having that information about the individual object within libc.a. -- binutils * readelf.c (process_archive): Include member name in the file_name of the filedata structure.
2017-11-16ada-lang.c::ada_value_cast: remove unused parameter nosideJoel Brobecker2-3/+8
gdb/ChangeLog: * ada-lang.c (ada_value_cast): Remove parameter "noside". Update all callers.
2017-11-17Automatic date update in version.inGDB Administrator1-1/+1
2017-11-16Test breakpoint commands w/ "continue" + Ctrl-CPedro Alves3-0/+176
This adds the testcase that exposed the multiple problems with Ctrl-C handling fixed by the previous patches, when run against both native and gdbserver GNU/Linux. gdb/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * gdb.base/bp-cmds-continue-ctrl-c.c: New file. * gdb.base/bp-cmds-continue-ctrl-c.exp: New file.
2017-11-16Python unwinder sniffer: PyExc_KeyboardInterrupt -> QuitPedro Alves2-0/+12
If you happen to press Ctrl-C while GDB is running the Python unwinder machinery, the Ctrl-C is swallowed by the Python unwinder machinery. For example, with: break foo commands > c > end and while (1) foo (); and then let the inferior hit "foo" repeatedly, sometimes Ctrl-C results in: ~~~ 23 usleep (100); Breakpoint 2, foo () at gdb.base/bp-cmds-continue-ctrl-c.c:23 23 usleep (100); ^C Breakpoint 2, Python Exception <class 'KeyboardInterrupt'> <class 'KeyboardInterrupt'>: foo () at gdb.base/bp-cmds-continue-ctrl-c.c:23 23 usleep (100); Breakpoint 2, foo () at gdb.base/bp-cmds-continue-ctrl-c.c:23 23 usleep (100); Breakpoint 2, foo () at gdb.base/bp-cmds-continue-ctrl-c.c:23 23 usleep (100); ~~~ Notice the Python exception above. The interesting thing here is that GDB continues as if nothing happened, doesn't really stop and give back control to the user. Instead, the Ctrl-C aborted the Python unwinder sniffer and GDB moved on to just use another unwinder. Fix this by translating a PyExc_KeyboardInterrupt back into a Quit exception once back in GDB. This was exposed by the new gdb.base/bp-cmds-continue-ctrl-c.exp testcase added later in the series. gdb/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * python/py-unwind.c (pyuw_sniffer): Translate PyExc_KeyboardInterrupt to a GDB Quit exception.
2017-11-16Don't ever Quit out of resumePedro Alves2-35/+17
If you have a breakpoint command that re-resumes the target, like: break foo commands > c > end and then let the inferior run, hitting the breakpoint, and then press Ctrl-C at just the right time, between GDB processing the stop at "foo", and re-resuming the target, you'll hit the QUIT call in infrun.c:resume. With this hack, we can reproduce the bad case consistently: --- a/gdb/inf-loop.c +++ b/gdb/inf-loop.c @@ -31,6 +31,8 @@ #include "top.h" #include "observer.h" +bool continue_hack; + /* General function to handle events in the inferior. */ void @@ -64,6 +66,8 @@ inferior_event_handler (enum inferior_event_type event_type, { check_frame_language_change (); + continue_hack = true; + /* Don't propagate breakpoint commands errors. Either we're stopping or some command resumes the inferior. The user will be informed. */ diff --git a/gdb/infrun.c b/gdb/infrun.c index d425664..c74b14c 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -2403,6 +2403,10 @@ resume (enum gdb_signal sig) gdb_assert (!tp->stop_requested); gdb_assert (!thread_is_in_step_over_chain (tp)); + extern bool continue_hack; + + if (continue_hack) + set_quit_flag (); QUIT; The GDB backtrace looks like this: (top-gdb) bt ... #3 0x0000000000612e8b in throw_quit(char const*, ...) (fmt=0xaf84a1 "Quit") at src/gdb/common/common-exceptions.c:408 #4 0x00000000007fc104 in quit() () at src/gdb/utils.c:748 #5 0x00000000006a79d2 in default_quit_handler() () at src/gdb/event-top.c:954 #6 0x00000000007fc134 in maybe_quit() () at src/gdb/utils.c:762 #7 0x00000000006f66a3 in resume(gdb_signal) (sig=GDB_SIGNAL_0) at src/gdb/infrun.c:2406 #8 0x0000000000700c3d in keep_going_pass_signal(execution_control_state*) (ecs=0x7ffcf3744e60) at src/gdb/infrun.c:7793 #9 0x00000000006f5fcd in start_step_over() () at src/gdb/infrun.c:2145 #10 0x00000000006f7b1f in proceed(unsigned long, gdb_signal) (addr=18446744073709551615, siggnal=GDB_SIGNAL_DEFAULT) at src/gdb/infrun.c:3135 #11 0x00000000006ebdd4 in continue_1(int) (all_threads=0) at src/gdb/infcmd.c:842 #12 0x00000000006ec097 in continue_command(char*, int) (args=0x0, from_tty=0) at src/gdb/infcmd.c:938 #13 0x00000000004b5140 in do_cfunc(cmd_list_element*, char*, int) (c=0x2d18570, args=0x0, from_tty=0) at src/gdb/cli/cli-decode.c:106 #14 0x00000000004b8219 in cmd_func(cmd_list_element*, char*, int) (cmd=0x2d18570, args=0x0, from_tty=0) at src/gdb/cli/cli-decode.c:1952 #15 0x00000000007f1532 in execute_command(char*, int) (p=0x7ffcf37452b1 "", from_tty=0) at src/gdb/top.c:608 #16 0x00000000004bd127 in execute_control_command(command_line*) (cmd=0x3a88ef0) at src/gdb/cli/cli-script.c:485 #17 0x00000000005cae0c in bpstat_do_actions_1(bpstat*) (bsp=0x37edcf0) at src/gdb/breakpoint.c:4513 #18 0x00000000005caf67 in bpstat_do_actions() () at src/gdb/breakpoint.c:4563 #19 0x00000000006e8798 in inferior_event_handler(inferior_event_type, void*) (event_type=INF_EXEC_COMPLETE, client_data=0x0) at src/gdb/inf-loop.c:72 #20 0x00000000006f9447 in fetch_inferior_event(void*) (client_data=0x0) at src/gdb/infrun.c:3970 #21 0x00000000006e870e in inferior_event_handler(inferior_event_type, void*) (event_type=INF_REG_EVENT, client_data=0x0) at src/gdb/inf-loop.c:43 #22 0x0000000000494d58 in remote_async_serial_handler(serial*, void*) (scb=0x3585ca0, context=0x2cd1b80) at src/gdb/remote.c:13820 #23 0x000000000044d682 in run_async_handler_and_reschedule(serial*) (scb=0x3585ca0) at src/gdb/ser-base.c:137 #24 0x000000000044d767 in fd_event(int, void*) (error=0, context=0x3585ca0) at src/gdb/ser-base.c:188 #25 0x00000000006a5686 in handle_file_event(file_handler*, int) (file_ptr=0x45997d0, ready_mask=1) at src/gdb/event-loop.c:733 #26 0x00000000006a5c29 in gdb_wait_for_event(int) (block=1) at src/gdb/event-loop.c:859 #27 0x00000000006a4aa6 in gdb_do_one_event() () at src/gdb/event-loop.c:347 #28 0x00000000006a4ade in start_event_loop() () at src/gdb/event-loop.c:371 and when that happens, you end up with GDB's run control in quite a messed up state. Something like this: thread_function1 (arg=0x1) at threads.c:107 107 usleep (SLEEP); /* Loop increment. */ Quit (gdb) c Continuing. ** nothing happens, time passes..., press ctrl-c again ** ^CQuit (gdb) info threads Id Target Id Frame 1 Thread 1462.1462 "threads" (running) * 2 Thread 1462.1466 "threads" (running) 3 Thread 1462.1465 "function0" (running) (gdb) c Cannot execute this command while the selected thread is running. (gdb) The first "Quit" above is thrown from within "resume", and cancels run control while GDB is in the middle of stepping over a breakpoint. with step_over_info_valid_p() true. The next "c" didn't actually resume anything, because GDB throught that the step-over was still in progress. It wasn't, because the thread that was supposed to be stepping over the breakpoint wasn't actually resumed. So at this point, we press Ctrl-C again, and this time, the default quit handler is called directly from the event loop (event-top.c:default_quit_handler -> quit()), because gdb was left owning the terminal (because the previous resume was cancelled before we reach target_resume -> target_terminal::inferior()). Note that the exception called from within resume ends up calling normal_stop via resume_cleanups. That's very borked though, because normal_stop is going to re-handle whatever was the last reported event, possibly even re-running a hook stop... I think that the only sane way to safely cancel the run control state machinery is to push an event via handle_inferior_event like all other events. The fix here does two things, and either alone would fix the problem at hand: #1 - passes the terminal to the inferior earlier, so that any QUIT call from the point we declare the target as running goes to the inferior directly, protecting run control from unsafe QUIT calls. #2 - gets rid of this QUIT call in resume and of its related unsafe resume_cleanups. Aboout #2, the comment describing resume says: /* Resume the inferior, but allow a QUIT. This is useful if the user wants to interrupt some lengthy single-stepping operation (for child processes, the SIGINT goes to the inferior, and so we get a SIGINT random_signal, but for remote debugging and perhaps other targets, that's not true). but that's a really old comment that predates a lot of fixes to Ctrl-C handling throughout both GDB core and the remote target, that made sure that a Ctrl-C isn't ever lost. In any case, if some target depended on this, a much better fix would be to make the target return a SIGINT stop out of target_wait the next time that is called. This was exposed by the new gdb.base/bp-cmds-continue-ctrl-c.exp testcase added later in the series. gdb/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * infrun.c (resume_cleanups): Delete. (resume): No longer install a resume_cleanups cleanup nor call QUIT. (proceed): Pass the terminal to the inferior. (keep_going_pass_signal): No longer install a resume_cleanups cleanup.
2017-11-16Fix stdin ending up not registered after a QuitPedro Alves2-1/+14
If you press Ctrl-C while GDB is processing breakpoint commands the TRY/CATCH in inferior_event_handler catches the Quit exception and prints it, and then if the interpreter was running a foreground execution command, nothing re-adds stdin back in the event loop, meaning the debug session ends up busted, because the user can't type anything... This was exposed by the new gdb.base/bp-cmds-continue-ctrl-c.exp testcase added later in the series. gdb/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * inf-loop.c (inferior_event_handler): Don't swallow the exception if the prompt is blocked.
2017-11-16Fix swallowed "Quit" when inserting breakpointsPedro Alves2-20/+26
If GDB is inserting a breakpoint and you type Ctrl-C at the exact "right" time, you'll hit a QUIT call in target_read, and the breakpoint insertion is cancelled. However, the related TRY/CATCH code in insert_bp_location does: CATCH (e, RETURN_MASK_ALL) { bp_err = e.error; bp_err_message = e.message; } The problem with that is that a RETURN_QUIT exception has e.error == 0, which means that further below, in the places that check for error with: if (bp_err != GDB_NO_ERROR) because GDB_NO_ERROR == 0, GDB continues as if the breakpoint was inserted succesfully, and resumes the inferior. Since the breakpoint wasn't inserted the inferior runs free, out of our control... Fix this by having insert_bp_location store a copy of the whole exception instead of just a error/message parts, and then checking "gdb_exception::reason" instead. This was exposed by the new gdb.base/bp-cmds-continue-ctrl-c.exp testcase added later in the series. gdb/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * breakpoint.c (insert_bp_location): Replace bp_err and bp_err_message locals by a gdb_exception local.
2017-11-16gdb/inflow.c: Move SIGTTOU temporary ignoring to a RAII classPedro Alves2-17/+38
I expect to use this in more places (in inflow.c) in follow up patches, but I think this is still good on its own. gdb/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * inflow.c (scoped_ignore_sigttou): New class. (child_terminal_ours_1, new_tty): Use it.
2017-11-16Fix testing gdb.rust/modules.exp against gdbserverPedro Alves2-8/+15
Currently several tests in gdb.rust/modules.exp fail with --target_board=native-gdbserver: Running src/gdb/testsuite/gdb.rust/modules.exp ... FAIL: gdb.rust/modules.exp: call f3() FAIL: gdb.rust/modules.exp: call self::f2() FAIL: gdb.rust/modules.exp: call self::super::f2() FAIL: gdb.rust/modules.exp: call super::f2() FAIL: gdb.rust/modules.exp: call self::super::super::f2() FAIL: gdb.rust/modules.exp: call super::super::f2() FAIL: gdb.rust/modules.exp: call ::f2() FAIL: gdb.rust/modules.exp: call extern modules::mod1::f2() This is because these tests rely on matching inferior output. However, when testing with gdbserver, inferior output goes to a separate terminal instead of to gdb's terminal, and so gdb_test won't cut it, as that is only reading from gdb's pty/gdb_spawn_id: (gdb) call f3() (gdb) FAIL: gdb.rust/modules.exp: call f3() call self::f2() (gdb) FAIL: gdb.rust/modules.exp: call self::f2() Fix this by using gdb_test_stdio instead, which handles output coming out of gdbserver's pty. Also, skip the tests if the target/board doesn't support inferior I/O at all. gdb/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * gdb.rust/modules.exp: Skip tests that rely on inferior I/O if gdb,noinferiorio is set, and use gdb_test_stdio otherwise.
2017-11-16Refactor endian handling in DFP routinesUlrich Weigand2-39/+43
This patch moves endian conversion into the decimal_from_number and decimal_to_number routines, and removes it from all their callers, making the code simpler overall. No functional change. gdb/ChangeLog: 2017-11-16 Ulrich Weigand <uweigand@de.ibm.com> * target-float.c (decimal_from_number): Add byte_order argument and call match_endianness. Error if unknown floating-point type. (decimal_to_number): Add byte_order argument and call match_endianness. (decimal_from_longest): Update call. Do not call match_endianness. (decimal_from_ulongest): Likewise. (decimal_binop): Likewise. (decimal_is_zero): Likewise. (decimal_compare): Likewise. (decimal_convert): Likewise.
2017-11-16Add new AArch64 FP16 FM{A|S} instructions.Tamar Christina9-5/+30
This patch separates the new FP16 instructions backported from Armv8.4-a to Armv8.2-a into a new flag order to distinguish them from the rest of the already existing optional FP16 instructions in Armv8.2-a. The new flag "+fp16fml" is available from Armv8.2-a and implies +fp16 and is mandatory on Armv8.4-a. gas/ * config/tc-aarch64.c (fp16fml): New. * doc/c-aarch64.texi (fp16fml): New. * testsuite/gas/aarch64/armv8_2-a-crypto-fp16.d (fp16): Make fp16fml. * testsuite/gas/aarch64/armv8_3-a-crypto-fp16.d (fp16): Make fp16fml. include/ * opcode/aarch64.h: (AARCH64_FEATURE_F16_FML): New. (AARCH64_ARCH_V8_4): Enable AARCH64_FEATURE_F16_FML by default. opcodes/ * aarch64-tbl.h (aarch64_feature_fp_16_v8_2): Require AARCH64_FEATURE_F16_FML and AARCH64_FEATURE_F16.
2017-11-16Correct AArch64 crypto dependencies.Tamar Christina2-4/+13
The crypto options depend on SIMD and FP, the documentation states so but the dependency is not there the code. We have mostly gotten away with this due to the default flags for the architectures (e.g. Armv8.2-a implies +simd) but this discrepancy needs to be addressed. gas/ 2017-11-16 Tamar Christina <tamar.christina@arm.com> * opcodes/aarch64-tbl.h (aarch64_feature_crypto): Add ARCH64_FEATURE_SIMD and AARCH64_FEATURE_FP. (aarch64_feature_crypto_v8_2, aarch64_feature_sm4): Likewise. (aarch64_feature_sha3): Likewise.
2017-11-16Update documentation for Arvm8.4-A changes to AArch64.Tamar Christina2-3/+16
gas/ 2017-11-16 Tamar Christina <tamar.christina@arm.com> * doc/c-aarch64.texi (armv8.4-a, sha2, sha3, sm4): New. (dotprod): Update default note.
2017-11-16Add assembler and disassembler support for the new Armv8.4-a instructions ↵Tamar Christina16-2925/+16357
for AArch64. Some of these instructions have been back-ported as optional extensions to Armv8.2-a and higher, but others are only available for Armv8.4-a. opcodes/ * aarch64-tbl.h (sha512h, sha512h2, sha512su0, sha512su1, eor3): New. (rax1, xar, bcax, sm3ss1, sm3tt1a, sm3tt1b, sm3tt2a, sm3tt2b): New. (sm3partw1, sm3partw2, sm4e, sm4ekey, fmlal, fmlsl): New. (fmlal2, fmlsl2, cfinv, rmif, setf8, setf16, stlurb): New. (ldapurb, ldapursb, stlurh, ldapurh, ldapursh, stlur): New. (ldapur, ldapursw, stlur): New. * aarch64-dis-2.c: Regenerate. gas/ * testsuite/gas/aarch64/armv8_4-a-illegal.d: New. * testsuite/gas/aarch64/armv8_4-a-illegal.l: New. * testsuite/gas/aarch64/armv8_4-a-illegal.s: New. * testsuite/gas/aarch64/armv8_4-a.d: New. * testsuite/gas/aarch64/armv8_4-a.s: New. * testsuite/gas/aarch64/armv8_2-a-crypto-fp16.s: New. * testsuite/gas/aarch64/armv8_2-a-crypto-fp16.d: New. * testsuite/gas/aarch64/armv8_3-a-crypto-fp16.d: New. * testsuite/gas/aarch64/armv8_4-a-crypto-fp16.d: New. * testsuite/gas/aarch64/armv8_2-a-crypto-fp16-illegal.s: New. * testsuite/gas/aarch64/armv8_2-a-crypto-fp16-illegal.l: New. * testsuite/gas/aarch64/armv8_2-a-crypto-fp16-illegal.d: New.
2017-11-16GDBserver: Fix ignored Ctrl-C after reconnectionPedro Alves5-4/+111
This fixes the issue reported by Dmitry Antipov <dantipov@nvidia.com> here: https://sourceware.org/ml/gdb/2017-10/msg00048.html The problem is that GDBserver stops listening to Ctrl-C/interrupt requests if you disconnect and reconnect back. Dmitry wrote: ~~~ Currently gdbserver installs SIGIO handler just once, in initialize_async_io() called from captured_main(), and this handler is removed when remote_desc is closed in remote_close(). Next, when a new instance of remote_desc is fetched from accept() and has '\003' arrived, input_interrupt() is never called because it is not registered as SIGIO handler. ~~~ The fix here is not remove the SIGIO handler in the first place, thus going back to the original before-first-connection state. (I haven't gone back to try it, but I think this was a regression caused by commit 8b2073398477 ("[GDBserver] Block and unblock SIGIO"), which was what made remote_close remove the signal handler.) New test included. gdb/gdbserver/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * remote-utils.c (remote_close): Block SIGIO signals instead of uninstalling the SIGIO handler. gdb/testsuite/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * gdb.server/reconnect-ctrl-c.c: New file. * gdb.server/reconnect-ctrl-c.exp: New file.
2017-11-16Prevent illegal memory accesses when parsing incorrecctly formated core notes.Nick Clifton2-0/+17
PR 22421 * elf.c (elfcore_grok_netbsd_procinfo): Check that the note is big enough. (elfcore_grok_openbsd_procinfo): Likewise. (elfcore_grok_nto_status): Likewise.
2017-11-16Add Python rbreak command.Phil Muldoon9-1/+388
gdb/Changelog 2017-11-16 Phil Muldoon <pmuldoon@redhat.com> * python/python.c (gdbpy_rbreak): New function. * NEWS: Document Python rbreak feature. testsuite/Changelog 2017-11-16 Phil Muldoon <pmuldoon@redhat.com> * gdb.python/py-rbreak.exp: New file. * gdb.python/py-rbreak.c: New file. * gdb.python/py-rbreak-func2.c: New file. doc/Changelog 2017-11-16 Phil Muldoon <pmuldoon@redhat.com> * python.texi (Basic Python): Add rbreak documentation.
2017-11-16Prevent a possible seg-fault in the section merging code, by always creating ↵Nick Clifton2-10/+17
a padding buffer. * merge.c (sec_merge_emit): Always create padding buffer. Add asserts to make sure that the buffer is long enough.
2017-11-16x86: ignore high register select bit(s) in 32- and 16-bit modesJan Beulich5-32/+129
While commits 9889cbb14e ("Check invalid mask registers") and abfcb414b9 ("X86: Ignore REX_B bit for 32-bit XOP instructions") went a bit into the right direction, this wasn't quite enough: - VEX.vvvv has its high bit ignored - EVEX.vvvv has its high bit ignored together with EVEX.v' - the high bits of {,E}VEX.vvvv should not be prematurely zapped, to allow proper checking of them when the fields has to hold al ones - when the high bits of an immediate specify a register, bit 7 is ignored
2017-11-16Fix gdb.base/starti.exp racy testPedro Alves3-3/+13
This commit fixes a couple problems with gdb.base/starti.exp, causing spurious FAILs. The first is a double-prompt problem: ~~~ (gdb) PASS: gdb.base/starti.exp: hook-stop starti [....] gdb_expect_list pattern: /\$1 = 0/ $1 = 0 gdb_expect_list pattern: // 0x00007ffff7ddcc80 in _start () from /lib64/ld-linux-x86-64.so.2 (gdb) # EXPECTED PROMPT (gdb) PASS: gdb.base/starti.exp: starti # ANOTHER PROMPT! break main ~~~ This happens because the test uses gdb_test_sequence with no command, like this: gdb_test_sequence "" "starti" { "Program stopped." "\\$1 = 0" } but gdb_test_sequence doesn't have a check for empty command like gdb_test_multiple does, and so sends "\n" to GDB: proc gdb_test_sequence { command test_name expected_output_list } { global gdb_prompt if { $test_name == "" } { set test_name $command } lappend expected_output_list ""; # implicit ".*" before gdb prompt send_gdb "$command\n" return [gdb_expect_list $test_name "$gdb_prompt $" $expected_output_list] } "starti" is a no-repeat command, so pressing <ret> just makes another prompt appear, confusing the following gdb_test/gdb_test_multiple/etc. Even with that fixed, the testcase is still racy though. The second problem is that sometimes the "continue" test times out here: ~~~ continue Continuing. $2 = 1 gdb_expect_list pattern: /.*Breakpoint .*main \(\) at .*starti.c.*/ Breakpoint 1, main () at /home/pedro/src/gdb/testsuite/gdb.base/starti.c:29 29 return 0; (gdb) gdb_expect_list pattern: // * hung here * ~~~ The problem is that the too-greedy ".*" trailing match in gdb_expect_list's pattern ends up consuming GDB's prompt too soon. Fix that by removing the unnecessary trailing ".*". While at it, remove all ".*"s to be stricter. Tested on x86_64 GNU/Linux. gdb/testsuite/ChangeLog: 2017-11-16 Pedro Alves <palves@redhat.com> * gdb.base/starti.exp ("continue" test): Remove ".*"s from pattern. * lib/gdb.exp (gdb_test_sequence): Don't send empty command to GDB.
2017-11-16ix86/Intel: don't require memory operand size specifier for PTWRITEJan Beulich5-1/+13
Other than in 64-bit mode, in 32- and 16-bit modes operand size isn't ambiguous.
2017-11-16i386: Replace .code64/.code32 with .byteH.J. Lu2-13/+13
Since .code64 directive isn't available for 32-bit BFD and ELF directive isn't available for non-ELF directive, we should avoid them. * testsuite/gas/i386/noextreg.s: Replace .code64/.code32 and 64-bit instructions with .byte. Remove ELF directive.
2017-11-16Remove non-linux tic6x target descriptionsYao Qi4-39/+6
They are not used by GDB nor by GDBserver. This patch removes them. gdb: 2017-11-16 Yao Qi <yao.qi@linaro.org> * features/tic6x-c62x.xml: Remove. * features/tic6x-c64x.xml: Remove. * features/tic6x-c64xp.xml: Remove.
2017-11-16Allow osabi to be optional in target descriptionsAlan Hayward2-5/+11
gdbserver/ * tdesc.c (tdesc_get_features_xml): Allow null osabi.
2017-11-16Fix tic6x-uclinux GDBserver build failureYao Qi2-10/+13
I can't find a c6x-uclinux c++ compiler, so I use my host g++ to build tic6x-uclinux GDBserver, and find the following build failures. They are not target specific, so I believe they are real errors. This patch fixes them. ../binutils-gdb/gdb/gdbserver/linux-tic6x-low.c:313:34: error: invalid conversion from 'void*' to 'tic6x_register*' [-fpermissive] union tic6x_register *regset = buf; ^ ../binutils-gdb/gdb/gdbserver/linux-tic6x-low.c: In function 'void tic6x_store_gregset(regcache*, const void*)': ../binutils-gdb/gdb/gdbserver/linux-tic6x-low.c:324:40: error: invalid conversion from 'const void*' to 'const tic6x_register*' [-fpermissive] const union tic6x_register *regset = buf; ^ ../binutils-gdb/gdb/gdbserver/linux-tic6x-low.c: At global scope: ../binutils-gdb/gdb/gdbserver/linux-tic6x-low.c:359:28: error: redefinition of 'usrregs_info tic6x_usrregs_info' static struct usrregs_info tic6x_usrregs_info = ^ ../binutils-gdb/gdb/gdbserver/linux-tic6x-low.c:186:28: note: 'usrregs_info tic6x_usrregs_info' previously declared here static struct usrregs_info tic6x_usrregs_info; ^ gdb/gdbserver: 2017-11-16 Yao Qi <yao.qi@linaro.org> * linux-tic6x-low.c (tic6x_fill_gregset): Cast buf. (tic6x_store_gregset): Likewise. (tic6x_usrregs_info): Move it up.
2017-11-16Automatic date update in version.inGDB Administrator1-1/+1
2017-11-15Include <array> to declare std::array<>.John Baldwin2-0/+5
gdb/ChangeLog: * symtab.h: Include <array>.