aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2021-04-19Fix kfail patterns in inline-locals.expTom Tromey2-2/+7
PR gdb/27742 points out that my recent change to print_variable_and_value caused a regression in inline-locals.exp. I can't reproduce this, but I came up with this patch based on the output shown in the bug. gdb/testsuite/ChangeLog 2021-04-19 Tom Tromey <tromey@adacore.com> PR gdb/27742: * gdb.opt/inline-locals.exp: Update kfail patterns.
2021-04-17Handle unaligned mapping of .gdb_indexTom Tromey4-81/+132
The .gdb_index was designed such that all data would be aligned. Unfortunately, we neglected to require this alignment in the objcopy instructions in the manual. As a result, in many cases, a .gdb_index in the wild will not be properly aligned by mmap. This yields undefined behavior, which is PR gdb/23743. This patch fixes the bug by always assuming that the mapping is unaligned, and using extract_unsigned_integer when needed. A new helper class is introduced to make this less painful. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> PR gdb/23743: * dwarf2/read.c (class offset_view): New. (struct symbol_table_slot): Remove. (struct mapped_index) <symbol_table, constant_pool>: Change type. <symbol_name_index, symbol_vec_index>: New methods. <symbol_name_slot_invalid, symbol_name_at, symbol_name_count>: Rewrite. (read_gdb_index_from_buffer): Update. (struct dw2_symtab_iterator) <vec>: Change type. (dw2_symtab_iter_init_common, dw2_symtab_iter_init) (dw2_symtab_iter_next, dw2_expand_marked_cus): Update. * dwarf2/index-write.c (class data_buf) <append_data>: Remove. <append_array, append_offset>: New methods. (write_hash_table, add_address_entry, write_gdbindex_1) (write_debug_names): Update. * dwarf2/index-common.h (byte_swap, MAYBE_SWAP): Remove.
2021-04-17Avoid crash in write_psymtabs_to_indexTom Tromey4-1/+39
If I try "save gdb-index" using the executable from gdb.cp/cmpd-minsyms.exp, gdb will crash. This happens due to a missing NULL check. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * dwarf2/index-write.c (write_psymtabs_to_index): Check partial_symtabs. gdb/testsuite/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * gdb.dwarf2/gdb-index-nodebug.exp: New file.
2021-04-17Simplify quick_symbol_functions::map_matching_symbolsTom Tromey8-84/+76
quick_symbol_functions::map_matching_symbols is only used by the Ada code. Currently, it both expands certain psymtabs and then walks over the full symtabs -- including any already-expanded ones -- calling a callback. It appears to work lazily as well, in that if the callback returns false, iteration stops. However, only the psymtab implementation does this; the DWARF index implementations are not lazy. It turns out, though, that the only callback that is ever passed here never returns false. This patch simplifies this method by removing the callback. The method is also renamed. In the new scheme, the caller is responsible for walking the full symtabs, which removes some redundancy as well. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * psymtab.c (psymbol_functions::expand_matching_symbols): Rename from map_matching_symbols. Change parameters. * psympriv.h (struct psymbol_functions) <expand_matching_symbols>: Rename from map_matching_symbols. Change parameters. * dwarf2/read.c (struct dwarf2_gdb_index) <expand_matching_symbols>: Rename from map_matching_symbols. Change parameters. (struct dwarf2_debug_names_index) <expand_matching_symbols>: Rename from map_matching_symbols. Change parameters. (dwarf2_gdb_index::expand_matching_symbols): Rename from dw2_map_matching_symbols. Change parameters. (dwarf2_gdb_index::expand_matching_symbols): Remove old implementation. (dwarf2_debug_names_index::expand_matching_symbols): Rename from map_matching_symbols. Change parameters. * objfiles.h (struct objfile) <expand_matching_symbols>: Rename from map_matching_symbols. Change parameters. * symfile-debug.c (objfile::expand_matching_symbols): Rename from map_matching_symbols. Change parameters. * ada-lang.c (map_matching_symbols): New function. (add_nonlocal_symbols): Update.
2021-04-17Remove quick_symbol_functions::expand_symtabs_with_fullnameTom Tromey7-72/+37
This removes quick_symbol_functions::expand_symtabs_with_fullname, replacing it with a call to expand_symtabs_matching. As with the previous patches, the implementation is consolidated in the objfile method. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * quick-symbol.h (struct quick_symbol_functions) <expand_symtabs_with_fullname>: Remove. * psymtab.c (psymbol_functions::expand_symtabs_with_fullname): Remove. * psympriv.h (struct psymbol_functions) <expand_symtabs_with_fullname>: Remove. * dwarf2/read.c (struct dwarf2_base_index_functions) <expand_symtabs_with_fullname>: Remove. (dwarf2_base_index_functions::expand_symtabs_with_fullname): Remove. * objfiles.h (struct objfile) <expand_symtabs_with_fullname>: Update comment. * symfile-debug.c (objfile::expand_symtabs_with_fullname): Rewrite.
2021-04-17Remove quick_symbol_functions::expand_symtabs_for_functionTom Tromey7-176/+41
This removes quick_symbol_functions::expand_symtabs_for_function, replacing it with a call to expand_symtabs_matching. As with the previous patches, the implementation is consolidated in the objfile method. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * symfile-debug.c (objfile::expand_symtabs_for_function): Rewrite. * quick-symbol.h (struct quick_symbol_functions) <expand_symtabs_for_function>: Remove. * psymtab.c (psymbol_functions::expand_symtabs_for_function): Remove. * psympriv.h (struct psymbol_functions) <expand_symtabs_for_function>: Remove. * objfiles.h (struct objfile) <expand_symtabs_for_function>: Update comment. * dwarf2/read.c (struct dwarf2_gdb_index) <expand_symtabs_for_function>: Remove. (struct dwarf2_debug_names_index) <expand_symtabs_for_function>: Remove. (find_slot_in_mapped_hash): Remove. (dw2_symtab_iter_init_common): Merge with dw2_symtab_iter_init. (dw2_symtab_iter_init): Remove one overload. (dwarf2_gdb_index::expand_symtabs_for_function) (dwarf2_debug_names_index::expand_symtabs_for_function): Remove.
2021-04-17Remove quick_symbol_functions::map_symtabs_matching_filenameTom Tromey7-215/+77
This replaces quick_symbol_functions::map_symtabs_matching_filename with a call to expand_symtabs_matching. As with the previous patch, rather than update all callers, the implementation is consolidated in objfile::map_symtabs_matching_filename. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * symfile-debug.c (objfile::map_symtabs_matching_filename): Rewrite. * quick-symbol.h (struct quick_symbol_functions) <map_symtabs_matching_filename>: Remove. * psymtab.c (partial_map_expand_apply) (psymbol_functions::map_symtabs_matching_filename): Remove. * psympriv.h (struct psymbol_functions) <map_symtabs_matching_filename>: Remove. * objfiles.h (struct objfile) <map_symtabs_matching_filename>: Update comment. * dwarf2/read.c (struct dwarf2_base_index_functions) <map_symtabs_matching_filename>: Remove. (dw2_map_expand_apply) (dwarf2_base_index_functions::map_symtabs_matching_filename): Remove.
2021-04-17Remove quick_symbol_functions::lookup_symbolTom Tromey7-180/+66
This removes quick_symbol_functions, replacing it with calls to expand_symtabs_matching. Because the replacement is somewhat verbose, objfile::lookup_symbol is not removed. This consolidates some duplicated code into this one spot. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * symfile-debug.c (objfile::lookup_symbol): Rewrite. * quick-symbol.h (struct quick_symbol_functions) <lookup_symbol>: Remove. * psymtab.c (psymbol_functions::lookup_symbol): Remove. * psympriv.h (struct psymbol_functions) <lookup_symbol>: Remove. * objfiles.h (struct objfile) <lookup_symbol>: Add comment. * dwarf2/read.c (struct dwarf2_gdb_index) <lookup_symbol>: Remove. (struct dwarf2_debug_names_index) <lookup_symbol>: Remove. (dwarf2_gdb_index::lookup_symbol) (dwarf2_debug_names_index::lookup_symbol): Remove.
2021-04-17Add 'domain' parameter to expand_symtabs_matchingTom Tromey11-18/+66
Currently, expand_symtabs_matching only accepts a search_domain parameter. However, lookup_symbol uses a domain_enum instead, and the two, confusingly, do quite different things -- one cannot emulate the other. So, this patch adds a domain_enum parameter to expand_symtabs_matching, with UNDEF_DOMAIN used as a wildcard. This is another step toward replacing lookup_symbol with expand_symtabs_matching. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * symtab.c (global_symbol_searcher::expand_symtabs): Update. * symmisc.c (maintenance_expand_symtabs): Update. * symfile.c (expand_symtabs_matching): Update. * symfile-debug.c (objfile::expand_symtabs_matching): Add 'domain' parameter. * quick-symbol.h (struct quick_symbol_functions) <expand_symtabs_matching>: Add 'domain' parameter. * psymtab.c (recursively_search_psymtabs) (psymbol_functions::expand_symtabs_matching): Add 'domain' parameter. * psympriv.h (struct psymbol_functions) <expand_symtabs_matching>: Add 'domain' parameter. * objfiles.h (struct objfile) <expand_symtabs_matching>: Add 'domain' parameter. * linespec.c (iterate_over_all_matching_symtabs): Update. * dwarf2/read.c (struct dwarf2_gdb_index) <expand_symtabs_matching>: Add 'domain' parameter. (struct dwarf2_debug_names_index) <expand_symtabs_matching>: Add 'domain' parameter. (dw2_expand_symtabs_matching) (dwarf2_gdb_index::expand_symtabs_matching) (dw2_debug_names_iterator) (dwarf2_debug_names_index::expand_symtabs_matching): Add 'domain' parameter.
2021-04-17Add search_flags to expand_symtabs_matchingTom Tromey14-23/+128
This adds a block search flags parameter to expand_symtabs_matching. All callers are updated to search both the static and global blocks, as that was the implied behavior before this patch. This is a step toward replacing lookup_symbol with expand_symtabs_matching. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * symtab.c (global_symbol_searcher::expand_symtabs) (default_collect_symbol_completion_matches_break_on): Update. * symmisc.c (maintenance_expand_symtabs): Update. * symfile.h (expand_symtabs_matching): Add search_flags parameter. * symfile.c (expand_symtabs_matching): Add search_flags parameter. * symfile-debug.c (objfile::expand_symtabs_matching): Add search_flags parameter. * quick-symbol.h (struct quick_symbol_functions) <expand_symtabs_matching>: Add search_flags parameter. * python/py-symbol.c (gdbpy_lookup_static_symbols): Update. * psymtab.c (recursively_search_psymtabs) (psymbol_functions::expand_symtabs_matching): Add search_flags parameter. * psympriv.h (struct psymbol_functions) <expand_symtabs_matching>: Add search_flags parameter. * objfiles.h (struct objfile) <expand_symtabs_matching>: Add search_flags parameter. * linespec.c (iterate_over_all_matching_symtabs): Update. * dwarf2/read.c (struct dwarf2_gdb_index) <expand_symtabs_matching>: Add search_flags parameter. (struct dwarf2_debug_names_index) <expand_symtabs_matching>: Add search_flags parameter. (dw2_map_matching_symbols): Update. (dw2_expand_marked_cus, dw2_expand_symtabs_matching) (dwarf2_gdb_index::expand_symtabs_matching): Add search_flags parameter. (dw2_debug_names_iterator): Change block_index to search flags. <m_block_index>: Likewise. (dw2_debug_names_iterator::next) (dwarf2_debug_names_index::lookup_symbol) (dwarf2_debug_names_index::expand_symtabs_for_function) (dwarf2_debug_names_index::map_matching_symbols) (dwarf2_debug_names_index::map_matching_symbols): Update. (dwarf2_debug_names_index::expand_symtabs_matching): Add search_flags parameter. * ada-lang.c (ada_add_global_exceptions) (collect_symbol_completion_matches): Update.
2021-04-17Let expand_symtabs_matching short-circuitTom Tromey10-48/+114
This changes expand_symtabs_exp_notify_ftype to return bool, and updates all the uses. Now, if the notification function returns false, the call is short-circuited and stops examining symtabs. This is a step toward replacing map_symtabs_matching_filename with expand_symtabs_matching. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * symtab.c (default_collect_symbol_completion_matches_break_on): Update. * symfile.h (expand_symtabs_matching): Return bool. * symfile.c (expand_symtabs_matching): Return bool. * symfile-debug.c (objfile::expand_symtabs_matching): Return bool. * quick-symbol.h (expand_symtabs_exp_notify_ftype): Return bool. (struct quick_symbol_functions) <expand_symtabs_matching>: Return bool. * psymtab.c (psymbol_functions::expand_symtabs_matching): Return bool. * psympriv.h (struct psymbol_functions) <expand_symtabs_matching>: Return bool. * objfiles.h (struct objfile) <expand_symtabs_matching>: Return bool. * dwarf2/read.c (struct dwarf2_gdb_index) <expand_symtabs_matching>: Return bool. (struct dwarf2_debug_names_index) <expand_symtabs_matching>: Return bool. (dw2_expand_symtabs_matching_symbol): Return bool. (dw2_expand_symtabs_matching_one, dw2_expand_marked_cus) (dw2_expand_symtabs_matching) (dwarf2_gdb_index::expand_symtabs_matching) (dwarf2_debug_names_index::expand_symtabs_matching) (dwarf2_debug_names_index::expand_symtabs_matching): Return bool.
2021-04-17Add block_search_flagsTom Tromey2-0/+15
This adds block_search_flags, a flag enum. This will be used to by certain search functions so that the caller can control which blocks are searched more precisely. gdb/ChangeLog 2021-04-17 Tom Tromey <tom@tromey.com> * quick-symbol.h (enum block_search_flag_values): New. (block_search_flags): New enum flags type.
2021-04-16Rewrite the Rust expression parserTom Tromey7-2890/+2373
The Rust expression parser was written to construct its own AST, then lower this to GDB expressions. I did this primarily because the old expressions were difficult to work with; after rewriting those, I realized I could remove the AST from the Rust parser. After looking at this, I realized it might be simpler to rewrite the parser. This patch reimplements it as a recursive-descent parser. I kept a fair amount of the existing code -- the lexer is pulled in nearly unchanged. There are several benefits to this approach: * The parser is shorter now (from 2882 LOC to 2351). * The parser is just ordinary C++ code that can be debugged in the usual way. * Memory management in the parser is now straightforward, as parsing methods simply return a unique pointer or vector. This required a couple of minor changes to the test suite, as some errors have changed. While this passes the tests, it's possible there are lurking bugs, particularly around error handling. gdb/ChangeLog 2021-04-16 Tom Tromey <tom@tromey.com> * rust-parse.c: New file. * rust-exp.y: Remove. * Makefile.in (COMMON_SFILES): Add rust-parse.c. (SFILES): Remove rust-exp.y. (YYFILES, local-maintainer-clean): Remove rust-exp.c. gdb/testsuite/ChangeLog 2021-04-16 Tom Tromey <tom@tromey.com> * gdb.rust/simple.exp: Change error text. * gdb.rust/expr.exp: Change error text.
2021-04-16Fix syntax error in Rust testTom Tromey2-1/+5
The Rust test case simple.exp does: print slice as &[i32][0] However, this is a syntax error in Rust. Parens are needed around the "as". gdb/testsuite/ChangeLog 2021-04-16 Tom Tromey <tom@tromey.com> * gdb.rust/simple.exp: Add parens to 'as' test.
2021-04-16gdb/testsuite: use -gdwarf-4 in simavr boardSimon Marchi2-0/+8
By default, when using the -g switch, avr-gcc generates stabs debug information. I think it would make more sense to test GDB against DWARF information, because stabs is obsolete by now, and nobody work on it. So change the simavr board to pass -gdwarf-4 as the debug flag. The downside is that users are probably more likely to use just -g, so we don't test GDB the same way as users are likely to use it. But in this case, if somebody comes and asks for help with GDB for AVR, I suggest we encourage them to use -gdwarf-4. I can't give stats about how that changes test results, because the testsuite is too broken. There is an internal error that happens quite frequently that needs to be investigated: /home/simark/src/wt/avr/gdb/trad-frame.h:143: internal-error: LONGEST trad_frame_saved_reg::addr() const: Assertion `m_kind == trad_frame_saved_reg_kind::ADDR' failed. I sent a question on the gcc mailing list, asking why stabs is the default: https://gcc.gnu.org/pipermail/gcc/2021-April/235309.html gdb/testsuite/ChangeLog: * boards/simavr.exp: Set debug_flags. Change-Id: I70e471fad3a79ab1d79d13dda8436bb9eb666e0a
2021-04-16Print bfloat16 DWARF types correctlyLuis Machado4-1/+97
Even if the DWARF information contains a bfloat16 base type (__bf16), a variable of such type will still be printed using the IEEE half float format, which is wrong. This patch teaches GDB how to pick the bfloat16 format for __bf16 types in DWARF (based on the base type name) and uses IEEE half float for all the other 16-bit float formats. Tested on aarch64-linux/x86_64-linux. OK? gdb/ChangeLog: 2021-04-16 Luis Machado <luis.machado@linaro.org> * arch-utils.c (default_floatformat_for_type): Handle bfloat16. gdb/testsuite: 2021-04-16 Luis Machado <luis.machado@linaro.org> * gdb.dwarf2/dw2-bfloat16.exp: New file.
2021-04-15gdb fbsd-nat: Use new-style debug macrosJohn Baldwin2-35/+28
gdb/ChangeLog: * fbsd-nat.c (fbsd_lwp_debug_printf, fbsd_nat_debug_printf): New, use throughout file.
2021-04-15gdb/testsuite: don't include paths in test namesAndrew Burgess2-1/+7
Give a test a proper name in order to avoid including a path in the test name. gdb/testsuite/ChangeLog: * gdb.python/py-parameter.exp: Give a test a proper name to avoid including a path in the test name.
2021-04-15gdb/testsuite: use foreach_with_prefix in gdb.threads/fork-plus-threads.expSimon Marchi2-6/+8
I noticed that using foreach_with_prefix could make things a bit less verbose. No changes in behavior expected. gdb/testsuite/ChangeLog: * gdb.threads/fork-plus-threads.exp: Use foreach_with_prefix. Change-Id: I06aa6e3d10a9cfb6ada11547aefe8c70b636ac81
2021-04-15Avoid crash in Ada value printing with optimized-out arrayTom Tromey4-2/+45
The Ada value-printing code could crash when printing an array which had been optimized out. The crash is difficult to reproduce, but I did manage to write a test that at least shows that the previous behavior was incorrect -- before the patch, the array is printed as if it is valid and every value is 0. gdb/ChangeLog 2021-04-15 Tom Tromey <tromey@adacore.com> * ada-valprint.c (ada_value_print_array): Handle optimized-out arrays. gdb/testsuite/ChangeLog 2021-04-15 Tom Tromey <tromey@adacore.com> * gdb.dwarf2/arr-stride.exp: Add test.
2021-04-15Use common_val_print_checked in print_variable_and_valueTom Tromey2-1/+6
GDB was crashing in "bt full" for a large Ada program. I tracked this down to a combination of bugs. The first bug, fixed here, is that print_variable_and_value calls common_val_print. Normally only the value-printing implementation should call this; from the top level, common_val_print_checked is preferred, because it correctly handles values that are wholly optimized out. I wasn't able to write a test case for this. gdb/ChangeLog 2021-04-15 Tom Tromey <tromey@adacore.com> * printcmd.c (print_variable_and_value): Use common_val_print_checked.
2021-04-15Use block_symbol in var_value_operationTom Tromey15-70/+122
I noticed that var_value_operation takes a block and a symbol, and most callers destructure a block_symbol to pass in. It seems better for this class to simply hold a block_symbol instead. Tested on x86-64 Fedora 32. gdb/ChangeLog 2021-04-15 Tom Tromey <tromey@adacore.com> * rust-exp.y (rust_parser::convert_ast_to_expression): Update. * parse.c (parser_state::push_symbol, parser_state::push_dollar): Update. * p-exp.y (variable): Update. * m2-exp.y (variable): Update. * go-exp.y (variable): Update. * expprint.c (dump_for_expression): New overload. * expop.h (check_objfile): New overload. (check_constant): New overload. (class var_value_operation): Use block_symbol. <get_symbol>: Rewrite. * eval.c (var_value_operation::evaluate) (var_value_operation::evaluate_funcall) (var_value_operation::evaluate_for_address) (var_value_operation::evaluate_for_address) (var_value_operation::evaluate_with_coercion) (var_value_operation::evaluate_for_sizeof) (var_value_operation::evaluate_for_cast): Update. * d-exp.y (PrimaryExpression): Update. * c-exp.y (variable): Update. * ax-gdb.c (var_value_operation::do_generate_ax): Update. * ada-lang.c (ada_var_value_operation::evaluate_for_cast) (ada_var_value_operation::evaluate) (ada_var_value_operation::resolve) (ada_funcall_operation::resolve): Update. * ada-exp.y (write_var_from_sym, write_object_renaming) (write_ambiguous_var, write_var_or_type, write_name_assoc) (maybe_overload): Update. * ada-exp.h (class ada_var_value_operation) <get_block>: Rewrite.
2021-04-15gdb: add "set startup-quietly" commandTom Tromey9-0/+117
This adds a new command to change GDB to behave as though "-quiet" were always given. This new command can be added to the gdbearlyinit file to affect future GDB sessions. gdb/ChangeLog: * NEWS: Add entry. * main.c (captured_main_1): Call check_quiet_mode. * top.c (startup_quiet): New global. (check_quiet_mode): New function. (show_startup_quiet): New function. (init_main): Register new command. * top.h (check_quiet_mode): Declare. gdb/doc/ChangeLog: * gdb.texinfo (Mode Options): Mention "set startup-quietly". gdb/testsuite/ChangeLog: * gdb.base/startup-file.exp: Add more tests.
2021-04-15gdb: process early initialization files and command line optionsAndrew Burgess12-11/+357
Adds the ability to process commands at a new phase during GDB's startup. This phase is earlier than the current initialisation file processing, before GDB has produced any output. The number of commands that can be processed at this early stage will be limited, and it is expected that the only commands that would be processed at this stage will relate to some of the fundamentals of how GDB starts up. Currently the only commands that it makes sense to add to this early initialization file are those like 'set style version ....' as the version string is displayed during startup before the standard initialization files are parsed. As such this commit fully resolved bug cli/25956. This commit adds a mechanism to execute these early initialization files from a users HOME directory, as well as some corresponding command line flags for GDB. The early initialization files that GDB will currently check for are ~/.config/gdb/gdbearlyinit (on Linux like systems) or ~/.gdbearlyinit if the former is not found. The output of 'gdb --help' has been extended to include a list of the early initialization files being processed. gdb/ChangeLog: PR cli/25956 * NEWS: Mention new early init files and command line options. * config.in: Regenerate. * configure: Regenerate. * configure.ac: Define GDBEARLYINIT. * main.c (get_earlyinit_files): New function. (enum cmdarg_kind): Add CMDARG_EARLYINIT_FILE and CMDARG_EARLYINIT_COMMAND. (captured_main_1): Add support for new command line flags, and for processing startup files. (print_gdb_help): Include startup files in the output. gdb/doc/ChangeLog: PR cli/25956 * gdb.texinfo (File Options): Mention new command line options. (Startup): Discuss when early init files are processed. (Initialization Files): Add description of early init files. (Output Styling): Update description of 'version' style. (gdb man): Mention early init files. gdb/testsuite/ChangeLog: PR cli/25956 * gdb.base/early-init-file.c: New file. * gdb.base/early-init-file.exp: New file. * lib/gdb-utils.exp (style): Handle style 'none'.
2021-04-15gdb: refactor the initialization file lookup codeAndrew Burgess2-63/+132
In preparation for the next patch, which adds startup files, this commit refactors the code for looking up the initialization files so that the code can be more easily reused in the next commit. There should be no user visible changes after this commit. gdb/ChangeLog: * main.c (relocate_gdbinit_path_maybe_in_datadir): Rename to... (relocate_file_path_maybe_in_datadir): ...this. (class gdb_initfile_finder): New class. (get_init_files): Now uses gdb_initfile_finder. (print_gdb_help): Print 'None found' when there are no init files.
2021-04-14testsuite, dwarf2: use @DW_INL_declared_inlined in a testTankut Baris Aktemur2-1/+6
gdb/testsuite/ChangeLog: 2021-04-14 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * gdb.dwarf2/dw2-inline-with-lexical-scope.exp: Use @DW_INL_declared_inlined for the inline attribute.
2021-04-14gdb/dwarf2: fix "info locals" for clang-compiled inlined functionsTankut Baris Aktemur7-1/+304
GDB reports duplicate local vars with "<optimized out>" values for inlined functions that are compiled with Clang. Suppose we have __attribute__((always_inline)) static void aFunction() { int a = 42; if(a > 2) { int value = a; value += 10; /* break here */ } } The "info locals" command at the "break here" line gives the following output: ... Breakpoint 1, aFunction () at test.c:6 6 value += 10; /* break here */ (gdb) info locals value = 42 a = 42 value = <optimized out> (gdb) The reason is, inlined functions that are compiled by Clang do not contain DW_AT_abstract_origin attributes in the DW_TAG_lexical_block entries. See https://bugs.llvm.org/show_bug.cgi?id=49953 E.g. the DIE of the inlined function above is 0x00000087: DW_TAG_inlined_subroutine DW_AT_abstract_origin (0x0000002a "aFunction") DW_AT_low_pc (0x00000000004004b2) DW_AT_high_pc (0x00000000004004d2) DW_AT_call_file ("/tmp/test.c") DW_AT_call_line (11) DW_AT_call_column (0x03) 0x0000009b: DW_TAG_variable DW_AT_location (DW_OP_fbreg -4) DW_AT_abstract_origin (0x00000032 "a") 0x000000a3: DW_TAG_lexical_block DW_AT_low_pc (0x00000000004004c3) DW_AT_high_pc (0x00000000004004d2) 0x000000b0: DW_TAG_variable DW_AT_location (DW_OP_fbreg -8) DW_AT_abstract_origin (0x0000003e "value") This causes GDB to fail matching the concrete lexical scope with the corresponding abstract entry. Hence, the local vars of the abstract function that are contained in the lexical scope are read separately (and thus, in addition to) the local vars of the concrete scope. Because the abstract definitions of the vars do not contain location information, we see the extra 'value = <optimized out>' above. This bug is highly related to PR gdb/25695, but the root cause is not exactly the same. In PR gdb/25695, GCC emits an extra DW_TAG_lexical_block without an DW_AT_abstract_origin that wraps the body of the inlined function. That is, the trees of the abstract DIE for the function and its concrete instance are structurally not the same. In the case of using Clang, the trees have the same structure. To tackle the Clang case, when traversing the children of the concrete instance root, keep a reference to the child of the abstract DIE that corresponds to the concrete child, so that we can match the two DIEs heuristically in case of missing DW_AT_abstract_origin attributes. The updated gdb.opt/inline-locals.exp test has been checked with GCC 5-10 and Clang 5-11. gdb/ChangeLog: 2021-04-14 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * dwarf2/read.c (inherit_abstract_dies): Keep a reference to the corresponding child of the abstract DIE when iterating the children of the concrete DIE. gdb/testsuite/ChangeLog: 2021-04-14 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * gdb.opt/inline-locals.c (scoped): New function. (main): Call 'scoped'. * gdb.opt/inline-locals.exp: Update with "info locals" tests for scoped variables. * gdb.dwarf2/dw2-inline-with-lexical-scope.c: New file. * gdb.dwarf2/dw2-inline-with-lexical-scope.exp: New file.
2021-04-14gdb/doc: add missing parentheses around prompt in some examplesAndrew Burgess2-5/+12
While reading the manual for -info-os I noticed that the GDB prompt is given as 'gdb' when it should really be '(gdb)'. This is because the prompt is created with: '@value{GDBP}'. The GDBP variable (the GDB program name) is intended for use as the prompt string (though this is not used consistently throughout the manual), however it is normally used like '(@value{GDBP})', but in a couple of places the enclosing parentheses are missing. In this commit I do the following: - Change '@value{GDBP}' to '(@value{GDBP})' wherever the variable represents a prompt string. - Replaces '(gdb)' with '(@value{GDBP})' in one example where we are already using '(@value{GDBP})', this makes that one example consistent. I have NOT: - Changed all instances of '(gdb)' with '(@value{GDBP})', this would be a huge change. gdb/doc/ChangeLog: * gdb.texinfo (GDB/MI Miscellaneous Commands): Add missing parentheses to GDB prompt in example, and replace '(gdb)' with '(@value{GDBP})' in one example where the latter was already in use.
2021-04-14testsuite, gdb: recognize DW_OP_fbreg in lib/dwarf.expTankut Baris Aktemur2-0/+9
gdb/testsuite/ChangeLog: 2021-04-14 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * lib/dwarf.exp (_location): Recognize DW_OP_fbreg as an op.
2021-04-13[gdb] Fix regoff_t incompatibilityTom de Vries2-2/+7
I did an experiment with importing the regex module in gnulib, and trying to build gdb. The first problem I ran into was that: - regoff_t was defined as long int, and - the address of a regoff_t variable i in ui_file_style::parse was passed as int * to function extended_color. Fix this by changing the types of some function parameters of functions read_semi_number and extended_color from int * to regoff_t *. Tested on x86_64-linux. gdb/ChangeLog: 2021-04-13 Tom de Vries <tdevries@suse.de> * ui-style.c (read_semi_number, extended_color): Change idx parameter type to regoff_t *.
2021-04-13Fix build failure for 32-bit targets with --enable-targets=allLuis Machado2-2/+9
Replace use of %lx with %s. gdb/ChangeLog: 2021-04-13 Luis Machado <luis.machado@linaro.org> * rs6000-tdep.c (ppc_displaced_step_fixup): Use %s to print hex values.
2021-04-12[PATCH,rs6000] Fix vsx-regs.exp testcase failureWill Schmidt2-1/+16
Hi, This test exercise updates to the F* and VS* registers and verifies updates to the same. Note that the registers overlap; the doubleword[1] portion of any VS0-VS31 register contains the F0-F31 register contents, so any updates to one can be measured in the other. Per a brief investigation, we see that dl_main() currently uses some VSX instructions, so the VS* values are not going to be zero when this testcase reaches main, where these tests begin. The test harness does not explicitly initialize the full VS* values, so the first test loop that updates the F* values means our VS* values are uninitalized and will fail the first set of checks. This update explicitly initializes the doubleword[0] portion of the VS* registers, to allow this test to succeed. 2021-04-12 Will Schmidt <will_schmidt@vnet.ibm.com> gdb/testsuite/ChangeLog: * gdb.arch/vsx-regs.exp: Initialize vs* doublewords.
2021-04-12[PATCH] gdb-power10-single-stepWill Schmidt5-9/+236
Hi, This is based on a patch originally written by Alan Modra. Powerpc / Power10 ISA 3.1 adds prefixed instructions, which are 8 bytes in length. This is in contrast to powerpc previously always having 4 byte instruction length. This patch implements changes to allow GDB to better detect prefixed instructions, and handle single stepping across the 8 byte instructions. Added #defines to help test for PNOP and prefix instructions. Update ppc_displaced_step_copy_insn() to handle pnop and prefixed instructions whem R=0 (non-pc-relative). Updated ppc_displaced_step_fixup() to properly handle the offset value matching the current instruction size Updated the for-loop within ppc_deal_with_atomic_sequence() to count instructions properly in case we have a mix of 4-byte and 8-byte instructions within the atomic_sequence_length. Added testcase and harness to exercise pc-relative load/store instructions with R=0. 2021-04-12 Will Schmidt <will_schmidt@vnet.ibm.com> gdb/ChangeLog: * rs6000-tdep.c: Add support for single-stepping of prefixed instructions. gdb/testsuite/ChangeLog: * gdb.arch/powerpc-plxv-nonrel.s: Testcase using non-relative plxv instructions. * gdb.arch/powerpc-plxv-nonrel.exp: Testcase harness.
2021-04-12[PATCH, rs6000, v3][PR gdb/27525] displaced stepping across addpcis/lnia.Will Schmidt7-1/+319
This addresses PR gdb/27525. The lnia and other variations of the addpcis instruction write the value of the NIA into a target register. If we are single-stepping across a breakpoint, the instruction is executed from a displaced location, and thusly the written value of the PC/NIA will be incorrect. The changes here will measure the displacement offset, and adjust the target register value to compensate. YYYY-MM-DD Will Schmidt <will_schmidt@vnet.ibm.com> gdb/ChangeLog: * rs6000-tdep.c (ppc_displaced_step_fixup): Update to handle the addpcis/lnia instruction. gdb/testsuite/ChangeLog: * gdb.arch/powerpc-addpcis.exp: Testcase harness to exercise single-stepping over subpcis,lnia,addpcis instructions with displacement. * gdb.arch/powerpc-addpcis.s: Testcase with stream of addpcis/lnia/subpcis instructions. * gdb.arch/powerpc-lnia.exp: Testcase harness to exercise single-stepping over lnia instructions with displacement. * gdb.arch/powerpc-lnia.s: Testcase with stream of lnia instructions.
2021-04-12[rs6000] Create a powerpc-power10.exp testWill Schmidt3-0/+1330
Inspired by the existing powerpc-power9.exp test, this is a new test to cover the power10 instruction disassembly. gdb/testsuite/ChangeLog: 2021-04-12 Will Schmidt <will_schmidt@vnet.ibm.com> * gdb.arch/powerpc-power10.s: New test for instructions. * gdb.arch/powerpc-power10.exp: Harness to run the test.
2021-04-12Add myself to gdb/MAINTAINERSWill Schmidt2-0/+5
gdb/ChangeLog: * MAINTAINERS (Write After Approval): Add myself.
2021-04-12RS6000 Add support to print vector register contents as float128Carl Love5-0/+138
This patch adds a floating point 128-bit composite field to the vsx register type. When printing the register with p/f the float128 field will be printed as a 128-bit floating point value. A test case to verify the new vsx register field is visible and correctly prints out the value of a 128-bit floating point value is also added. gdb/ChangeLog: * rs6000-tdep.c (rs6000_builtin_type_vec128): Add t_float128 variable. (rs6000_builtin_type_vec128): Add append_composite_type_field for float128. gdb/testsuite/ChangeLog: * gdb.arch/vsx-vsr-float128.c: New test file. * gdb.arch/vsx-vsr-float128.exp: New expect file.
2021-04-12gdb, gdbserver: remove WinCE support codeSimon Marchi3-16/+5
The support for WinCE was removed with commit 84b300de3666 ("gdbserver: remove support for ARM/WinCE"). There is some leftover code for WinCE support, guarded by the _WIN32_WCE macro, which I didn't know of at the time. I didn't remove the _WIN32_WCE references in the tests, because in theory we still support the WinCE architecture in GDB (when debugging remotely). So someone could run a test with that (although I'd be really surprised). gdb/ChangeLog: * nat/windows-nat.c: Remove all code guarded by _WIN32_WCE. * nat/windows-nat.h: Likewise. gdbserver/ChangeLog: * win32-low.cc: Remove all code guarded by _WIN32_WCE. * win32-low.h: Likewise. Change-Id: I7a871b897e2135dc195b10690bff2a01d9fac05a
2021-04-12gdb, testsuite, btrace: relax unneeded stepi expected outputMarkus Metzger2-1/+5
In gdb.btrace/reconnect.exp, we test that we can disconnect and reconnect again to a GDB session that is recording with the btrace recording format. It does not really matter what we are recording. The test assumed that stepping from _start will bring us into an area without debug information. This is not correct on all systems. Relax the expected output to also support systems where we do have debug information for that code.
2021-04-10Fix handling DLL loads at run timeEli Zaretskii2-11/+56
This patch makes handling a DLL load at run time (using LoadLibrary) much more reliable when its file name cannot be obtained using the lpImageName pointer provided by the DLL load debug event. The solution is to enumerate all the DLLs loaded by the inferior, looking for the DLL that's loaded at base address provided by the lpBaseOfDll pointer of the debug event. Correctly resolving the DLL file name is important, because without that GDB doesn't record the DLL in the list of solibs, and then later is unable to show functions in that DLL in the backtraces, which produces corrupted and truncated backtraces. See this thread for the problems that causes: https://sourceware.org/pipermail/gdb-patches/2021-March/177022.html gdb/ChangeLog: 2021-04-10 Eli Zaretskii <eliz@gnu.org> * windows-nat.c (windows_nat::handle_load_dll): Call windows_add_dll if get_image_name failed to glean the name of the DLL by using the lpImageName pointer. (windows_add_all_dlls): Now a thin wrapper around windows_add_dll. (windows_add_dll): Now does what windows_add_all_dlls did before, but also accepts an argument LOAD_ADDR, which, if non-NULL, specifies the address where the DLL was loaded into the inferior, and looks for the single DLL loaded at that address.
2021-04-09[AArch64] Fix include order for MTELuis Machado2-1/+6
Similarly to commit 665af52ec2a52184d39a76d6e724fa4733dbab3c, fix a build failure seen with an updated glibc, due to the enum/constant mismatch. The old include file order eventually makes asm/ptrace.h get included before sys/ptrace.h. This patch fixes it. Seems fairly obvious and I'll push it shortly. gdb/ChangeLog: 2021-04-09 Luis Machado <luis.machado@linaro.org> * nat/aarch64-mte-linux-ptrace.c: Update include file order.
2021-04-08Remove unused variable un darwin_nat_target::resumeDominique Quatravaux2-2/+5
gdb/ChangeLog: * darwin-nat.c (darwin_nat_target::resume): Remove status variable. Change-Id: Ibcbdd6641a12252840c7dea9f388f4f8ce265e3d
2021-04-08gdb: Allow prologue detection via symbols for Intel compilers.Felix Willgerodt5-8/+33
The next-gen Intel Fortran compiler isn't flang-based, but emits prologue_end in the same manner. As do the newer Intel C/C++ compilers. This allows prologue detection based on dwarf for all newer Intel compilers. The cut-off version was not chosen for any specific reason other than the effort to test this. gdb/Changelog: 2021-04-08 Felix Willgerodt <felix.willgerodt@intel.com> * i386-tdep.c (i386_skip_prologue): Use symbol table to find the prologue end for Intel compilers. * amd64-tdep.c (amd64_skip_prologue): Likewise. * producer.c (producer_is_icc_ge_19): New function. * producer.h (producer_is_icc_ge_19): New declaration.
2021-04-08gdb: Update producer check for Intel compilers.Felix Willgerodt3-54/+23
The main goal of this patch is to get rid of a warning for the new Fortran compiler: (gdb) b 9 warning: Could not recognize version of Intel Compiler in: "Intel(R) Fortran 21.0-2087b" Breakpoint 1 at 0x4048cf: file comp.f90, line 9. While trying to fix this I analyzed DW_AT_producer of all latest Intel compilers for C, C++ and Fortran. They do no longer necessarily start with "Intel (R)" nor do they follow the internal and external version number scheme that the original patch for this check assumed. Some newer compilers even contradict the "intermediate" digit in the old version scheme and have the MINOR number as the second digit, even when having 3 or 4 digits overall. Therefore I rewrote the check to consider the first MAJOR.MINOR string found as the version number. This might not be 100% correct for some older internal compilers, but the only current user of this function is only checking for the major version anyway. Hence this should be reliable enough and extendable enough going forward. gdb/ChangeLog: 2021-04-08 Felix Willgerodt <felix.willgerodt@intel.com> * producer.c: (producer_is_icc): Update for new version scheme. (producer_parsing_tests): Update names and expected results. * producer.h: (producer_is_icc): Update comment accordingly.
2021-04-07gdb: make target_ops::follow_fork return voidSimon Marchi12-40/+44
I noticed that all implementations return false, so target_ops::follow_fork doesn't really need to return a value. Change it to return void. gdb/ChangeLog: * target.h (struct target_ops) <follow_fork>: Return void. (target_follow_fork): Likewise. * target.c (default_follow_fork): Likewise. (target_follow_fork): Likewise. * infrun.c (follow_fork_inferior): Adjust. * fbsd-nat.h (class fbsd_nat_target) <follow_fork>: Return void. * fbsd-nat.c (fbsd_nat_target:::follow_fork): Likewise. * linux-nat.h (class linux_nat_target) <follow_fork>: Likewise. * linux-nat.c (linux_nat_target::follow_fork): Return void. * obsd-nat.h (class obsd_nat_target) <follow_fork>: Return void. * obsd-nat.c (obsd_nat_target::follow_fork): Likewise. * remote.c (class remote_target) <follow_fork>: Likewise. (remote_target::follow_fork): Likewise. * target-delegates.c: Re-generate. Change-Id: If908c2f68b29fa275be2b0b9deb41e4c6a1b7879
2021-04-07CTF: handle forward reference typeWeimin Pan5-13/+91
Added function fetch_tid_type which calls get_tid_type and will set up the type, associated with a tid, if it is not read in yet. Also implement function read_forward_type which handles the CTF_K_FORWARD kind. Expanded gdb.base/ctf-ptype.exp to add cases with forward references. gdb/ChangeLog: * ctfread.c (fetch_tid_type): New function, use throughout file. (read_forward_type): New function. (read_type_record): Call read_forward_type. gdb/testsuite/ChangeLog: * gdb.base/ctf-ptype.c: Add struct link containing a forward reference type. * gdb.base/ctf-ptype.exp: Add "ptype struct link".
2021-04-07gdb/fortran: handle dynamic types within arrays and structuresAndrew Burgess7-4/+333
This commit replaces this patch: https://sourceware.org/pipermail/gdb-patches/2021-January/174933.html which was itself a replacement for this patch: https://sourceware.org/pipermail/gdb-patches/2020-July/170335.html The motivation behind the original patch can be seen in the new test, which currently gives a GDB session like this: (gdb) ptype var8 type = Type type6 PTR TO -> ( Type type2 :: ptr_1 ) PTR TO -> ( Type type2 :: ptr_2 ) End Type type6 (gdb) ptype var8%ptr_2 type = PTR TO -> ( Type type2 integer(kind=4) :: spacer Type type1, allocatable :: t2_array(:) <------ Issue #1 End Type type2 ) (gdb) ptype var8%ptr_2%t2_array Cannot access memory at address 0x38 <------ Issue #2 (gdb) Issue #1: Here we see the abstract dynamic type, rather than the resolved concrete type. Though in some cases the user might be interested in the abstract dynamic type, I think that in most cases showing the resolved concrete type will be of more use. Plus, the user can always figure out the dynamic type (by source code inspection if nothing else) given the concrete type, but it is much harder to figure out the concrete type given only the dynamic type. Issue #2: In this example, GDB evaluates the expression in EVAL_AVOID_SIDE_EFFECTS mode (due to ptype). The value returned for var8%ptr_2 will be a non-lazy, zero value of the correct dynamic type. However, when GDB asks about the type of t2_array this requires GDB to access the value of var8%ptr_2 in order to read the dynamic properties. As this value was forced to zero (thanks to the use of EVAL_AVOID_SIDE_EFFECTS) then GDB ends up accessing memory at a base of zero plus some offset. Both this patch, and my previous two attempts, have all tried to resolve this problem by stopping EVAL_AVOID_SIDE_EFFECTS replacing the result value with a zero value in some cases. This new patch is influenced by how Ada handles its tagged typed. There are plenty of examples in ada-lang.c, but one specific case is ada_structop_operation::evaluate. When GDB spots that we are dealing with a tagged (dynamic) type, and we're in EVAL_AVOID_SIDE_EFFECTS mode, then GDB re-evaluates the child operation in EVAL_NORMAL mode. This commit handles two cases like this specifically for Fortran, a new fortran_structop_operation, and the already existing fortran_undetermined, which is where we handle array accesses. In these two locations we spot when we are dealing with a dynamic type and re-evaluate the child operation in EVAL_NORMAL mode so that we are able to access the dynamic properties of the type. The rest of this commit message is my attempt to record why my previous patches failed. To understand my second patch, and why it failed lets consider two expressions, this Fortran expression: (gdb) ptype var8%ptr_2%t2_array --<A> Operation: STRUCTOP_STRUCT --(1) Operation: STRUCTOP_STRUCT --(2) Operation: OP_VAR_VALUE --(3) Symbol: var8 Block: 0x3980ac0 String: ptr_2 String: t2_array And this C expression: (gdb) ptype ptr && ptr->a == 3 --<B> Operation: BINOP_LOGICAL_AND --(4) Operation: OP_VAR_VALUE --(5) Symbol: ptr Block: 0x45a2a00 Operation: BINOP_EQUAL --(6) Operation: STRUCTOP_PTR --(7) Operation: OP_VAR_VALUE --(8) Symbol: ptr Block: 0x45a2a00 String: a Operation: OP_LONG --(9) Type: int Constant: 0x0000000000000003 In expression <A> we should assume that t2_array is of dynamic type. Nothing has dynamic type in expression <B>. This is how GDB currently handles expression <A>, in all cases, EVAL_AVOID_SIDE_EFFECTS or EVAL_NORMAL, an OP_VAR_VALUE operation always returns the real value of the symbol, this is not forced to a zero value even in EVAL_AVOID_SIDE_EFFECTS mode. This means that (3), (5), and (8) will always return a real lazy value for the symbol. However a STRUCTOP_STRUCT will always replace its result with a non-lazy, zero value with the same type as its result. So (2) will lookup the field ptr_2 and create a zero value with that type. In this case the type is a pointer to a dynamic type. Then, when we evaluate (1) to figure out the resolved type of t2_array, we need to read the types dynamic properties. These properties are stored in memory relative to the objects base address, and the base address is in var8%ptr_2, which we already figured out has the value zero. GDB then evaluates the DWARF expressions that take the base address, add an offset and dereference. GDB then ends up trying to access addresses like 0x16, 0x8, etc. To fix this, I proposed changing STRUCTOP_STRUCT so that instead of returning a zero value we instead returned the actual value representing the structure's field in the target. My thinking was that GDB would not try to access the value's contents unless it needed it to resolve a dynamic type. This belief was incorrect. Consider expression <B>. We already know that (5) and (8) will return real values for the symbols being referenced. The BINOP_LOGICAL_AND, operation (4) will evaluate both of its children in EVAL_AVOID_SIDE_EFFECTS in order to get the types, this is required for C++ operator lookup. This means that even if the value of (5) would result in the BINOP_LOGICAL_AND returning false (say, ptr is NULL), we still evaluate (6) in EVAL_AVOID_SIDE_EFFECTS mode. Operation (6) will evaluate both children in EVAL_AVOID_SIDE_EFFECTS mode, operation (9) is easy, it just returns a value with the constant packed into it, but (7) is where the problem lies. Currently in GDB this STRUCTOP_STRUCT will always return a non-lazy zero value of the correct type. When the results of (7) and (9) are back in the BINOP_LOGICAL_AND operation (6), the two values are passed to value_equal which performs the comparison and returns a result. Note, the two things compared here are the immediate value (9), and a non-lazy zero value from (7). However, with my proposed patch operation (7) no longer returns a zero value, instead it returns a lazy value representing the actual value in target memory. When we call value_equal in (6) this code causes GDB to try and fetch the actual value from target memory. If `ptr` is NULL then this will cause GDB to access some invalid address at an offset from zero, this will most likely fail, and cause GDB to throw an error instead of returning the expected type. And so, we can now describe the problem that we're facing. The way GDB's expression evaluator is currently written we assume, when in EVAL_AVOID_SIDE_EFFECTS mode, that any value returned from a child operation can safely have its content read without throwing an error. If child operations start returning real values (instead of the fake zero values), then this is simply not true. If we wanted to work around this then we would need to rewrite almost all operations (I would guess) so that EVAL_AVOID_SIDE_EFFECTS mode does not cause evaluation of an operation to try and read the value of a child operation. As an example, consider this current GDB code from eval.c: struct value * eval_op_equal (struct type *expect_type, struct expression *exp, enum noside noside, enum exp_opcode op, struct value *arg1, struct value *arg2) { if (binop_user_defined_p (op, arg1, arg2)) { return value_x_binop (arg1, arg2, op, OP_NULL, noside); } else { binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2); int tem = value_equal (arg1, arg2); struct type *type = language_bool_type (exp->language_defn, exp->gdbarch); return value_from_longest (type, (LONGEST) tem); } } We could change this function to be this: struct value * eval_op_equal (struct type *expect_type, struct expression *exp, enum noside noside, enum exp_opcode op, struct value *arg1, struct value *arg2) { if (binop_user_defined_p (op, arg1, arg2)) { return value_x_binop (arg1, arg2, op, OP_NULL, noside); } else { struct type *type = language_bool_type (exp->language_defn, exp->gdbarch); if (noside == EVAL_AVOID_SIDE_EFFECTS) return value_zero (type, VALUE_LVAL (arg1)); else { binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2); int tem = value_equal (arg1, arg2); return value_from_longest (type, (LONGEST) tem); } } } Now we don't call value_equal unless we really need to. However, we would need to make the same, or similar change to almost all operations, which would be a big task, and might not be a direction we wanted to take GDB in. So, for now, I'm proposing we go with the more targeted, Fortran specific solution, that does the minimal required in order to correctly resolve the dynamic types. gdb/ChangeLog: * f-exp.h (class fortran_structop_operation): New class. * f-exp.y (exp): Create fortran_structop_operation instead of the generic structop_operation. * f-lang.c (fortran_undetermined::evaluate): Re-evaluate expression as EVAL_NORMAL if the result type was dynamic so we can extract the actual array bounds. (fortran_structop_operation::evaluate): New function. gdb/testsuite/ChangeLog: * gdb.fortran/dynamic-ptype-whatis.exp: New file. * gdb.fortran/dynamic-ptype-whatis.f90: New file.
2021-04-07gdb: allow casting to rvalue reference in more casesAndrew Burgess5-2/+61
It is not currently possible to cast some values to an rvaule reference. This happens when simple scalar values are cast to an rvalue reference of the same type, e.g.: int global_var; Then in GDB: (gdb) p static_cast<int&&> (global_var) Attempt to take address of value not located in memory. Which is clearly silly. The problem is that as part of the cast an intermediate value is created within GDB that becomes an lval_none rather than the original lval_memory. The casting logic basically goes like this: The call tree that leads to the error looks like this: value_cast value_cast value_ref value_addr error The first value_cast call is casting the value for 'global_var' to type 'int&&'. GDB spots that the target type is a reference, and so calls value_cast again, this time casting 'global_var' to type 'int'. We then call value_ref to convert the result of the second value_cast into a reference. Unfortunately, the second cast results in the value (for global_var) changing from an lval_memory to an lval_none. This is because int to int casting calls extract_unsigned_integer and then value_from_longest. In theory value_cast has a check at its head that should help in this case, the code is: if (value_type (arg2) == type) return arg2; However, this only works in some cases. In our case 'value_type (arg2)' will be an objfile owned type, while the type from the expression parser 'int&&' will be gdbarch owned. The pointers will not be equal, but the meaning of the type will be equal. I did consider making the int to int casting case smarter, but this obviously is only one example. We must also consider things like float to float, or pointer to pointer.... So, I instead decided to try and make the initial check smarter. Instead of a straight pointer comparison, I now propose that we use types_deeply_equal. If this is true then we are casting something back to its current type, in which case we can preserve the lval setting by using value_copy. gdb/ChangeLog: * valops.c (value_cast): Call value_deeply_equal before performing any cast. gdb/testsuite/ChangeLog: * gdb.cp/rvalue-ref-params.cc (f3): New function. (f4): New function. (global_int): New global variable. (global_float): Likeiwse. (main): Call both new functions. * gdb.cp/rvalue-ref-params.exp: Add new tests.
2021-04-07gdb: move cheap pointer equality check earlier in types_equalAndrew Burgess2-4/+9
I noticed that in types equal we start with a cheap pointer equality check, then resolve typedefs, then do a series of (semi-)expensive checks, including checking type names, before, finally performing another pointer equality check. We should hoist the second pointer equality check to immediately after we have resolved typedefs. This would save performing the more expensive checks. This isn't going to give any noticable performance improvement, I just spotted this in passing and figured I might as well commit the fix. There should be no user visible changes after this commit. gdb/ChangeLog: * gdbtypes.c (types_equal): Move pointer equality check earlier in the function.
2021-04-07gdb: handle relative paths to DWO filesCaroline Tice5-0/+175
DWARF allows .dwo file paths to be relative rather than absolute. When they are relative, DWARF uses DW_AT_comp_dir to find the .dwo file. DW_AT_comp_dir can also be relative, making the entire search patch for the .dwo file relative. In this case, GDB currently searches relative to its current working directory, i.e. the directory from which the debugger was launched, but not relative to the directory containing the built binary. This cannot be right, as the compiler, when generating the relative paths, knows where it's building the binary but can have no idea where the debugger will be launched. The correct thing is to add the directory containing the binary to the search paths used for resolving relative locations of dwo files. That is what this patch does. gdb/ChangeLog: * dwarf2/read.c (try_open_dwop_file): Add path for the binary to the search paths used resolve relative location of .dwo file. gdb/testsuite/ChangeLog: * gdb.dwarf2/fission-relative-dwo.c: New file. * gdb.dwarf2/fission-relative-dwo.exp: New file.