aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2018-04-12Eliminate target_has_exitedPedro Alves3-46/+6
Nothing uses this. gdb/ChangeLog: 2018-04-12 Pedro Alves <palves@redhat.com> * target.h (target_ops::to_has_exited): Delete. (target_has_exited): Delete. * target-delegates.c: Regenerate.
2018-04-11Add test for following fork on position-independent executablesSimon Marchi3-0/+104
Commit b2e586e ("Defer breakpoint reset when cloning progspace for fork child") fixed following fork childs when the executable is position-independent. This patch adds a little test for it. gdb/testsuite/ChangeLog: * gdb.base/pie-fork.c: New file. * gdb.base/pie-fork.exp: New file.
2018-04-11Add Rust test case for ".." struct initializerTom Tromey2-0/+7
Building with --coverage pointed out that there was no Rust test for initializing a structure using the ".." initializer. This patch adds such a test. Regression tested on x86-64 Fedora 26. 2018-04-11 Tom Tromey <tom@tromey.com> * gdb.rust/simple.exp: Add test for ".." struct initializer.
2018-04-11File I/O file handles after target closesPedro Alves3-5/+40
A future patch will propose making the remote target's target_ops be heap-allocated (to make it possible to have multiple instances of remote targets, for multiple simultaneous connections), and will delete/destroy the remote target at target_close time. That change trips on a latent problem, though. File I/O handles remain open even after the target is gone, with a dangling pointer to a target that no longer exists. This results in GDB crashing when it calls the target_ops backend associated with the file handle: (gdb) Disconnect Ending remote debugging. * GDB crashes deferencing a dangling pointer Backtrace: #0 0x00007f79338570a0 in main_arena () at /lib64/libc.so.6 #1 0x0000000000858bfe in target_fileio_close(int, int*) (fd=1, target_errno=0x7ffe0499a4c8) at src/gdb/target.c:2980 #2 0x00000000007088bd in gdb_bfd_iovec_fileio_close(bfd*, void*) (abfd=0x1a631b0, stream=0x223c9d0) at src/gdb/gdb_bfd.c:353 #3 0x0000000000930906 in opncls_bclose (abfd=0x1a631b0) at src/bfd/opncls.c:528 #4 0x0000000000930cf9 in bfd_close_all_done (abfd=0x1a631b0) at src/bfd/opncls.c:768 #5 0x0000000000930cb3 in bfd_close (abfd=0x1a631b0) at src/bfd/opncls.c:735 #6 0x0000000000708dc5 in gdb_bfd_close_or_warn(bfd*) (abfd=0x1a631b0) at src/gdb/gdb_bfd.c:511 #7 0x00000000007091a2 in gdb_bfd_unref(bfd*) (abfd=0x1a631b0) at src/gdb/gdb_bfd.c:615 #8 0x000000000079ed8e in objfile::~objfile() (this=0x2154730, __in_chrg=<optimized out>) at src/gdb/objfiles.c:682 #9 0x000000000079fd1a in objfile_purge_solibs() () at src/gdb/objfiles.c:1065 #10 0x00000000008162ca in no_shared_libraries(char const*, int) (ignored=0x0, from_tty=1) at src/gdb/solib.c:1251 #11 0x000000000073b89b in disconnect_command(char const*, int) (args=0x0, from_tty=1) at src/gdb/infcmd.c:3035 This goes unnoticed in current master, because the current remote target's target_ops is never destroyed nowadays, so we end up calling: remote_hostio_close -> remote_hostio_send_command which gracefully fails with FILEIO_ENOSYS if remote_desc is NULL (because the target is closed). Fix this by invalidating a target's file I/O handles when the target is closed. With this change, remote_hostio_send_command no longer needs to handle the case of being called with a closed remote target, originally added here: <https://sourceware.org/ml/gdb-patches/2008-08/msg00359.html>. gdb/ChangeLog: 2018-04-11 Pedro Alves <palves@redhat.com> * target.c (fileio_fh_t::t): Add comment. (target_fileio_pwrite, target_fileio_pread, target_fileio_fstat) (target_fileio_close): Handle a NULL target. (invalidate_fileio_fh): New. (target_close): Call it. * remote.c (remote_hostio_send_command): No longer check whether remote_desc is open.
2018-04-11C++ify fileio_fh_t, replace VEC with std::vectorPedro Alves2-38/+56
Preparation for the next patch. - Replace VEC with std::vector. - Rewrite a couple macros as methods/functions. - While at it, rename fileio_fh_t::fd as fileio_fh_t::target_fd to avoid confusion between target and host file descriptors. gdb/ChangeLog: 2018-04-11 Pedro Alves <palves@redhat.com> * target.c (fileio_fh_t): Make it a named struct instead of a typedef. (fileio_fh_t::is_closed): New method. (DEF_VEC_O (fileio_fh_t)): Remove. (fileio_fhandles): Now a std::vector. (is_closed_fileio_fh): Delete. (acquire_fileio_fd): Adjust. Rename parameters. (release_fileio_fd): Adjust. (fileio_fd_to_fh): Reimplement as a function instead of a macro. (target_fileio_pwrite, target_fileio_pread, target_fileio_fstat) (target_fileio_close): Adjust.
2018-04-10Iterate by index in auto_load_safe_path_vec_updateSimon Marchi2-4/+8
As reported by Jan, we get this error when building with -D_GLIBCXX_DEBUG: /usr/include/c++/7/debug/safe_iterator.h:297: Error: attempt to increment a singular iterator. Objects involved in the operation: iterator "this" @ 0x0x7fffffffd140 { type = __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<char, gdb::xfree_deleter<char> >*, std::__cxx1998::vector<std::unique_ptr<char, gdb::xfree_deleter<char> >, std::allocator<std::unique_ptr<char, gdb::xfree_deleter<char> > > > >, std::__debug::vector<std::unique_ptr<char, gdb::xfree_deleter<char> >, std::allocator<std::unique_ptr<char, gdb::xfree_deleter<char> > > > > (mutable iterator); state = singular; references sequence with type 'std::__debug::vector<std::unique_ptr<char, gdb::xfree_deleter<char> >, std::allocator<std::unique_ptr<char, gdb::xfree_deleter<char> > > >' @ 0x0x265db40 } The bug was introduced by commit commit e80aaf6183c6692ecc167bf26cbdc53f8f1a55f0 Author: Simon Marchi <simon.marchi@polymtl.ca> Date: Fri Mar 2 23:22:06 2018 -0500 Make delim_string_to_char_ptr_vec return an std::vector The problem is that we iterate using a range-based for on a vector to which we push in the loop. Pushing to the vector invalidates the iterator used in the loop. Instead, change the code to iterate by index as was done in the previous code. gdb/ChangeLog: * auto-load.c (auto_load_safe_path_vec_update): Iterate by index.
2018-04-10Fix gdb.base/fork-running-state.exp racePedro Alves2-16/+10
On my multi-target branch I was occasionaly seeing a FAIL like this: (gdb) PASS: gdb.base/fork-running-state.exp: detach-on-fork=off: follow-fork=parent: non-stop: kill parent [Inferior 2 (process 32672) exited normally] kill inferior 2 warning: Inferior ID 2 is not running. (gdb) FAIL: gdb.base/fork-running-state.exp: detach-on-fork=off: follow-fork=parent: non-stop: kill child (the program exited) ... other similar fails ... Turns out to be a testcase bug/race. A tweak like this increases the changes of hitting the race substancially: --- a/gdb/testsuite/gdb.base/fork-running-state.c +++ b/gdb/testsuite/gdb.base/fork-running-state.c @@ -29,7 +29,7 @@ fork_child (void) { while (1) { - sleep (1); + usleep (100); The testcase has two processes, parent and child fork. The problem is that the child exits itself if it notices the parent is gone, but the testcase .exp does not expect that. I first wrote a patch that handled the different combinations of non-stop/detach-on-fork/follow-fork/schedule-multiple, making the .exp file know when to expect the child to exit itself vs when to kill it explicitly, but the result was that the code to kill the parent and child was getting about as large as the test code that is the actual point of the testcase, above the kills. So I scratched that approach and came up with a simpler patch -- simply make the child not exit itself when the parent exits. The .exp file is going to kill both parent and child explicitly, and, main() already calls alarm() as a safeguard. I don't think we lose anything. gdb/testsuite/ChangeLog: 2018-04-10 Pedro Alves <palves@redhat.com> * gdb.base/fork-running-state.c (fork_child): Don't exit if parent exits. Instead loop running forever. (fork_parent): Run forever too.
2018-04-10Replace finish_thread_state_cleanup with a RAII classPedro Alves5-50/+63
gdb/ChangeLog: 2018-04-10 Pedro Alves <palves@redhat.com> * gdbthread.h (finish_thread_state_cleanup): Delete declaration. (scoped_finish_thread_state): New class. * infcmd.c (run_command_1): Use it instead of finish_thread_state cleanup. * infrun.c (proceed, prepare_for_detach, wait_for_inferior) (fetch_inferior_event, normal_stop): Likewise. * thread.c (finish_thread_state_cleanup): Delete.
2018-04-09Add selftests for range_contains and insert_into_bit_range_vectorSimon Marchi3-0/+193
Add some selftests for these two functions. To to make it easier to compare sequences of ranges, add operator== and operator!= to compare two gdb::array_view, and add operator== in struct range. gdb/ChangeLog: * value.c: Include "selftest.h" and "common/array-view.h". (struct range) <operator ==>: New. (test_ranges_contain): New. (check_ranges_vector): New. (test_insert_into_bit_range_vector): New. (_initialize_values): Register selftests. * common/array-view.h (operator==, operator!=): New.
2018-04-09Use an std::vector for inline_statesSimon Marchi3-70/+79
This patch replaces VEC(inline_state) with std::vector<inline_state> and adjusts the code that uses it. gdb/ChangeLog: * common/gdb_vecs.h (unordered_remove): Add overload that takes an iterator. * inline-frame.c: Include <algorithm>. (struct inline_state): Add constructor. (inline_state_s): Remove. (DEF_VEC_O(inline_state_s)): Remove. (inline_states): Change type to std::vector. (find_inline_frame_state): Adjust to std::vector. (allocate_inline_frame_state): Remove. (clear_inline_frame_state): Adjust to std::vector. (skip_inline_frames): Adjust to std::vector.
2018-04-09Remove VEC(tsv_s), use std::vector insteadSimon Marchi10-103/+114
This patch removes VEC(tsv_s), using an std::vector instead. I C++ified trace_state_variable a bit in the process, using std::string for the name. I also thought it would be nicer to pass a const reference to target_download_trace_state_variable, since we know it will never be NULL. This highlighted that the make-target-delegates script didn't handle references well, so I adjusted this as well. It will surely be useful in the future. gdb/ChangeLog: * tracepoint.h (struct trace_state_variable): Add constructor. <name>: Change type to std::string. * tracepoint.c (tsv_s): Remove. (DEF_VEC_O(tsv_s)): Remove. (tvariables): Change to std::vector. (create_trace_state_variable): Adjust to std::vector. (find_trace_state_variable): Likewise. (find_trace_state_variable_by_number): Likewise. (delete_trace_state_variable): Likewise. (trace_variable_command): Adjust to std::string. (delete_trace_variable_command): Likewise. (tvariables_info_1): Adjust to std::vector. (save_trace_state_variables): Likewise. (start_tracing): Likewise. (merge_uploaded_trace_state_variables): Adjust to std::vector and std::string. * target.h (struct target_ops) <to_download_trace_state_variable>: Pass reference to trace_state_variable. * target-debug.h (target_debug_print_const_trace_state_variable_r): New. * target-delegates.c: Re-generate. * mi/mi-interp.c (mi_tsv_created): Adjust to std::string. (mi_tsv_deleted): Likewise. * mi/mi-main.c (mi_cmd_trace_frame_collected): Likewise. * remote.c (remote_download_trace_state_variable): Change pointer to reference and adjust. * make-target-delegates (parse_argtypes): Handle references. (write_function_header): Likewise. (munge_type): Likewise.
2018-04-09Adapt and integrate string_view testsSimon Marchi27-152/+425
The previous patch copied the string_view tests from libstdc++. This patch adjusts them in a similar way that the libstdc++ optional tests are integrated in our unit test suite. Not all tests are used, some of them require language features not present in c++11. For example, we can't use a string_view constructor where the length is not explicit in a constexpr, because std::char_traits::length is not a constexpr itself (it is in c++17 though). Nevertheless, a good number of tests are integrated, which covers pretty well the string_view features. gdb/ChangeLog: * Makefile.in (SUBDIR_UNITTESTS_SRCS): Add string_view-selftests.c. * unittests/basic_string_view/capacity/1.cc: Adapt to GDB testsuite. * unittests/basic_string_view/cons/char/1.cc: Likewise. * unittests/basic_string_view/cons/char/2.cc: Likewise. * unittests/basic_string_view/cons/char/3.cc: Likewise. * unittests/basic_string_view/element_access/char/1.cc: Likewise. * unittests/basic_string_view/element_access/char/empty.cc: Likewise. * unittests/basic_string_view/element_access/char/front_back.cc: Likewise. * unittests/basic_string_view/inserters/char/2.cc: Likewise. * unittests/basic_string_view/modifiers/remove_prefix/char/1.cc: Likewise. * unittests/basic_string_view/modifiers/remove_suffix/char/1.cc: Likewise. * unittests/basic_string_view/modifiers/swap/char/1.cc: Likewise. * unittests/basic_string_view/operations/compare/char/1.cc: Likewise. * unittests/basic_string_view/operations/compare/char/13650.cc: Likewise. * unittests/basic_string_view/operations/copy/char/1.cc: Likewise. * unittests/basic_string_view/operations/data/char/1.cc: Likewise. * unittests/basic_string_view/operations/find/char/1.cc: Likewise. * unittests/basic_string_view/operations/find/char/2.cc: Likewise. * unittests/basic_string_view/operations/find/char/3.cc: Likewise. * unittests/basic_string_view/operations/find/char/4.cc: Likewise. * unittests/basic_string_view/operations/rfind/char/1.cc: Likewise. * unittests/basic_string_view/operations/rfind/char/2.cc: Likewise. * unittests/basic_string_view/operations/rfind/char/3.cc: Likewise. * unittests/basic_string_view/operations/substr/char/1.cc: Likewise. * unittests/basic_string_view/operators/char/2.cc: Likewise. * unittests/string_view-selftests.c: New file.
2018-04-09Copy string_view tests from libstdc++Simon Marchi73-0/+5345
This patch copies the string_view tests from the gcc repository (commit 02a4441f002c). ${gcc}/libstdc++-v3/testsuite/21_strings/basic_string_view -> ${binutils-gdb}/gdb/unittests/basic_string_view The local modifications are done in the following patch, so that it's easier to review them. gdb/ChangeLog: * unittests/basic_string_view/capacity/1.cc: New file. * unittests/basic_string_view/capacity/empty_neg.cc: New file. * unittests/basic_string_view/cons/char/1.cc: New file. * unittests/basic_string_view/cons/char/2.cc: New file. * unittests/basic_string_view/cons/char/3.cc: New file. * unittests/basic_string_view/cons/wchar_t/1.cc: New file. * unittests/basic_string_view/cons/wchar_t/2.cc: New file. * unittests/basic_string_view/cons/wchar_t/3.cc: New file. * unittests/basic_string_view/element_access/char/1.cc: New file. * unittests/basic_string_view/element_access/char/2.cc: New file. * unittests/basic_string_view/element_access/char/empty.cc: New file. * unittests/basic_string_view/element_access/char/front_back.cc: New file. * unittests/basic_string_view/element_access/wchar_t/1.cc: New file. * unittests/basic_string_view/element_access/wchar_t/2.cc: New file. * unittests/basic_string_view/element_access/wchar_t/empty.cc: New file. * unittests/basic_string_view/element_access/wchar_t/front_back.cc: New file. * unittests/basic_string_view/include.cc: New file. * unittests/basic_string_view/inserters/char/1.cc: New file. * unittests/basic_string_view/inserters/char/2.cc: New file. * unittests/basic_string_view/inserters/char/3.cc: New file. * unittests/basic_string_view/inserters/pod/10081-out.cc: New file. * unittests/basic_string_view/inserters/wchar_t/1.cc: New file. * unittests/basic_string_view/inserters/wchar_t/2.cc: New file. * unittests/basic_string_view/inserters/wchar_t/3.cc: New file. * unittests/basic_string_view/literals/types.cc: New file. * unittests/basic_string_view/literals/values.cc: New file. * unittests/basic_string_view/modifiers/remove_prefix/char/1.cc: New file. * unittests/basic_string_view/modifiers/remove_prefix/wchar_t/1.cc: New file. * unittests/basic_string_view/modifiers/remove_suffix/char/1.cc: New file. * unittests/basic_string_view/modifiers/remove_suffix/wchar_t/1.cc: New file. * unittests/basic_string_view/modifiers/swap/char/1.cc: New file. * unittests/basic_string_view/modifiers/swap/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/compare/char/1.cc: New file. * unittests/basic_string_view/operations/compare/char/13650.cc: New file. * unittests/basic_string_view/operations/compare/char/2.cc: New file. * unittests/basic_string_view/operations/compare/char/70483.cc: New file. * unittests/basic_string_view/operations/compare/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/compare/wchar_t/13650.cc: New file. * unittests/basic_string_view/operations/compare/wchar_t/2.cc: New file. * unittests/basic_string_view/operations/copy/char/1.cc: New file. * unittests/basic_string_view/operations/copy/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/data/char/1.cc: New file. * unittests/basic_string_view/operations/data/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/find/char/1.cc: New file. * unittests/basic_string_view/operations/find/char/2.cc: New file. * unittests/basic_string_view/operations/find/char/3.cc: New file. * unittests/basic_string_view/operations/find/char/4.cc: New file. * unittests/basic_string_view/operations/find/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/find/wchar_t/2.cc: New file. * unittests/basic_string_view/operations/find/wchar_t/3.cc: New file. * unittests/basic_string_view/operations/find/wchar_t/4.cc: New file. * unittests/basic_string_view/operations/rfind/char/1.cc: New file. * unittests/basic_string_view/operations/rfind/char/2.cc: New file. * unittests/basic_string_view/operations/rfind/char/3.cc: New file. * unittests/basic_string_view/operations/rfind/wchar_t/1.cc: New file. * unittests/basic_string_view/operations/rfind/wchar_t/2.cc: New file. * unittests/basic_string_view/operations/rfind/wchar_t/3.cc: New file. * unittests/basic_string_view/operations/string_conversion/1.cc: New file. * unittests/basic_string_view/operations/substr/char/1.cc: New file. * unittests/basic_string_view/operations/substr/wchar_t/1.cc: New file. * unittests/basic_string_view/operators/char/2.cc: New file. * unittests/basic_string_view/operators/wchar_t/2.cc: New file. * unittests/basic_string_view/range_access/char/1.cc: New file. * unittests/basic_string_view/range_access/wchar_t/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/char/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/char16_t/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/char32_t/1.cc: New file. * unittests/basic_string_view/requirements/explicit_instantiation/wchar_t/1.cc: New file. * unittests/basic_string_view/requirements/typedefs.cc: New file. * unittests/basic_string_view/typedefs.cc: New file. * unittests/basic_string_view/types/1.cc: New file.
2018-04-09Add gdb::string_viewSimon Marchi4-260/+126
We had a few times the need for a data structure that does essentially what C++17's std::string_view does, which is to give an std::string-like interface (only the read-only operations) to an arbitrary character buffer. This patch adapts the files copied from libstdc++ by the previous patch to integrate them with GDB. Here's a summary of the changes: * Remove things related to wstring_view, u16string_view and u32string_view (I don't think we need them, but we can always add them later). * Remove usages of _GLIBCXX_BEGIN_NAMESPACE_VERSION and _GLIBCXX_END_NAMESPACE_VERSION. * Put the code in the gdb namespace. I had to add a few "std::" in front of std type usages. * Change __throw_out_of_range_fmt() for error(). * Make gdb::string_view an alias of std::string_view when building with >= c++17. * Remove a bunch of constexpr, because they are not valid in c++11 (e.g. they are not a single return line). * Use std::common_type<_Tp>::type instead of std::common_type_t<_Tp>, because c++11 doesn't have the later. * Remove the #pragma GCC system_header, since that silences some warnings that we might want to have if we're doing something not correctly. * Remove operator ""sv. It would need a lot of work to make all supported compilers happy, and we can easily live without it. * Remove operator<<. It is implemented using __ostream_insert (a libstdc++ internal). Bringing it in might be possible, but I don't think that would be worth the effort, since we don't really use streams at the moment. * Replace internal libstdc++ asserts ( __glibcxx_assert and __glibcxx_requires_string_len) with gdb_assert. * Remove hash helpers, because they use libstdc++ internal functions. If we need them we always import them later. The string_view class in cli/cli-script.c is removed and its usage replaced with the new gdb::string_view. gdb/ChangeLog: * common/gdb_string_view.h: Remove libstdc++ implementation details, adjust to gdb reality. * common/gdb_string_view.tcc: Likewise. * cli/cli-script.c (struct string_view): Remove. (user_args) <m_args>: Change element type to gdb::string_view. (user_args::insert_args): Adjust.
2018-04-09Copy string_view files from libstdc++Simon Marchi3-0/+916
This patch copies the following files from libstdc++ (commit 02a4441f002c): ${gcc}/libstdc++-v3/include/experimental/string_view -> ${binutils-gdb}/gdb/common/gdb_string_view.h ${gcc}/libstdc++-v3/include/experimental/bits/string_view.tcc -> ${binutils-gdb}/gdb/common/gdb_string_view.tcc The local modifications are done in the following patch in order to make it easier to review them. gdb/ChangeLog: * common/gdb_string_view.h: New file. * common/gdb_string_view.tcc: New file.
2018-04-09Update ax_cv_cxx_compile_cxx.m4Simon Marchi3-31/+460
This file provides the AX_CXX_COMPILE_STDCXX macro. In the context of the following patch, I wanted to build and test GDB in c++17 mode. The version of the macro we have in the repo does not support detecting c++17 compilers, but the upstream version has been updated to do so. Since we have local modifications to the file, I had to reconcile our modifications and the updated upstream version (which was relatively straightforward). gdb/ChangeLog: * ax_cxx_compile_stdcxx.m4: Sync with upstream. * configure: Re-generate.
2018-04-09Apply "Convert observers to C++" edit to gdbarch.shPedro Alves2-2/+9
Regenerating gdbarch.c results in: --- gdbarch.c 2018-03-26 23:18:52.905548891 +0100 +++ new-gdbarch.c 2018-04-09 15:32:30.006712207 +0100 @@ -44,7 +44,7 @@ #include "reggroups.h" #include "osabi.h" #include "gdb_obstack.h" -#include "observable.h" +#include "observer.h" #include "regcache.h" #include "objfiles.h" #include "auxv.h" @@ -5457,7 +5457,7 @@ gdb_assert (new_gdbarch != NULL); gdb_assert (new_gdbarch->initialized_p); current_inferior ()->gdbarch = new_gdbarch; - gdb::observers::architecture_changed.notify (new_gdbarch); + observer_notify_architecture_changed (new_gdbarch); registers_changed (); } Clearly commit 76727919ceb5 ("Convert observers to C++") edited gdbarch.c directly instead of gdbarch.sh. This fixes it. gdb/ChangeLog: 2018-04-09 Pedro Alves <palves@redhat.com> * gdbarch.sh: Include "observable.h" instead of "observer.h". (set_target_gdbarch): Call gdb::observers::architecture_changed.notify instead of observer_notify_architecture_changed.
2018-04-07Fix gdb.mi/mi-stack.exp when gcc generates a stack protectorSimon Marchi3-5/+11
I see some failures in the gdb.mi/mi-stack.exp test. The test runs to the callee4 function: int callee4 (void) { int A=1; int B=2; int C; int D[3] = {0, 1, 2}; C = A + B; return 0; } and expects to be stopped at the A=1 line. However, when gcc generates some stack protection code, it will stop at the { instead, as shown by this disassembly (after I did "break callee4" and "run"): (gdb) disassemble /s Dump of assembler code for function callee4: /home/simark/src/binutils-gdb/gdb/testsuite/gdb.mi/mi-stack.c: 26 { 0x00005555555546ca <+0>: push %rbp 0x00005555555546cb <+1>: mov %rsp,%rbp 0x00005555555546ce <+4>: sub $0x20,%rsp => 0x00005555555546d2 <+8>: mov %fs:0x28,%rax 0x00005555555546db <+17>: mov %rax,-0x8(%rbp) 0x00005555555546df <+21>: xor %eax,%eax 27 int A=1; /* callee4 begin */ 0x00005555555546e1 <+23>: movl $0x1,-0x20(%rbp) 28 int B=2; 0x00005555555546e8 <+30>: movl $0x2,-0x1c(%rbp) The rest of the test relies on execution stopping on the A=1, so many things fail after that. This patch uses mi_continue_to_line instead, to stop at the A=1 line precisely. gdb/testsuite/ChangeLog: * gdb.mi/mi-stack.exp (test_stack_frame_listing): Use mi_continue_to_line. * gdb.mi/mi-stack.c (callee4): Add comment.
2018-04-07Fix indentation in gdb.mi/mi-stack.expSimon Marchi2-55/+58
This patch fixes the indentation in gdb.mi/mi-stack.exp, which is a bit inconsistent. gdb/testsuite/ChangeLog: * gdb.mi/mi-stack.exp: Fix indentation.
2018-04-07Replace make_cleanup_restore_current_traceframe with RAII classSimon Marchi4-39/+33
I put the constructor in tracepoint.c because it needs to read traceframe_number, and I prefer to do that than to expose traceframe_number. gdb/ChangeLog: * tracepoint.c (struct current_traceframe_cleanup): Remove. (do_restore_current_traceframe_cleanup): Remove. (restore_current_traceframe_cleanup_dtor): Remove. (make_cleanup_restore_current_traceframe): Remove. (scoped_restore_current_traceframe::scoped_restore_current_traceframe): New. * tracepoint.h (struct scoped_restore_current_traceframe): New. * infrun.c (fetch_inferior_event): Use scoped_restore_current_traceframe.
2018-04-07Make dwarf2_per_objfile::all_type_units an std::vectorSimon Marchi4-92/+84
Make all_type_units an std::vector, remove n_type_units/n_allocated_type_units and some manual memory management. gdb/ChangeLog: * dwarf2read.h (struct dwarf2_per_objfile) <n_type_units>: Remove. <n_allocated_type_units>: Remove. <all_type_units>: Change to std::vector. * dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile): Adjust to std::vector change. (dwarf2_per_objfile::get_cutu): Likewise. (dwarf2_per_objfile::get_tu): Likewise. (create_signatured_type_table_from_index): Likewise. (create_signatured_type_table_from_debug_names): Likewise. (dw2_symtab_iter_next): Likewise. (dw2_print_stats): Likewise. (dw2_expand_all_symtabs): Likewise. (dw2_expand_marked_cus): Likewise. (dw2_debug_names_iterator::next): Likewise. (dwarf2_initialize_objfile): Likewise. (add_signatured_type_cu_to_table): Likewise. (create_all_type_units): Likewise. (add_type_unit): Likewise. (struct tu_abbrev_offset): Add constructor. (build_type_psymtabs_1): Adjust to std::vector change. (print_tu_stats): Likewise. * dwarf-index-write.c (check_dwarf64_offsets): Likewise. (write_debug_names): Likewise.
2018-04-07Make dwarf2_per_objfile::all_comp_units an std::vectorSimon Marchi4-148/+113
Make all_comp_units an std::vector, remove n_comp_units and some manual memory management. gdb/ChangeLog: * dwarf2read.h (struct dwarf2_per_objfile) <all_comp_units>: Likewise. Make an std::vector. <n_comp_units>: Remove. * dwarf2read.c (dwarf2_per_objfile::~dwarf2_per_objfile): Adjust to std::vector change. (dwarf2_per_objfile::get_cutu): Likewise. (dwarf2_per_objfile::get_cu): Likewise. (create_cus_from_index): Likewise. (create_addrmap_from_index): Likewise. (create_addrmap_from_aranges): Likewise. (dwarf2_read_index): Likewise. (dw2_find_last_source_symtab): Likewise. (dw2_map_symtabs_matching_filename): Likewise. (dw2_symtab_iter_next): Likewise. (dw2_print_stats): Likewise. (dw2_expand_all_symtabs): Likewise. (dw2_expand_symtabs_with_fullname): Likewise. (dw2_expand_marked_cus): Likewise. (dw2_map_symbol_filenames): Likewise. (create_cus_from_debug_names): Likewise. (dwarf2_read_debug_names): Likewise. (dw2_debug_names_iterator::next): Likewise. (dwarf2_initialize_objfile): Likewise. (set_partial_user): Likewise. (dwarf2_build_psymtabs_hard): Likewise. (read_comp_units_from_section): Remove arguments, adjust to std::vector change. (create_all_comp_units): Adjust to std::vector and read_comp_units_from_section changes. (dwarf2_find_containing_comp_unit): Adjust to std::vector change. * dwarf-index-write.c (check_dwarf64_offsets): Likewise. (psyms_seen_size): Likewise. (write_gdbindex): Likewise. (write_debug_names): Likewise.
2018-04-07Remove some usages of get_dwarf2_per_objfileSimon Marchi2-35/+36
This patch removes some usages of get_dwarf2_per_objfile, where we can get hold of the dwarf2_per_objfile object in a simpler way. For example, it's simpler (and slightly less work) to pass dwarf2_per_objfile and get the objfile from it than to pass the objfile and call get_dwarf2_per_objfile. Ideally, get_dwarf2_per_objfile should only be used in the entry points of the dwarf2 code, where we receive an objfile. gdb/ChangeLog: * dwarf2read.c (create_cus_from_index_list): Replace objfile arg with dwarf2_per_objfile. (create_cus_from_index): Likewise. (create_signatured_type_table_from_index): Likewise. (dwarf2_read_index): Likewise. (dwarf2_initialize_objfile): Likewise. (dwarf2_fetch_die_loc_sect_off): Get dwarf2_per_objfile from per_cu rather than get_dwarf2_per_objfile.
2018-04-07Replace dw2_get_cu/dw2_get_cutu with methods of dwarf2_per_objfileSimon Marchi3-47/+90
Those two functions look like good candidates to become methods of dwarf2_per_objfile. I did that, and added get_tu as well. When replacing usages of dw2_get_cutu, I changed some instances to get_cutu and others to get_cu, when appropriate (when we know we want a CU and not a TU). gdb/ChangeLog: * dwarf2read.h (struct signatured_type): Forward declare. (struct dwarf2_per_objfile) <get_cutu, get_cu, get_tu>: New methods. * dwarf2read.c (dwarf2_per_objfile::get_cutu): Rename from... (dw2_get_cutu): ...this. (dwarf2_per_objfile::get_cu): Rename from... (dw2_get_cu): ...this. (dwarf2_per_objfile::get_tu): New. (create_addrmap_from_index): Adjust. (create_addrmap_from_aranges): Adjust. (dw2_find_last_source_symtab): Adjust. (dw2_map_symtabs_matching_filename): Adjust. (dw2_symtab_iter_next): Adjust. (dw2_print_stats): Adjust. (dw2_expand_all_symtabs): Adjust. (dw2_expand_symtabs_with_fullname): Adjust. (dw2_expand_marked_cus): Adjust. (dw_expand_symtabs_matching_file_matcher): Adjust. (dw2_map_symbol_filenames): Adjust. (dw2_debug_names_iterator::next): Adjust. (dwarf2_initialize_objfile): Adjust. (set_partial_user): Adjust. (dwarf2_build_psymtabs_hard): Adjust.
2018-04-07Remove some unused variables in dwarf2read.cSimon Marchi2-23/+9
Most of them are obvious. The ones in dwarf2_record_block_ranges are less obvious, because it is a bit suspicious to have that many variables unused. But after inspection, it seems like it dates from commit 5f46c5a54825 ("Code cleanup: Split dwarf2_ranges_read to a callback"), where dwarf2_record_block_ranges was made to use dwarf2_ranges_process, which contains the same functionality. gdb/ChangeLog: * dwarf2read.c (create_signatured_type_table_from_debug_names): Remove unused variables. (dw2_map_symtabs_matching_filename): Likewise. (dwarf2_record_block_ranges): Likewise. (dwarf2_read_addr_index): Likewise. (follow_die_offset): Likewise.
2018-04-07Defer breakpoint reset when cloning progspace for fork childSimon Marchi2-1/+7
Using this simple test: static void break_here () { } int main (int argc, char *argv[]) { fork (); break_here(); return 0; } compiled as a PIE: $ gcc test.c -g3 -O0 -o test -pie and running this: $ ./gdb -nx -q --data-directory=data-directory ./test -ex "b break_here" -ex "set detach-on-fork off" -ex r gives: Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x64a Note that GDB might get stopped by SIGTTOU because of this issue: https://sourceware.org/bugzilla/show_bug.cgi?id=23020 In that case, just use "fg" to continue. This issue happens only with position-independent executables. Adding the main objfile for the new inferior (the fork child) causes GDB to try to reset the breakpoints. However, that new objfile has not been relocated yet. So the breakpoint on "break_here" resolves to an unrelocated address, from which we are trying to read/write to set a breakpoint. Passing SYMFILE_DEFER_BP_RESET avoids that problem. The executable is relocated just after, in the follow_fork_inferior function. The buildbot seems happy with this patch. I don't think it's necessary to add a new test. Just changing this made many tests go from FAIL to PASS on my machine, where gcc produces PIE executables by default. If anything, I think we would need to add a board file that produces position-independent executables, so that we can run all the tests with PIE, even on machines where that is not the default. gdb/ChangeLog: * progspace.c (clone_program_space): Pass SYMFILE_DEFER_BP_RESET to symbol_file_add_main.
2018-04-07Implement write_async_safe for mi_console_file (PR 22299)Simon Marchi6-28/+82
Enabling "set debug lin-lwp 1" with the MI interpreter doesn't work. When the sigchld_handler function wants to print a debug output ("sigchld\n"), it uses ui_file_write_async_safe. This ends up in the default implementation of ui_file::write_async_safe, which aborts GDB. This patch implements the write_async_safe method for mi_console_file. The "normal" MI output is line buffered, which means the output accumulates in m_buffer until a \n is written, at which point it's flushed in m_raw. The implementation of write_async_safe provided by this patch bypasses this buffer and writes directly to m_raw. There are two reasons for this: (1) Appending to m_buffer (therefore to an std::string) is probably not async-safe, as it may allocate memory. (2) We may have a partial output already in m_buffer, so that would lead to some nested MI output, not so great. There is probably still a chance to have bad MI output, if sigchld_handler is invoked in the middle of mi_console_file's flush, and the line being flushed is only partially sent to m_raw. The solution would probably be to block signals during flushing. Since this is only used for debug output, I don't know if it's worth the effort to do that. To implement write_async_safe, I needed to use the fputstrn_unfiltered, which does the necessary escaping (e.g. replace \n with \\n). I started by adding printchar's callback parameters to fputstrn_unfiltered, to be able to pass async-safe versions of them. It's not easy to provide an async-safe version of do_fprintf, but it turns out that we can easily replace printchar's callbacks with a single do_fputc quite easily. The async-safe version of do_fputc simply calls the underlying ui_file's write_async_safe method. gdb/ChangeLog: PR mi/22299 * mi/mi-console.c (do_fputc_async_safe): New. (mi_console_file::write_async_safe): New. (mi_console_file::flush): Adjust calls to fputstrn_unfiltered. * mi/mi-console.h (class mi_console_file) <write_async_safe>: New. * ui-file.c (ui_file::putstrn): Adjust call to fputstrn_unfiltered. * utils.c (printchar): Replace do_fputs and do_fprintf parameters by do_fputc. (fputstr_filtered): Adjust call to printchar. (fputstr_unfiltered): Likewise. (fputstrn_filtered): Likewise. (fputstrn_unfiltered): Add do_fputc parameter, pass to printchar. * utils.h (do_fputc_ftype): New typedef. (fputstrn_unfiltered): Add do_fputc parameter.
2018-04-07Remove stale file i386-avx.datSimon Marchi2-54/+4
I noticed that regformats/i386/i386-avx.dat did not get re-generated when doing "make" in the features directory. I think it's a leftover from commit f5a29eb0a663 ("Clean up x86 non-linux GDBserver target descriptions") I build-tested gdbserver with amd64 and i386. gdb/ChangeLog: * regformats/i386/i386-avx.dat: Remove.
2018-04-07Fix generation of x86-64 gdbarch with osabi none (PR 22979)Simon Marchi5-8/+88
When a 64-bits (x86-64) gdbarch is created, it is first born as a 32-bits gdbarch in i386_gdbarch_init. The call gdbarch_init_osabi will call the handler register for the selected (arch, osabi) pair, such as amd64_linux_init_abi. The various amd64 handlers call amd64_init_abi, which turns the gdbarch into a 64-bits one. When selecting the i386:x86-64 architecture with no osabi, no such handler is ever called, so the gdbarch stays (wrongfully) a 32-bits one. My first idea was to manually call amd64_init_abi & al in i386_gdbarch_init when the osabi is GDB_OSABI_NONE. However, this doesn't work in a build of GDB where i386 is included as a target but not amd64. My next option (implemented in this patch), is to allow registering handlers for GDB_OSABI_NONE. I added two such handlers in amd64-tdep.c, so now it works the same as for the "normal" osabis. It required re-ordering things in gdbarch_init_osabi to allow running handlers for GDB_OSABI_NONE. Without this patch applied (but with the previous one*) : (gdb) set osabi none (gdb) set architecture i386:x86-64 The target architecture is assumed to be i386:x86-64 (gdb) p sizeof(void*) $1 = 4 and now: (gdb) set osabi none (gdb) set architecture i386:x86-64 The target architecture is assumed to be i386:x86-64 (gdb) p sizeof(void*) $1 = 8 * Before the previous patch, which fixed "set osabi none", this bug was hidden because we didn't actually try to generate a gdbarch for no osabi, it would always fall back on Linux. Generating the gdbarch for amd64/linux did work. gdb/ChangeLog: PR gdb/22979 * amd64-tdep.c (amd64_none_init_abi): New function. (amd64_x32_none_init_abi): New function. (_initialize_amd64_tdep): Register handlers for x86-64 and x64_32 with GDB_OSABI_NONE. * osabi.c (gdbarch_init_osabi): Allow running handlers for the GDB_OSABI_NONE osabi. gdb/testsuite/ChangeLog: PR gdb/22979 * gdb.arch/amd64-osabi.exp: New file.
2018-04-07Make "set osabi none" really work (PR 22980)Simon Marchi6-11/+50
I was looking for a way to reproduce easily PR 22979 by doing this: (gdb) set architecture i386:x86-64 (gdb) set osabi none However, I noticed that even though I did "set osabi none", the gdbarch gdb created was for Linux: (gdb) set debug arch 1 (gdb) set architecture i386:x86-64 ... (gdb) set osabi none gdbarch_find_by_info: info.bfd_arch_info i386:x86-64 gdbarch_find_by_info: info.byte_order 1 (little) gdbarch_find_by_info: info.osabi 4 (GNU/Linux) <--- Wrong? gdbarch_find_by_info: info.abfd 0x0 gdbarch_find_by_info: info.tdep_info 0x0 gdbarch_find_by_info: Previous architecture 0x1e6fd30 (i386:x86-64) selected gdbarch_update_p: Architecture 0x1e6fd30 (i386:x86-64) unchanged This is because the value GDB_OSABI_UNKNOWN has an unclear role, sometimes meaning "no osabi" and sometimes "please selected automatically". Doing "set osabi none" sets the requested osabi to GDB_OSABI_UNKNOWN, in which case gdbarch_info_fill overrides it with a value from the target description, or the built-in default osabi. This means that it's impossible to force GDB not to use an osabi with "set osabi". Since my GDB's built-in default osabi is Linux, it always falls back to GDB_OSABI_LINUX. To fix it, I introduced GDB_OSABI_NONE, which really means "I don't want any osabi". GDB_OSABI_UNKNOWN can then be used only for "not set yet, please auto-detect". GDB_OSABI_UNINITIALIZED now seems unnecessary since it overlaps with GDB_OSABI_UNKNOWN, so I think it can be removed and gdbarch_info::osabi can be initialized to GDB_OSABI_UNKNOWN. gdb/ChangeLog: PR gdb/22980 * defs.h (enum gdb_osabi): Remove GDB_OSABI_UNINITIALIZED, add GDB_OSABI_NONE. * arch-utils.c (gdbarch_info_init): Don't set info->osabi. * osabi.c (gdb_osabi_names): Add "unknown" entry. gdb/testsuite/ChangeLog: PR gdb/22980 * gdb.base/osabi.exp: New file.
2018-04-07Make target_read_alloc & al return vectorsSimon Marchi18-225/+224
This patch started by changing target_read_alloc_1 to return a byte_vector, to avoid manual memory management (in target_read_alloc_1 and in the callers). To communicate failures to the callers, it actually returns a gdb::optional<gdb::byte_vector>. Adjusting target_read_stralloc was a bit more tricky, since it wants to return a buffer of char, and not gdb_byte. Since you can't just cast a gdb::byte_vector into a gdb::def_vector<char>, I made target_read_alloc_1 templated, so both versions (that return vectors of gdb_byte and char) are generated. Since target_read_stralloc now returns a gdb::char_vector instead of a gdb::unique_xmalloc_ptr<char>, a few callers need to be adjusted. gdb/ChangeLog: * common/byte-vector.h (char_vector): New type. * target.h (target_read_alloc): Return gdb::optional<byte_vector>. (target_read_stralloc): Return gdb::optional<char_vector>. (target_get_osdata): Return gdb::optional<char_vector>. * target.c (target_read_alloc_1): Templatize. Replacement manual memory management with vector. (target_read_alloc): Change return type, adjust. (target_read_stralloc): Change return type, adjust. (target_get_osdata): Change return type, adjust. * auxv.c (struct auxv_info) <length>: Remove. <data>: Change type to gdb::optional<byte_vector>. (auxv_inferior_data_cleanup): Free auxv_info with delete. (get_auxv_inferior_data): Allocate auxv_info with new, adjust. (target_auxv_search): Adjust. (fprint_target_auxv): Adjust. * avr-tdep.c (avr_io_reg_read_command): Adjust. * linux-tdep.c (linux_spu_make_corefile_notes): Adjust. (linux_make_corefile_notes): Adjust. * osdata.c (get_osdata): Adjust. * remote.c (remote_get_threads_with_qxfer): Adjust. (remote_memory_map): Adjust. (remote_traceframe_info): Adjust. (btrace_read_config): Adjust. (remote_read_btrace): Adjust. (remote_pid_to_exec_file): Adjust. * solib-aix.c (solib_aix_get_library_list): Adjust. * solib-dsbt.c (decode_loadmap): Don't free buf. (dsbt_get_initial_loadmaps): Adjust. * solib-svr4.c (svr4_current_sos_via_xfer_libraries): Adjust. * solib-target.c (solib_target_current_sos): Adjust. * tracepoint.c (sdata_make_value): Adjust. * xml-support.c (xinclude_start_include): Adjust. (xml_fetch_content_from_file): Adjust. * xml-support.h (xml_fetch_another): Change return type. (xml_fetch_content_from_file): Change return type. * xml-syscall.c (xml_init_syscalls_info): Adjust. * xml-tdesc.c (file_read_description_xml): Adjust. (fetch_available_features_from_target): Change return type. (target_fetch_description_xml): Adjust. (target_read_description_xml): Adjust.
2018-04-06Change value::contents to be a unique_xmalloc_ptrTom Tromey2-12/+20
This changes value::contents to be a unique_xmalloc_ptr, removing a small bit of manual memory management. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (~value): Update. (struct value) <contents>: Now unique_xmalloc_ptr. (value_contents_bits_eq, allocate_value_contents) (value_contents_raw, value_contents_all_raw) (value_contents_for_printing, value_contents_for_printing_const) (set_value_enclosing_type): Update.
2018-04-06Remove range_s VECTom Tromey2-107/+119
This changes the "optimized_out" and "unavailable" VECs in struct value to be std::vectors, and then fixes up all the uses. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (range_s): Remove typedef, VEC. (struct range): Add operator<. (range_lessthan): Remove. (ranges_contain): Change type. (~value): Update. (struct value) <unavailable, optimized_out>: Now std::vector. (value_entirely_available) (value_entirely_covered_by_range_vector) (value_entirely_unavailable, value_entirely_optimized_out): Update. (insert_into_bit_range_vector): Change argument type. (find_first_range_overlap): Likewise. (struct ranges_and_idx, value_contents_bits_eq) (require_not_optimized_out, require_available): Update. (ranges_copy_adjusted): Change argument types. (value_optimized_out, value_copy, value_fetch_lazy): Update.
2018-04-06Change value::parent to a value_ref_ptrTom Tromey2-15/+12
This changes value::parent to a value_ref_ptr. This removes a bit of manual reference count management. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (~value): Update. (struct value) <parent>: Now a value_ref_ptr. (value_parent, set_value_parent, value_address, value_copy): Update.
2018-04-06Use new and delete for valuesTom Tromey2-48/+56
This adds a constructor and destructor to struct value, and then changes value.c to use "new" and "delete". While doing this I noticed a memory leak -- value_decref was not freeing value::optimized_out. This patch fixes this leak. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (struct value): Add constructor, destructor, and member initializers. (allocate_value_lazy, value_decref): Update.
2018-04-06Remove value::next and value::releasedTom Tromey2-68/+36
This patch converts all_values to simply hold a list of references to values. Now, there's no need to have a value record whether or not it is released -- there is only a single reference-counting mechanism for values. So, this also removes value::next, value::released, and value_next. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (struct value) <released, next>: Remove. (all_values): Now a std::vector. (allocate_value_lazy): Update. (value_next): Remove. (value_mark, value_free_to_mark, release_value) (value_release_to_mark): Update.
2018-04-06Remove free_value_chainTom Tromey6-73/+69
This patch changes value_release_to_mark and fetch_subexp_value to return a std::vector of value references, rather than relying on the "next" field that is contained in a struct value. This makes it simpler to reason about the returned values, and also allows for the removal of free_value_chain. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.h (fetch_subexp_value, value_release_to_mark): Update. (free_value_chain): Remove. * value.c (free_value_chain): Remove. (value_release_to_mark): Return a std::vector. * ppc-linux-nat.c (num_memory_accesses): Change "chain" to a std::vector. (check_condition): Update. * eval.c (fetch_subexp_value): Change "val_chain" to a std::vector. * breakpoint.c (update_watchpoint): Update. (can_use_hardware_watchpoint): Change "vals" to a std::vector.
2018-04-06Remove free_all_valuesTom Tromey3-22/+5
free_all_values is unused, so this removes it. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.h (free_all_values): Remove. * value.c (free_all_values): Remove.
2018-04-06Change value history to use value_ref_ptrTom Tromey2-54/+20
This simplifies the value history implementation by replacing the current data structure with a std::vector, and by making the value history simply hold a reference to each value. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (VALUE_HISTORY_CHUNK, struct value_history_chunk) (value_history_chain, value_history_count): Remove. (value_history): New global. (record_latest_value, access_value_history, show_values) (preserve_values): Update.
2018-04-06Change varobj to use value_ref_ptrTom Tromey5-36/+54
This changes varobj to use value_ref_ptr, allowing the removal of some manual reference count management. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * varobj.h (struct varobj) <value>: Now a value_ref_ptr. * varobj.c (varobj_set_display_format, varobj_set_value) (install_default_visualizer, construct_visualizer) (install_new_value, ~varobj, varobj_get_value_type) (my_value_of_variable, varobj_editable_p): Update. * c-varobj.c (c_describe_child, c_value_of_variable) (cplus_number_of_children, cplus_describe_child): Update. * ada-varobj.c (ada_number_of_children, ada_name_of_child) (ada_path_expr_of_child, ada_value_of_child, ada_type_of_child) (ada_value_of_variable, ada_value_is_changeable_p): Update.
2018-04-06Change last_examine_value to value_ref_ptrTom Tromey2-13/+14
This patch removes some manual reference count manipulation by changing last_examine_value to be a value_ref_ptr and then updating the users. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * printcmd.c (last_examine_address): Change type to value_ref_ptr. (do_examine, x_command): Update.
2018-04-06Change breakpoints to use value_ref_ptrTom Tromey4-52/+46
Now that value_ref_ptr exists, it is possible to simplify breakpoint and bpstat memory management by using a value_ref_ptr rather than manually handling the reference counts. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (release_value): Update. * breakpoint.h (struct watchpoint) <val>: Now a value_ref_ptr. (struct bpstats) <val>: Now a value_ref_ptr. * breakpoint.c (update_watchpoint, breakpoint_init_inferior) (~bpstats, bpstats, bpstat_clear_actions, watchpoint_check) (~watchpoint, print_it_watchpoint, watch_command_1) (invalidate_bp_value_on_memory_change): Update.
2018-04-06Introduce a gdb_ref_ptr specialization for struct valueTom Tromey19-114/+136
struct value is internally reference counted and so, while it also has some ownership rules unique to it, it makes sense to use a gdb_ref_ptr when managing it automatically. This patch removes the existing unique_ptr specialization in favor of a reference-counted pointer. It also introduces two other clarifications: 1. Rename value_free to value_decref, which I think is more in line with what the function actually does; and 2. Change release_value to return a gdb_ref_ptr. This change allows us to remove the confusing release_value_or_incref function, primarily by making it much simpler to reason about the result of release_value. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * varobj.c (varobj_clear_saved_item) (update_dynamic_varobj_children, install_new_value, ~varobj): Update. * value.h (value_incref): Move declaration earlier. (value_decref): Rename from value_free. (struct value_ref_policy): New. (value_ref_ptr): New typedef. (struct value_deleter): Remove. (gdb_value_up): Remove typedef. (release_value): Change return type. (release_value_or_incref): Remove. * value.c (set_value_parent): Update. (value_incref): Change return type. (value_decref): Rename from value_free. (value_free_to_mark, free_all_values, free_value_chain): Update. (release_value): Return value_ref_ptr. (release_value_or_incref): Remove. (record_latest_value, set_internalvar, clear_internalvar): Update. * stack.c (info_frame_command): Don't call value_free. * python/py-value.c (valpy_dealloc, valpy_new) (value_to_value_object): Update. * printcmd.c (do_examine): Update. * opencl-lang.c (lval_func_free_closure): Update. * mi/mi-main.c (register_changed_p): Don't call value_free. * mep-tdep.c (mep_frame_prev_register): Don't call value_free. * m88k-tdep.c (m88k_frame_prev_register): Don't call value_free. * m68hc11-tdep.c (m68hc11_frame_prev_register): Don't call value_free. * guile/scm-value.c (vlscm_free_value_smob) (vlscm_scm_from_value): Update. * frame.c (frame_register_unwind, frame_unwind_register_signed) (frame_unwind_register_unsigned, get_frame_register_bytes) (put_frame_register_bytes): Don't call value_free. * findvar.c (address_from_register): Don't call value_free. * dwarf2read.c (dwarf2_compute_name): Don't call value_free. * dwarf2loc.c (entry_data_value_free_closure) (value_of_dwarf_reg_entry, free_pieced_value_closure) (dwarf2_evaluate_loc_desc_full): Update. * breakpoint.c (update_watchpoint, breakpoint_init_inferior) (~bpstats, bpstats, bpstat_clear_actions, watchpoint_check) (~watchpoint, watch_command_1) (invalidate_bp_value_on_memory_change): Update. * alpha-tdep.c (alpha_register_to_value): Don't call value_free.
2018-04-06Add -Wno-error=deprecated-register to gdb build flagsSimon Marchi3-2/+10
As shown in PR 23022, building with clang-6 and Python 2 trips on the fact that the Python 2 headers use the "register" keyword: /usr/include/python2.7/unicodeobject.h:534:5: error: 'register' storage class specifier is deprecated and incompatible with C++17 [-Werror,-Wdeprecated-register] register PyObject *obj, /* Object */ ^~~~~~~~~ This patch adds -Wno-error=deprecated-register to our flags, so that we can still see this class of warnings, but they don't cause a build failure. gdb/ChangeLog: PR gdb/23022 * warning.m4: Add -Wno-error=deprecated-register. * configure: Re-generate.
2018-04-05Remove unnecessary include from linespec.hTom Tromey2-1/+4
linespec.h was inculding vec.h, but doesn't expose any VECs. So, this include can be removed. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * linespec.h: Remove include of "vec.h".
2018-04-05Remove typep and VEC(typep) from linespec.cTom Tromey2-25/+16
This removes VEC(typep) from linespec.c in favor of std::vector. It also removes the "typep" typedef. This change allowed the removal of some cleanups. I believe the previous cleanup code in find_superclass_methods could result in a memory leak, so this patch is an improvement in that way as well. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * linespec.c (typep): Remove typedef. (find_methods, find_superclass_methods): Take a std::vector. (find_method): Use std::vector.
2018-04-05More use of std::vector in linespec.cTom Tromey6-78/+47
This changes some spots in linespec.c to take a std::vector. This patch spilled out to objc-lang.c a bit as well. This change allows for the removal of some cleanups. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * utils.c (compare_strings): Remove. * utils.h (compare_strings): Remove. * objc-lang.h (find_imps): Update. * objc-lang.c (find_methods): Take a std::vector. (uniquify_strings, find_imps): Likewise. * linespec.c (find_methods): Take a std::vector. (decode_objc): Use std::vector. (add_all_symbol_names_from_pspace, find_superclass_methods): Take a std::vector. (find_method, find_function_symbols): Use std::vector.
2018-04-05Change streq to return boolTom Tromey6-12/+37
I wanted to use streq with std::unique in another (upcoming) patch in this seres, so I changed it to return bool. To my surprise, this lead to regressions. The cause turned out to be that streq was used as an htab callback -- by casting it to the correct function type. This sort of cast is invalid, so this patch adds a variant which is directly suitable for use by htab. (Note that I did not add an overload, as I could not get that to work with template deduction in the other patch.) ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * completer.c (completion_tracker::completion_tracker): Remove cast. (completion_tracker::discard_completions): Likewise. * breakpoint.c (ambiguous_names_p): Remove cast. * ada-lang.c (_initialize_ada_language): Remove cast. * utils.h (streq): Update. (streq_hash): Add new declaration. * utils.c (streq): Return bool. (streq_hash): New function.
2018-04-05Remove a string copy from event_location_to_salsTom Tromey2-7/+6
The use of "const" showed that a string copy in event_location_to_sals was unnecessary. This patch removes it. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * linespec.c (event_location_to_sals) <case ADDRESS_LOCATION>: Remove a string copy.
2018-04-05Have filter_results take a std::vectorTom Tromey2-16/+11
This chagnes filter_results to take a std::vector, allowing the removal of some cleanups in its callers. ChangeLog 2018-04-05 Tom Tromey <tom@tromey.com> * linespec.c (filter_results): Use std::vector. (decode_line_2, decode_line_full): Update.