aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2016-04-18Fix PR gdb/19250: ptrace prototype is not detected properly in C++ modePedro Alves5-154/+23
The ptrace args/return types detection doesn't work properly in C++ mode, on non-GNU/Linux hosts. For example, on gcc70 (NetBSD 5.1), where the prototype is: int ptrace(int, __pid_t, void*, int); configure misdetects it as: $ grep PTRACE_TYPE config.h #define PTRACE_TYPE_ARG1 int #define PTRACE_TYPE_ARG3 int * #define PTRACE_TYPE_ARG4 int /* #undef PTRACE_TYPE_ARG5 */ #define PTRACE_TYPE_RET int resulting in: ../../src/gdb/amd64bsd-nat.c: In function 'void amd64bsd_fetch_inferior_registers(target_ops*, regcache*, int)': ../../src/gdb/amd64bsd-nat.c:56: warning: dereferencing type-punned pointer will break strict-aliasing rules ../../src/gdb/amd64bsd-nat.c: In function 'void amd64bsd_store_inferior_registers(target_ops*, regcache*, int)': ../../src/gdb/amd64bsd-nat.c:104: warning: dereferencing type-punned pointer will break strict-aliasing rules ../../src/gdb/amd64bsd-nat.c:110: warning: dereferencing type-punned pointer will break strict-aliasing rules We could address this [1], however despite ptrace.m4's claim: # Needs to be tested in C++ mode, to detect whether we need to cast # the first argument to enum __ptrace_request. it appears that there's actually no need to test in C++ mode. Always running the ptrace tests in C mode works just the same on GNU/Linux. I remember experimenting with several different ways to handle the original issue back then, and maybe that was needed in some other attempt and then I didn't realize it ended up not really necessary. Confirmed that this fixes the NetBSD 5.1 C++ build, and confirmed that C and C++ builds on Fedora 23 are unaffected. [1] - https://sourceware.org/ml/gdb-patches/2016-04/msg00374.html gdb/ChangeLog: 2016-04-18 Pedro Alves <palves@redhat.com> * ptrace.m4 (GDB_AC_PTRACE): Don't run tests in C++ mode. * configure: Regenerate. gdb/gdbserver/ChangeLog: 2016-04-18 Pedro Alves <palves@redhat.com> * configure: Regenerate.
2016-04-18Fix gdb crash when trying to print the address of a synthetic C++ referenceMartin Galvan4-4/+120
After compiling a program which uses C++ references some optimizations may convert the references into synthetic "pointers". Trying to print the address of one of such synthetic references causes gdb to crash with the following error: (gdb) print &ref /build/buildd/gdb-7.7.1/gdb/dwarf2loc.c:1624: internal-error: Should not be able to create a lazy value with an enclosing type A problem internal to GDB has been detected, further debugging may prove unreliable. Apparently, what was causing it was that value_addr returns a copy of the value that represents the reference with its type set to T* instead of T&. However, its enclosing_type is left untouched, which fails a check made in read_pieced_value. We only see the crash happen for references that are synthetic because they're treated as pieced values, thus the call to read_pieced_value. On a related note, it seems that in general there are all sorts of breakage when working with synthetic references. This is reported here: https://sourceware.org/bugzilla/show_bug.cgi?id=19893 gdb/ChangeLog: 2016-04-18 Martin Galvan <martin.galvan@tallertechnologies.com> * valops.c (value_addr): For C++ references, set the copied value's enclosing_type as well. gdb/testsuite/ChangeLog: 2016-04-18 Martin Galvan <martin.galvan@tallertechnologies.com> * gdb.dwarf2/implref.exp: New file.
2016-04-18fortran: Testsuite, fix different type naming across compilers.Bernhard Heckel9-48/+142
Gfortran and ifort have different names for data types. Encapsulate type names in a library to increase number of supported compilers. gfortran -4.2 : int4 gfortran>=4.3 : integer(kind=4) ifort : INTEGER(4) 2016-04-18 Bernhard Heckel <bernhard.heckel@intel.com> gdb/testsuite/Changelog: * gdb.fortran/common-block.exp: Use type naming defined in lib fortran. * gdb.fortran/derived-type.exp: Use type naming defined in lib fortran. * gdb.fortran/multi-dim.exp: Use type naming defined in lib fortran. * gdb.fortran/vla-datatypes.exp: Use type naming defined in lib fortran. * gdb.fortran/vla-ptype-sub.exp: Use type naming defined in lib fortran. * gdb.fortran/vla-ptype.exp: Use type naming defined in lib fortran. * gdb.fortran/whatis_type.exp: Use type naming defined in lib fortran. * lib/fortran.exp (fortran_int4): New procedure. (fortran_real4, fortran_real8, fortran_complex4): Likewise. (fortran_logical4): Likewise.
2016-04-18Testsuite: Fix compiling of shared libraries with ICC.Bernhard Heckel2-0/+7
We are missing "-fpic" flag when compiling shared libraries with ICC. 2016-04-18 Bernhard Heckel <bernhard.heckel@intel.com> gdb/Testsuite/Changelog: * lib/gdb.exp (gdb_compile_shlib): Add flag for ICC compiler.
2016-04-18testsuite: Support detection of Intel compilers via test_compiler_version.Bernhard Heckel3-0/+29
Add Intel specific preprocessor macros to query the version of the compiler. 2016-04-18 Bernhard Heckel <bernhard.heckel@intel.com> gdb/Testsuite/Changelog: * lib/compiler.c: Add Intel specific preprocessor macros. * lib/compiler.cc: Likewise.
2016-04-18Revert 415fa612Yao Qi2-8/+8
2016-04-18 Yao Qi <yao.qi@linaro.org> Revert: 2016-04-15 Yao Qi <yao.qi@linaro.org> * arm-tdep.c (thumb_stack_frame_destroyed_p): Return zero if PC is far from the end of function.
2016-04-16gdb/ada-exp.y: Remap yydefredPedro Alves2-0/+5
On: $ uname -a NetBSD gcc70.fsffrance.org 5.1 NetBSD 5.1 (GENERIC) #0: Sat Nov 6 13:19:33 UTC 2010 builds@b6.netbsd.org:/home/builds/ab/netbsd-5-1-RELEASE/amd64/201011061943Z-obj/home/builds/ab/netbsd-5-1-RELEASE/src/sys/arch/amd64/compile/GENERIC amd64 The link fails with: (...) d-exp.o: In function `parse_number': ../../src/gdb/d-exp.y:762: multiple definition of `yydefred' ada-exp.o:/home/palves/gdb/build/gdb/ada-lex.c:925: first defined here ld: Warning: size of symbol `yydefred' changed from 464 in ada-exp.o to 336 in d-exp.o Makefile:1404: recipe for target 'gdb' failed NetBSD's yacc uses a "yydefred" symbol that we missed renaming in the Ada parser. All other gdb parsers do this already. gdb/ChangeLog: 2016-04-16 Pedro Alves <palves@redhat.com> * ada-exp.y (yydefred): Define as ada_yydefred.
2016-04-16Fix gdb build with --enable-build-with-cxx --disable-nlsPedro Alves2-2/+7
Compiling gdb with --enable-build-with-cxx --disable-nls, we get: .../src/gdb/ada-lang.c:7657:16: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive] type_str = (type != NULL ^ In file included from .../src/gdb/common/common-defs.h:67:0, from .../src/gdb/defs.h:28, from .../src/gdb/ada-lang.c:21: .../src/gdb/common/gdb_locale.h:40:27: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive] # define _(String) (String) ^ .../src/gdb/ada-lang.c:7730:46: note: in expansion of macro ‘_’ char *name_str = name != NULL ? name : _("<null>"); ^ Makefile:1140: recipe for target 'ada-lang.o' failed gdb/ChangeLog: 2016-04-15 Pedro Alves <palves@redhat.com> * ada-lang.c (ada_lookup_struct_elt_type): Constify 'type_str' and 'name_str' locals.
2016-04-16Fix gdb C++ build when libipt is availablePedro Alves2-2/+7
With libipt's headers installed, a build with --enable-build-with-cxx fails with: .../src/gdb/btrace.c: In function ‘btrace_insn_flag pt_btrace_insn_flags(const pt_insn*)’: .../src/gdb/btrace.c:734:33: error: invalid conversion from ‘int’ to ‘btrace_insn_flag’ [-fpermissive] enum btrace_insn_flag flags = 0; ^ .../src/gdb/btrace.c:737:11: error: invalid conversion from ‘int’ to ‘btrace_insn_flag’ [-fpermissive] flags |= BTRACE_INSN_FLAG_SPECULATIVE; ^ gdb/ChangeLog: 2016-04-15 Pedro Alves <palves@redhat.com> * btrace.c (pt_btrace_insn_flags): Change return type to btrace_insn_flags. Use btrace_insn_flags for local.
2016-04-15MIPS/Linux: Also recognize TRAP_BRKPT and TRAP_HWBKPTPedro Alves2-4/+13
This makes the MIPS Linux backends recognize TRAP_BRKPT and TRAP_HWBKPT in siginfo.si_code in addition to SI_KERNEL, since Linux 4.6 now reports the finer-grained si_code values too. Refs: https://sourceware.org/ml/gdb-patches/2016-02/msg00756.html https://sourceware.org/ml/gdb-patches/2016-04/msg00090.html On kernels that report SI_KERNEL (<= 4.5), we'll enter the "ambiguous" path of save_stop_reason: if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code) && GDB_ARCH_IS_TRAP_HWBKPT (siginfo.si_code)) { /* The si_code is ambiguous on this arch -- check debug registers. */ if (!check_stopped_by_watchpoint (lp)) lp->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT; } while on kernels that report the finer-grained si_code values (>= 4.6), we'll enter the corresponding branches: else if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code)) { } else if (GDB_ARCH_IS_TRAP_HWBKPT (siginfo.si_code)) { ... gdb/ChangeLog: 2016-04-15 Pedro Alves <palves@redhat.com> * nat/linux-ptrace.h [__mips__] (GDB_ARCH_IS_TRAP_BRKPT): Also accept TRAP_BRKPT. [__mips__] (GDB_ARCH_IS_TRAP_HWBKPT): Also accept TRAP_HWBKPT.
2016-04-15[ARM] minor opt in thumb_stack_frame_destroyed_pYao Qi2-0/+13
thumb_stack_frame_destroyed_p scans the instructions from PC to the end of the function, but if PC is far from the end of pc, we don't have to scan, because PC should be in epilogue if it is still far from the end of the function. The criterion I use here is 16 bytes, which is more than 4 instructions. Regression tested on aarch64-linux with mutli-arch debug. gdb: 2016-04-15 Yao Qi <yao.qi@linaro.org> * arm-tdep.c (thumb_stack_frame_destroyed_p): Return zero if PC is far from the end of function.
2016-04-14Avoid "format not a string literal" warningsPedro Alves3-25/+37
On: $ uname -a NetBSD gcc70.fsffrance.org 5.1 NetBSD 5.1 (GENERIC) #0: Sat Nov 6 13:19:33 UTC 2010 builds@b6.netbsd.org:/home/builds/ab/netbsd-5-1-RELEASE/amd64/201011061943Z-obj/home/builds/ab/netbsd-5-1-RELEASE/src/sys/arch/amd64/compile/GENERIC amd64 With: $ g++ -v Using built-in specs. Target: x86_64--netbsd Configured with: /usr/src/tools/gcc/../../gnu/dist/gcc4/configure --enable-long-long --disable-multilib --enable-threads --disable-symvers --build=x86_64-unknown-netbsd4.99.72 --host=x86_64--netbsd --target=x86_64--netbsd --enable-__cxa_atexit Thread model: posix gcc version 4.1.3 20080704 prerelease (NetBSD nb2 20081120) I saw: cc1plus: warnings being treated as errors ../../src/gdb/ctf.c: In function 'void ctf_save_metadata_header(trace_write_handler*)': ../../src/gdb/ctf.c:267: warning: format not a string literal, argument types not checked cc1plus: warnings being treated as errors ../../src/gdb/cli/cli-cmds.c: In function 'void alias_command(char*, int)': ../../src/gdb/cli/cli-cmds.c:1428: warning: format not a string literal and no format arguments ../../src/gdb/cli/cli-cmds.c:1457: warning: format not a string literal and no format arguments gdb/ChangeLog: 2016-04-14 Pedro Alves <palves@redhat.com> * cli/cli-cmds.c (alias_usage_error): New function. (alias_command): Use it. * ctf.c (ctf_save_metadata_header): Inline metadata_fmt local in ctf_save_write_metadata call.
2016-04-14Avoid implicit float <-> integer conversion warningsPedro Alves3-3/+9
On: $ uname -a NetBSD gcc70.fsffrance.org 5.1 NetBSD 5.1 (GENERIC) #0: Sat Nov 6 13:19:33 UTC 2010 builds@b6.netbsd.org:/home/builds/ab/netbsd-5-1-RELEASE/amd64/201011061943Z-obj/home/builds/ab/netbsd-5-1-RELEASE/src/sys/arch/amd64/compile/GENERIC amd64 With: $ g++ -v Using built-in specs. Target: x86_64--netbsd Configured with: /usr/src/tools/gcc/../../gnu/dist/gcc4/configure --enable-long-long --disable-multilib --enable-threads --disable-symvers --build=x86_64-unknown-netbsd4.99.72 --host=x86_64--netbsd --target=x86_64--netbsd --enable-__cxa_atexit Thread model: posix gcc version 4.1.3 20080704 prerelease (NetBSD nb2 20081120) I saw: ../../src/gdb/ada-typeprint.c: In function 'void print_fixed_point_type(type*, ui_file*)': ../../src/gdb/ada-typeprint.c:366: warning: passing 'float' for argument 2 to 'DOUBLEST ada_fixed_to_float(type*, LONGEST)' ../../src/gdb/value.c: In function 'LONGEST unpack_long(type*, const gdb_byte*)': ../../src/gdb/value.c:2833: warning: converting to 'LONGEST' from 'DOUBLEST' ../../src/gdb/value.c:2838: warning: converting to 'LONGEST' from 'DOUBLEST' gdb/ChangeLog: 2016-04-14 Pedro Alves <palves@redhat.com> * ada-typeprint.c (print_fixed_point_type): Don't pass float as argument to function expecting LONGEST. * value.c (unpack_long): Add casts to LONGEST.
2016-04-13Test GDB connection to GDBserver with no symbol filesLuis Machado3-0/+124
This test exercises the scenarios where we attempt to connect GDB to GDBserver in standard remote mode, query the symbol file path, attempt to open said symbol file on GDB's end and fail, causing the connection to drop abruptly. Regression-tested on x86-64/Ubuntu. With an unpatched GDB we should see this: FAIL: gdb.server/connect-with-no-symbol-file.exp: sysroot=: action=permission: connection to GDBserver succeeded (the program is no longer running) FAIL: gdb.server/connect-with-no-symbol-file.exp: sysroot=: action=delete: connection to GDBserver succeeded (the program is no longer running) FAIL: gdb.server/connect-with-no-symbol-file.exp: sysroot=target:: action=permission: connection to GDBserver succeeded (the program is no longer running) FAIL: gdb.server/connect-with-no-symbol-file.exp: sysroot=target:: action=delete: connection to GDBserver succeeded (the program is no longer running) A patched GDB should have full passes. gdb/testsuite/ChangeLog: 2016-04-13 Luis Machado <lgustavo@codesourcery.com> * gdb.server/connect-with-no-symbol-file.c: New file. * gdb.server/connect-with-no-symbol-file.exp: New file.
2016-04-13Debugging without a binary (regression)Luis Machado2-2/+64
When we attempt to debug a process using GDBserver in standard remote mode without a symbol file on GDB's end, we may run into an issue where GDB cuts the connection attempt short due to an error. The error is caused by not being able to open a symbol file, like so: -- (gdb) set sysroot (gdb) tar rem :2345 Remote debugging using :2345 /proc/23769/exe: Permission denied. (gdb) i r The program has no registers now. (gdb) It should've been like this: (gdb) set sysroot (gdb) tar rem :2345 Remote debugging using :2345 warning: /tmp/symbol-file: Permission denied. 0xf7ddb2d0 in ?? () (gdb) i r eax 0x0 0 ecx 0x0 0 edx 0x0 0 ebx 0x0 0 esp 0xffffdfa0 0xffffdfa0 ebp 0x0 0x0 esi 0x0 0 edi 0x0 0 eip 0xf7ddb2d0 0xf7ddb2d0 eflags 0x200 [ IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0 (gdb) This is caused by a couple of function calls within exec_file_locate_attach that can potentially throw errors. The following patch guards both exec_file_attach and symbol_file_add_main to prevent the errors from disrupting the connection process. There was also a case where native GDB tripped on this problem, but it was mostly fixed by bf74e428bca61022bd5cdf6bf28789a184748b4d. Regression-tested on x86-64/Ubuntu. gdb/ChangeLog: 2016-04-13 Luis Machado <lgustavo@codesourcery.com> * exec.c (exec_file_locate_attach): Guard a couple functions that can throw errors. (exception_print_same): New helper function.
2016-04-13Fix zero_ext documentationAntoine Tremblay2-2/+5
This patch fixes the documentation for the zero_ext bytecode description. It removes parts that seemed like a copy/paste from ext, since zero_ext zeros the bits to the left. gdb/doc/ChangeLog: * agentexpr.texi (zero_ext): Fix zero_ext description.
2016-04-13Fix and improve comment in gdb_remote_downloadSimon Marchi2-2/+11
This patch fixes the current comment in gdb_remote_download, which is false (the "except if that's already where it is" part). It also improves it, by explaining why pass TOFILE through standard_output_file, even it is an absolute path. gdb/testsuite/ChangeLog: * lib/gdb.exp (gdb_remote_download): Fix and extend comment.
2016-04-13gdbserver-base.exp: Copy file to standard output directory in ${board}_downloadSimon Marchi2-1/+13
gdbserver-base.exp is used as the base for both native-gdbserver.exp and native-extended-gdbserver.exp. (Despite its name, it should really be considered as a "local-gdbserver-base", as it's not really appropriate to implement a remote gdbserver board.) Currently, the _download procedure is implemented as a no-op (it returns the source file path). Because of the SONAME change, The fast tracepoint tests now require the executable and the IPA (libinproctrace.so) to be located in the same directory (see [1]). When using the native-gdbserver board, because _download returns the original file path, the executable does not end up in the same directory as the library, and it fails to execute. In more general terms, with the recent changes, the testsuite now assumes that when it does ${board}_download <source path 1> <destination path 1> ${board}_download <source path 2> <destination path 2> where the destination paths are relative (generally just the file name), both files will end up in the same base directory. That assumption does not hold for the current implementation in gdbserver-base.exp. The proper fix would be to make native-gdbserver non-remote, so that gdb_remote_download would not call DejaGnu's remote_download (see [2]). We could then get rid of ${board}_download in gdbserver-base.exp. However, that will likely take some time to complete. In the mean time, in order to make the fast tracepoint tests pass, we can simply copy the file to the standard output directory. Basically, it just mimics what gdb_remote_download would do if the board wasn't flagged as remote. Note that I missed these failures originally because I had a libinproctrace.so in /usr/local/lib. So, even though libinproctrace.so wasn't copied to the test output directory, it did find the one in /usr/local/lib. It would be nice to find a way to protect against this, as it could easily happen again... Regtested with unix, native-gdbserver and native-extended-gdbserver, and didn't see anything notable, except the ftrace tests now passing for native-gdbserver. [1] https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=6e774b13c3b81ac2599812adf058796948ce7e95 [2] https://sourceware.org/ml/gdb-patches/2016-04/msg00112.html gdb/testsuite/ChangeLog: * boards/gdbserver-base.exp (${board}_download): Copy source file to standard output directory.
2016-04-13Fix aarch64 ftrace JIT condition testcaseAntoine Tremblay4-3/+12
This patch fixes the following failure: FAIL: gdb.trace/trace-condition.exp: ftrace: -(21 << 1) == -42: check 10 frames were collected. This was due to aarch64_emit_sub using the wrong order in its operands, so the operation would end up being 42 - 0 rather than 0 - 42. This patch also fixes the order of aarch64_emit_add for clarity. The test case for emit_sub is fixed so that the proper order of the operands is needed for the test to pass. Tested on aarch64-native-extended-gdbserver. Note: trace-condition.exp was broken a bit so I had to modify it to run the test. A fix is coming for that in another patch. gdb/gdbserver/ChangeLog: * linux-aarch64-low.c (aarch64_emit_add): Switch x1 and x0. (aarch64_emit_sub): Likewise. gdb/testsuite/ChangeLog: * gdb.trace/trace-condition.exp (foreach): Fix emit_sub testcase.
2016-04-13Fix PR remote/19840: gdb crashes on reverse-stepiPedro Alves2-0/+32
Reverse debugging against a remote target that does reverse debugging itself (with the bs/bc packets) always trips on: (gdb) target remote localhost:... (gdb) reverse-stepi ../../gdb/target.c:602: internal-error: default_execution_direction: to_execution_direction must be implemented for reverse async I missed adding a to_execution_direction method to remote.c in commit 3223143295b5 (Adds target_execution_direction to make record targets support async mode), GDB 7.4 time. Later, GDB 7.8 switched to target-async on by default, making the regression user-visible by default too. Fix is simply to add the missing to_execution_direction implementation to target remote. Tested by Andi Kleen against Simics. gdb/ChangeLog: 2016-04-13 Pedro Alves <palves@redhat.com> PR remote/19840 * remote.c (struct remote_state) <last_resume_exec_dir>: New field. (new_remote_state): Default last_resume_exec_dir to EXEC_FORWARD. (remote_open_1): Reset last_resume_exec_dir to EXEC_FORWARD. (remote_resume): Store the last execution direction. (remote_execution_direction): New function. (init_remote_ops): Install it as to_execution_direction target_ops method.
2016-04-13btrace: fix test build error in gdb.btrace/instruction_history.cMarkus Metzger2-0/+6
On systems with a newer version of GCC the gdb.btrace/instruction_history.exp test fails to build like this: Running .../gdb.btrace/instruction_history.exp ... gdb compile failed, .../gdb.btrace/instruction_history.c: In function 'main': .../gdb.btrace/instruction_history.c:24:3: warning: implicit declaration of function 'loop' [-Wimplicit-function-declaration] loop (); ^ Declare loop to fix it. testsuite/ * gdb.btrace/instruction_history.c (loop): Add declaration.
2016-04-12Fix typo in ftrace.exp condition testingAntoine Tremblay2-1/+5
This obvious patch replaces "ond" wiht "cond" as the test prefix for conditional tests. gdb/testsuite/ChangeLog: * gdb.trace/ftrace.exp (proc): Change test prefix from "ond" to "cond".
2016-04-12[C++] Switch TRY/CATCH to real C++ try/catch by default againPedro Alves2-5/+11
Now that we don't ever throw GDB exceptions from signal handlers [1], we can switch back to having TRY/CATCH implemented in terms of C++ try/catch instead of sigjmp/longjmp. [1] - https://sourceware.org/ml/gdb-patches/2016-03/msg00351.html Tested on x86_64 Fedora 23, native and gdbserver. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * common/common-exceptions.h (GDB_XCPT_TRY): Update comment. [__cplusplus] (GDB_XCPT): Define as GDB_XCPT_TRY.
2016-04-12Use setjmp/longjmp for TRY/CATCH instead of sigsetjmp/siglongjmpPedro Alves4-8/+21
Now that we don't ever throw GDB exceptions from signal handlers [1], we can switch to have TRY/CATCH implemented in terms of plain setjmp/longjmp instead of sigsetjmp/siglongjmp. In https://sourceware.org/ml/gdb-patches/2015-02/msg00114.html, Yichun Zhang mentions a 11%/14%+ speedup in his GDB python scripts with a patch that did something similar to only a specific set of TRY/CATCH calls. [1] - https://sourceware.org/ml/gdb-patches/2016-03/msg00351.html Tested on x86_64 Fedora 23, native and gdbserver. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * common/common-exceptions.c (struct catcher) <buf>: Now a 'jmp_buf' instead of SIGJMP_BUF. (exceptions_state_mc_init): Change return type to 'jmp_buf'. (throw_exception): Use longjmp instead of SIGLONGJMP. * common/common-exceptions.h: Include <setjmp.h> instead of "gdb_setjmp.h". (exceptions_state_mc_init): Change return type to 'jmp_buf'. [GDB_XCPT == GDB_XCPT_SJMP] (TRY): Use setjmp instead of SIGSETJMP. * cp-support.c: Include "gdb_setjmp.h".
2016-04-12Eliminate prepare_to_throw_exceptionPedro Alves6-22/+12
No longer necessary. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * common/common-exceptions.c (exception_rethrow): Remove prepare_to_throw_exception call. * common/common-exceptions.h (prepare_to_throw_exception): Delete declaration. * exceptions.c (prepare_to_throw_exception): Delete. gdb/gdbserver/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * utils.c (prepare_to_throw_exception): Delete.
2016-04-12Eliminate target_check_pending_interruptPedro Alves4-44/+8
This is no longer called anywhere. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * target.c (target_check_pending_interrupt): Delete. * target.h (struct target_ops) <to_check_pending_interrupt>: Remove method. (target_check_pending_interrupt): Remove declaration. * target-delegates.c: Regenerate.
2016-04-12Eliminate immediate_quitPedro Alves9-131/+32
This finally gets rid of immediate_quit (and surrounding infrustruture), as nothing sets it anymore. gdb_call_async_signal_handler was only necessary in order to handle immediate_quit. We can just call mark_async_signal_handler directly on all hosts now. In turn, we can clean up mingw-hdep.c's gdb_select a bit, as sigint_event / sigint_handler is no longer needed. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * defs.h: Update comments on SIGINT handling. (immediate_quit): Delete declaration. * event-loop.c (call_async_signal_handler): Delete. * event-loop.h (call_async_signal_handler): Delete declaration. (mark_async_signal_handler): Update comments. (gdb_call_async_signal_handler): Delete declaration. * event-top.c (handle_sigint): Call mark_async_signal_handler instead of gdb_call_async_signal_handler. * exceptions.c (prepare_to_throw_exception): Remove reference to immediate_quit. (exception_fprintf): Remove comments about immediate_quit. * mingw-hdep.c (sigint_event, sigint_handler): Delete. (gdb_select): Don't wait on sigint_event. (gdb_call_async_signal_handler): Delete. (_initialize_mingw_hdep): Delete. * posix-hdep.c (gdb_call_async_signal_handler): Delete. * utils.c (immediate_quit): Delete.
2016-04-12target remote: Don't rely on immediate_quit (introduce quit handlers)Pedro Alves8-252/+283
remote.c is the last user of immediate_quit. It's relied on to immediately break the initial remote connection sync up, if the user does Ctrl-C, assuming that was because the target isn't responding. At that stage, since the connection isn't synced yet, disconnecting is the only safe thing to do. This commit reworks that, to not rely on throwing from the SIGINT signal handler. So, this commit: - Introduces the concept of a "quit handler". This is used to override what does the QUIT macro do when the quit flag is set. - Makes the "struct serial" reachar / write code call QUIT in the partial read/write loops, so the current quit handler is invoked whenever a serial->read_prim / serial->write_prim returns EINTR. - Makes the "struct serial" reachar / write code call interruptible_select instead of gdb_select, so that QUITs are detected in a race-free manner. - Stops remote.c from setting immediate_quit during the initial connection. - Instead, we install a custom quit handler whenever we're calling into the serial code. This custom quit handler knows to immediately throw a quit when we're in the initial connection setup, and otherwise defer handling the quit/Ctrl-C request to later, when we're safely out of a packet command/response sequence. This also is what is now responsible for handling "double Ctrl-C because target connection is stuck/wedged." - remote.c no longer installs a specialized SIGINT handlers, and instead re-uses the quit flag. Since we want to rely on the QUIT macro, the SIGINT handler must also set the quit. And the easiest is just to not install custom SIGINT handler in remote.c. Let the standard SIGINT handler do its job of setting the quit flag. Centralizing SIGINT handlers seems like a good thing to me, anyway. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * defs.h (quit_handler_ftype, quit_handler) (make_cleanup_override_quit_handler, default_quit_handler): New. (QUIT): Adjust comments. * event-top.c (default_quit_handler): New function. (quit_handler): New global. (struct quit_handler_cleanup_data): New. (restore_quit_handler, restore_quit_handler_dtor) (make_cleanup_override_quit_handler): New. (async_request_quit): Call QUIT. * remote.c (struct remote_state) <got_ctrlc_during_io>: New field. (async_sigint_remote_twice_token, async_sigint_remote_token): Delete. (remote_close): Update comments. (remote_start_remote): Don't set immediate_quit. Set starting_up earlier. (remote_serial_quit_handler, remote_unpush_and_throw): New functions. (remote_open_1): Clear got_ctrlc_during_io. Set remote_async_terminal_ours_p unconditionally. (async_initialize_sigint_signal_handler) (async_handle_remote_sigint, async_handle_remote_sigint_twice) (remote_check_pending_interrupt, async_remote_interrupt) (async_remote_interrupt_twice) (async_cleanup_sigint_signal_handler, ofunc) (sync_remote_interrupt, sync_remote_interrupt_twice): Delete. (remote_terminal_inferior, remote_terminal_ours): Remove async checks. (remote_wait_as): Don't install a SIGINT handler in sync mode. (readchar, remote_serial_write): Override the quit handler with remote_serial_quit_handler. (getpkt_or_notif_sane_1): Don't call QUIT. (initialize_remote_ops): Don't install remote_check_pending_interrupt. (_initialize_remote): Don't create async_sigint_remote_token and async_sigint_remote_twice_token. * ser-base.c (ser_base_wait_for): Call QUIT and use interruptible_select. (ser_base_write): Call QUIT. * ser-go32.c (dos_readchar, dos_write): Call QUIT. * ser-unix.c (wait_for): Don't use VTIME. Always take the gdb_select path, but call QUIT and interruptible_select. * utils.c (maybe_quit): Call the current quit handler. Don't call target_check_pending_interrupt. (defaulted_query, prompt_for_continue): Override the quit handler with the default quit handler.
2016-04-12TUI: GC tui_target_has_runPedro Alves2-24/+8
Nothing actually uses this global. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * tui/tui-hooks.c (tui_target_has_run): Delete. (tui_about_to_proceed): Delete. (tui_about_to_proceed_observer): Delete. (tui_install_hooks, tui_remove_hooks): Don't install/remove an about_to_proceed observer.
2016-04-12Use target_terminal_ours_for_output in MIPedro Alves3-21/+129
The MI code only does output, so leave raw/cooked mode alone, as well as the SIGINT handler. Restore terminal settings after output, while at it. Also, a couple events missed calling target_terminal_ours before output, even. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * mi/mi-interp.c (mi_new_thread): Put target_terminal_ours_for_output in effect while outputting. (mi_thread_exit): Use target_terminal_ours_for_output instead of target_terminal_ours. (mi_record_changed, mi_inferior_added, mi_inferior_appeared) (mi_inferior_exit, mi_inferior_removed, mi_traceframe_changed) (mi_tsv_created, mi_tsv_deleted, mi_tsv_modified) (mi_breakpoint_created, mi_breakpoint_deleted) (mi_breakpoint_modified, mi_solib_loaded, mi_solib_unloaded) (mi_command_param_changed, mi_memory_changed) (report_initial_inferior): Use target_terminal_ours_for_output instead of target_terminal_ours. Restore terminal settings. * mi/mi-main.c (mi_execute_command): Use target_terminal_ours_for_output instead of target_terminal_ours. Restore terminal settings.
2016-04-12Do target_terminal_ours in query & friends instead of in all callersPedro Alves8-114/+75
Any time a caller calls query & friends / prompt_for_continue without ensuring that gdb owns the terminal for input is a bug. So do that in defaulted_query / prompt_for_continue directly instead. An example of a case where we currently miss calling target_terminal_ours is internal_error. Ever since defaulted_query was made to use gdb_readline_callback, there's no way to answer the internal error query if the internal error happens while the target is has the terminal: (gdb) c Continuing. .../src/gdb/linux-nat.c:1676: internal-error: linux_nat_resume: Assertion `dummy_counter < 10' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) _ Entering 'y' or 'n' does not work, GDB does not respond. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> PR gdb/19828 * gnu-nat.c (inf_validate_task_sc): Don't call target_terminal_ours / target_terminal_inferior around query. * i386-tdep.c (i386_record_lea_modrm, i386_process_record): Don't call target_terminal_ours / target_terminal_inferior around yquery. * linux-record.c (record_linux_system_call): Don't call target_terminal_ours / target_terminal_inferior around yquery. * nto-procfs.c (interrupt_query): Don't call target_terminal_ours / target_terminal_inferior around query. * record-full.c (record_full_check_insn_num): Remove 'set_terminal' parameter. Don't call target_terminal_ours / target_terminal_inferior around query. (record_full_message, record_full_registers_change) (record_full_xfer_partial): Adjust. * remote.c (interrupt_query): Don't call target_terminal_ours / target_terminal_inferior around query. * utils.c (defaulted_query): Install cleanup to restore target terminal. Put target_terminal_ours_for_output in effect while defaulted producing, and target_terminal_ours in in effect while handling input. (prompt_for_continue): Install cleanup to restore target terminal. Put target_terminal_ours in in effect while handling input.
2016-04-12Add missing cleanups to defaulted_query and prompt_for_continuePedro Alves2-4/+16
Some of the error paths in these functions leak. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * utils.c (defaulted_query, prompt_for_continue): Free temporary strings with cleanups, instead of xfree.
2016-04-12Use target_terminal_ours_for_output in warning/internal_errorPedro Alves2-2/+18
We're only doing output here, so leave raw/cooked mode alone, as well as the SIGINT handler. And restore terminal settings, while at it. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * utils.c (vwarning, internal_vproblem): Use make_cleanup_restore_target_terminal and target_terminal_ours_for_output.
2016-04-12Use target_terminal_ours_for_output in infcmd.cPedro Alves2-2/+7
We're only doing output here, so leave raw/cooked mode alone, as well as the SIGINT handler. No need to restore terminal settings, we'll set inferior modes on the following resume. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * infcmd.c (post_create_inferior, prepare_one_step): Use target_terminal_ours_for_output instead of target_terminal_ours.
2016-04-12Use target_terminal_ours_for_output in exceptions.cPedro Alves2-1/+13
We're only doing output here, so leave raw/cooked mode alone, as well as the SIGINT handler. Restore terminal settings after output, while at it. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * exceptions.c (print_flush): Use target_terminal_ours_for_output instead of target_terminal_ours, and restore target terminal with a cleanup.
2016-04-12Use target_terminal_ours_for_output in cp-support.cPedro Alves2-1/+9
We're only doing output here, so leave raw/cooked mode alone, as well as the SIGINT handler. Restore terminal settings after output, while at it. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * cp-support.c (gdb_demangle): Use target_terminal_ours_for_output instead of target_terminal_ours, and restore target terminal with a cleanup.
2016-04-12ada-lang.c: Introduce type_as_string and use itPedro Alves2-30/+50
A couple wrong things here - We should not use target_terminal_ours when all we want is output. We should use target_terminal_ours_for_output instead, which preserves raw/cooked terminal modes, and SIGINT forwarding. - Most importantly, relying on stderr output immediately preceding the error/exception print isn't correct. The exception could be caught and handled, for example; MI frontends won't display the stderr part in an error dialog box. Etc. This commit introduces a type_as_string helper that allows building a full error string including type info. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * ada-lang.c (type_as_string, type_as_string_and_cleanup): New functions. (ada_lookup_struct_elt_type): Use type_as_string_and_cleanup.
2016-04-12Fix inconsistent handling of EINTR in ser-*.c backendsPedro Alves3-14/+26
- If serial->write_prim returns EINTR, ser_bas_write returns it to the caller. This just looks wrong to me -- part of the output may have already been sent, and there's no way for the caller to know that, and thus no way for a caller to handle a partial write correctly. - While ser-unix.c:ser_unix_read_prim retries on EINTR, ser-tcp.c:net_read_prim does not. This commit moves EINTR handling to the ser_base_write and ser_base_readchar level, so all serial backends (at least those that use it) end up handling EINTR consistently. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * ser-base.c (fd_event): Retry read_prim on EINTR. (do_ser_base_readchar): Retry read_prim on EINTR. (ser_base_write): Retry write_prim on EINTR. * ser-unix.c (ser_unix_read_prim): Don't retry on EINTR here. (ser_unix_write_prim): Remove comment.
2016-04-12Pass Ctrl-C to the target in target_terminal_inferiorPedro Alves5-0/+88
If the user presses Ctrl-C immediately before target_terminal_inferior is called and the target is resumed, instead of after, the Ctrl-C ends up pending in the quit flag until the target next stops. remote.c has this bit to handle this: if (!target_is_async_p ()) { ofunc = signal (SIGINT, sync_remote_interrupt); /* If the user hit C-c before this packet, or between packets, pretend that it was hit right here. */ if (check_quit_flag ()) sync_remote_interrupt (SIGINT); } But that's only reachable if async is off, while async is on by default nowadays. It's also obviously not reacheable on native targets. This patch generalizes that to all targets. We can't remove that remote.c bit yet, until we get rid of the sync SIGINT handler though. That'll be done later in the series. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * remote.c (remote_pass_ctrlc): New function. (init_remote_ops): Install it. * target.c (target_terminal_inferior): Pass pending Ctrl-C to the target. (target_pass_ctrlc, default_target_pass_ctrlc): New functions. * target.h (struct target_ops) <to_pass_ctrlc>: New method. (target_pass_ctrlc, default_target_pass_ctrlc): New declarations. * target-delegates.c: Regenerate.
2016-04-12Decouple target_interrupt from all-stop/non-stop modesPedro Alves4-37/+24
In non-stop mode, "interrupt" results in a "stop with no signal", while in all-stop mode, it results in a remote interrupt request / stop with SIGINT. This is currently implemented in both the Linux and remote target backends. Move it to the core code instead, making target_interrupt specifically always about "Interrupting as if with Ctrl-C", just like it is documented. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * infcmd.c (interrupt_target_1): Call target_stop is in non-stop mode. * linux-nat.c (linux_nat_interrupt): Delete. (linux_nat_add_target): Don't install linux_nat_interrupt. * remote.c (remote_interrupt_ns): Change return type to void. Throw error if interrupting the target is not supported. (remote_interrupt): Don't call the remote_stop_ns/remote_stop_as.
2016-04-12Eliminate clear_quit_flagPedro Alves6-37/+11
Nothing calls this anymore. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * defs.h (clear_quit_flag): Remove declaration. * extension-priv.h (struct extension_language_ops) <clear_quit_flag>: Remove field and update comments. * extension.c (clear_quit_flag): Delete. * guile/guile.c (guile_extension_ops): Adjust. * python/python.c (python_extension_ops): Adjust. (gdbpy_clear_quit_flag): Delete.
2016-04-12Don't call clear_quit_flag in captured_mainPedro Alves2-1/+4
This call seems pointless. For instance, a SIGINT handler is only installed later on. And if wasn't, I can't see why we'd want to lose a Ctrl-C request. Getting rid of this allows getting rid of clear_quit_flag. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * main.c (captured_main): Don't clear the quit flag.
2016-04-12Don't call clear_quit_flag in prepare_to_throw_exceptionPedro Alves2-1/+5
I think this is reminiscent of the time when a longjmp would always jump to the top level. Nowaways code that throw exceptions other than a quit, which may even be caught and handled without reaching the top level. Certainly such exceptions shouldn't clear an interrupt request... (We also need to get rid of prepare_to_throw_exception in order to be able to just do "throw ex;" in C++.) One could argue that we should clear the quit flag when we throw a quit from the SIGINT handler, when immediate_quit is in effect, to handle a race, here: immediate_quit++; QUIT; ... that's the usual pattern code must use when enabling immediate_quit. The QUIT is there to catch the case of Ctrl-C having already been pressed before immediate_quit was enabled. However, this can happen: immediate_quit++; << Ctrl-C pressed here too. QUIT; And in that case, if the quit flag was already set, it'll stay set even after throwing a quit from the SIGINT handler. The end result is a double quit. But OTOH, the user did press Ctrl-C two times. Since I'm getting rid of immediate_quit, I'm not bothering with this. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * exceptions.c (prepare_to_throw_exception): Don't clear the quit flag.
2016-04-12Don't call clear_quit_flag in command_handlerPedro Alves2-1/+4
This just looks totally wrong to me, for completetly discarding a user-requested Ctrl-C. I can't think of why we'd want do this here. Actually, I digged the history, and found out that this has been here since at least 7b4ac7e1ed2c (gdb-2.4, the initial revision, 1988), at a time were we had a top level setjmp/longjmp, long before that got wrapped in throw_exception and friends, and this code was in an explicit loop, with the quit_flag cleared on every iteration, before executing a command... gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * event-top.c (command_handler): Don't call clear_quit_flag.
2016-04-12Don't call clear_quit_flag after check_quit_flagPedro Alves3-8/+7
Obviously not necessary since check_quit_flag clears the flag as side effect. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * remote-sim.c (gdb_os_poll_quit): Don't call clear_quit_flag. * remote.c (remote_wait_as): Don't call clear_quit_flag.
2016-04-12Make Python use a struct serial eventPedro Alves2-19/+25
Now that we have an abstract for wakeable events, use it instead of a (heavier) serial pipe. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * python/python.c: Include "ser-event.h". (gdbpy_event_fds): Delete. (gdbpy_serial_event): New. (gdbpy_run_events): Change prototype. Use serial_event_clear instead of serial_readchar. (gdbpy_post_event): Use serial_event_set instead of serial_write. (gdbpy_initialize_events): Use make_serial_event instead of serial_pipe.
2016-04-12Introduce interruptible_selectPedro Alves8-10/+140
We have places where we call a blocking gdb_select expecting that a Ctrl-C will unblock it. However, if the Ctrl-C is pressed just before gdb_select, the SIGINT handler runs before gdb_select, and thus gdb_select won't return. For example gdb_readline_no_editing: QUIT; /* Wait until at least one byte of data is available. Control-C can interrupt gdb_select, but not fgetc. */ FD_ZERO (&readfds); FD_SET (fd, &readfds); if (gdb_select (fd + 1, &readfds, NULL, NULL, NULL) == -1) and stdio_file_read: /* For the benefit of Windows, call gdb_select before reading from the file. Wait until at least one byte of data is available. Control-C can interrupt gdb_select, but not read. */ { fd_set readfds; FD_ZERO (&readfds); FD_SET (stdio->fd, &readfds); if (gdb_select (stdio->fd + 1, &readfds, NULL, NULL, NULL) == -1) return -1; } return read (stdio->fd, buf, length_buf); This is a race classically fixed with either the self-pipe trick, or by blocking SIGINT and then using pselect instead of select. Blocking SIGINT most of the time would mean that check_quit_flag (and thus QUIT) would need to do a syscall every time it is called, which sounds best avoided, since QUIT is called in many loops. Thus we take the self-pipe trick route (wrapped in a serial event). Instead of having all places that need this manually add an extra file descriptor to the set of gdb_select's watched file descriptors, we introduce a wrapper, interruptible_select, that does that. The Windows version of gdb_select actually does not suffer from this, because mingw-hdep.c:gdb_call_async_signal_handler sets a Windows event that gdb_select always waits on. So this patch can be seen as generalization of that technique. We can't remove that extra event from mingw-hdep.c until we get rid of immediate_quit though. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * defs.h: Extend QUIT-related comments to mention interruptible_select. (quit_serial_event_set, quit_serial_event_clear): Declare. * event-top.c: Include "ser-event.h" and "gdb_select.h". (quit_serial_event): New global. (async_init_signals): Make quit_serial_event. (quit_serial_event_set, quit_serial_event_clear) (quit_serial_event_fd, interruptible_select): New functions. * extension.c (set_quit_flag): Set the quit serial event. (check_quit_flag): Clear the quit serial event. * gdb_select.h (interruptible_select): New declaration. * guile/scm-ports.c (ioscm_input_waiting): Use interruptible_select instead of gdb_select. * top.c (gdb_readline_no_editing): Likewise. * ui-file.c (stdio_file_read): Likewise.
2016-04-12Fix signal handler/event-loop racesPedro Alves4-1/+48
GDB's core signal handling suffers from a classical signal handler / mainline code race: int gdb_do_one_event (void) { ... /* First let's see if there are any asynchronous signal handlers that are ready. These would be the result of invoking any of the signal handlers. */ if (invoke_async_signal_handlers ()) return 1; ... /* Block waiting for a new event. (...). */ if (gdb_wait_for_event (1) < 0) return -1; ... } If a signal is delivered while gdb is blocked in the poll/select inside gdb_wait_for_event, then the select/poll breaks with EINTR, we'll loop back around and call invoke_async_signal_handlers. However, if the signal handler runs between invoke_async_signal_handlers and gdb_wait_for_event, gdb_wait_for_event will block, until the next unrelated event... The fix is to a struct serial_event, and register it in the set of files that select/poll in gdb_wait_for_event waits on. The signal handlers that defer work to invoke_async_signal_handlers call mark_async_signal_handler, which is adjusted to also set the new serial event in addition to setting a flag, and is thus now is garanteed to immediately unblock the next gdb_select/poll call, up until invoke_async_signal_handlers is called and the event is cleared. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * event-loop.c: Include "ser-event.h". (async_signal_handlers_serial_event): New global. (async_signals_handler, initialize_async_signal_handlers): New functions. (mark_async_signal_handler): Set async_signal_handlers_serial_event. (invoke_async_signal_handlers): Clear async_signal_handlers_serial_event. * event-top.c (async_init_signals): Call initialize_async_signal_handlers.
2016-04-12Introduce a serial interface for select'able eventsPedro Alves6-25/+334
This patch adds a new "event" struct serial type, that is an abstraction specifically for waking up blocking waits/selects, implemented on top of a pipe on POSIX, and on top of a native Windows event (CreateEvent, etc.) on Windows. This will be used to plug signal handler / mainline code races. For example, GDB can indefinitely delay handling a quit request if the user presses Ctrl-C between the last QUIT call and the next (blocking) gdb_select call in the event loop: QUIT; <<< press ctrl-c here and end up blocked in gdb_select indefinitely. gdb_select (...); // whoops, SIGINT was already handled, no EINTR. A global alone (either the quit flag, or the "ready" flag of the async signal handlers in the event loop) is not sufficient. To plug races such as these on POSIX systems, we have to register some waitable file descriptor in the set of files gdb_select waits on, and write to it from the signal handler. This is classically a pipe, and the pattern called the self-pipe trick. On Linux, it could be a more efficient eventfd instead, but I'm sticking with a pipe for simplifity, as we need it for portability anyway. (Alternatively, we could use pselect/ppoll, and block signals until the pselect. The latter is not a design I think GDB could use, because we want the QUIT macro to be super cheap, as it is used in loops. Plus, Windows.) This is a "struct serial" because Windows's gdb_select relies on that. Windows's gdb_select, our "select" replacement, knows how to wait on all kinds of handles (regular files, pipes, sockets, console, etc.) unlike the native Windows "select" function, which can only wait on sockets. Each file descriptor for a "serial" type that is not normally waitable with WaitForMultipleObjects must have a corresponding struct serial instance. gdb_select then internally looks up the struct serial instance that wraps each file descriptor, and asks it for the corresponding Windows waitable handle. We could use serial_pipe() to create a "struct serial"-wrapped pipe that is usable everywhere, including Windows. That's what currently python/python.c uses for cross-thread posting of events. However, serial_write and serial_readchar are not designed to be async-signal-safe on POSIX hosts. It's easier to bypass those when setting/clearing the event source. And writing and a serial pipe is a bit heavy weight on Windows. gdb_select requires an extra thread to wait on the pipe and several Windows events, when a single manual-reset Windows event, with no extra thread is sufficient. The intended usage is simply: - Call make_serial_event to create a serial event object. - From the signal handler call serial_event_set to set the event. - From mainline code, have select/poll wait for serial_event_fd(), in addition to whatever other files you're about to wait for. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * Makefile.in (SFILES): Add ser-event.c. (HFILES_NO_SRCDIR): Add ser-event.h. (COMMON_OBS): Add ser-event.o. * ser-event.c, ser-event.h: New files. * serial.c (new_serial): New function, factored out from (serial_fdopen_ops): ... this. (serial_open_ops_1): New function, factored out from (serial_open): ... this. (serial_open_ops): New function. * serial.h (struct serial): Forware declare. (serial_open_ops): New declaration.
2016-04-12Remove unused struct serial::name fieldPedro Alves3-6/+6
Not used by anything. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * serial.c (serial_open, serial_fdopen_ops, do_serial_close): Remove references to name. * serial.h (struct serial) <name>: Delete.