aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2020-12-18Add address keyword to Value.format_stringHannes Domani6-1/+66
This makes it possible to disable the address in the result string: const char *str = "alpha"; (gdb) py print(gdb.parse_and_eval("str").format_string()) 0x404000 "alpha" (gdb) py print(gdb.parse_and_eval("str").format_string(address=False)) "alpha" gdb/ChangeLog: 2020-12-18 Hannes Domani <ssbssa@yahoo.de> * python/py-value.c (valpy_format_string): Implement address keyword. gdb/doc/ChangeLog: 2020-12-18 Hannes Domani <ssbssa@yahoo.de> * python.texi (Values From Inferior): Document the address keyword. gdb/testsuite/ChangeLog: 2020-12-18 Hannes Domani <ssbssa@yahoo.de> * gdb.python/py-format-string.exp: Add tests for address keyword.
2020-12-18Fix accessing a method's fields from PythonHannes Domani4-0/+12
Considering this example: struct C { int func() { return 1; } } c; int main() { return c.func(); } Accessing the fields of C::func, when requesting the function by its type, works: (gdb) py print(gdb.parse_and_eval('C::func').type.fields()[0].type) C * const But when trying to do the same via a class instance, it fails: (gdb) py print(gdb.parse_and_eval('c')['func'].type.fields()[0].type) Traceback (most recent call last): File "<string>", line 1, in <module> TypeError: Type is not a structure, union, enum, or function type. Error while executing Python code. The difference is that in the former the function type is TYPE_CODE_FUNC: (gdb) py print(gdb.parse_and_eval('C::func').type.code == gdb.TYPE_CODE_FUNC) True And in the latter the function type is TYPE_CODE_METHOD: (gdb) py print(gdb.parse_and_eval('c')['func'].type.code == gdb.TYPE_CODE_METHOD) True So this adds the functionality for TYPE_CODE_METHOD as well. gdb/ChangeLog: 2020-12-18 Hannes Domani <ssbssa@yahoo.de> * python/py-type.c (typy_get_composite): Add TYPE_CODE_METHOD. gdb/testsuite/ChangeLog: 2020-12-18 Hannes Domani <ssbssa@yahoo.de> * gdb.python/py-type.exp: Add tests for TYPE_CODE_METHOD.
2020-12-18gdb: define COFF file offsets with file_ptrJameson Nash2-15/+25
The arguments to these functions are file_ptr, so these declarations were accidentally implicitly down-casting them to signed int. This allows for reading files between 2 and 4 GB in size in my testing (I don't have a larger dll currently to test). These may not be natively supported by Windows, but can appear when using split-dwarf information. This solves a "can't get string table" error resulting from attempting to pass a negative offset to bfd_seek. I encountered this occuring while trying to use a debug file for libLLVM.dll, but searching online reveals at least one other person may have run into a similar problem with Firefox? https://sourceforge.net/p/mingw-w64/mailman/mingw-w64-public/thread/CA+cU71k2bU0azQxjy4-77ynQj1O+TKmgtaTKe59n7Bjub1y7Tg@mail.gmail.com/ With this patch, the debug file appears to load successfully and I can see debug information in gdb for the library. gdb/ChangeLog: * coffread.c (linetab_offset): Change type to file_ptr. (linetab_size): Likewise. (enter_linenos): Change parameter type to file_ptr. (init_lineno): Likewise. (init_stringtab): Likewise. (coff_symtab_read): Likewise. (coff_symfile_read): Change variable types to file_ptr. Change-Id: I6ae3bf31efc51c826734ade6731ea6b1c32129f3
2020-12-18Run fixed_points.exp with -fgnat-encodings=minimalTom Tromey2-61/+78
This changes the test case gdb.ada/fixed_points.exp to also be run with -fgnat-encodings=minimal. This change pointed out that the test case had a few incorrect expected outputs; these are fixed as well. Note that the Overprecise_Object test only uses the non-legacy output with GCC trunk. gdb/testsuite/ChangeLog 2020-12-18 Tom Tromey <tromey@adacore.com> * gdb.ada/fixed_points.exp: Also run with -fgnat-encodings=minimal. Update expected output.
2020-12-17Remove a use of n_spacesTom Tromey2-1/+5
While removing printfi_filtered, I found a spot that used n_spaces where the now-ordinary "%*s" approach would do. This patch makes this change. Tested on x86-64 Fedora 32. gdb/ChangeLog 2020-12-17 Tom Tromey <tromey@adacore.com> * printcmd.c (print_variable_and_value): Don't use n_spaces.
2020-12-17Remove printfi_filtered and fprintfi_filteredTom Tromey11-215/+212
After seeing Simon's patch, I thought maybe it was finally time to remove printfi_filtered and fprintfi_filtered, in favor of using the "%*s" approach to indenting. In this patch I took the straightforward approach of always adding a leading "%*s", even when the format already started with "%s", to avoid the trickier form of: printf ("%*s", -indent, string) Regression tested on x86-64 Fedora 32. Let me know what you think. gdb/ChangeLog 2020-12-17 Tom Tromey <tromey@adacore.com> * gdbtypes.c (print_args, dump_fn_fieldlists, print_cplus_stuff) (print_gnat_stuff, print_fixed_point_type_info) (recursive_dump_type): Update. * go32-nat.c (go32_sysinfo, display_descriptor): Update. * c-typeprint.c (c_type_print_base_struct_union) (c_type_print_base_1): Update. * rust-lang.c (rust_internal_print_type): Update. * f-typeprint.c (f_language::f_type_print_base): Update. * utils.h (fprintfi_filtered, printfi_filtered): Remove. * m2-typeprint.c (m2_record_fields): Update. * p-typeprint.c (pascal_type_print_base): Update. * compile/compile-loc2c.c (push, pushf, unary, binary) (do_compile_dwarf_expr_to_c): Update. * utils.c (fprintfi_filtered, printfi_filtered): Remove.
2020-12-17gdb/doc: fix "show check range" command nameSimon Marchi2-1/+7
gdb/doc/ChangeLog: PR gdb/27088 * gdb.texinfo (Range Checking): Fix "show check range" command name. Change-Id: I0248ef76d205ac49ed71b813aafe3e630c2ffc2e
2020-12-16Change parameters to language_defn::post_parserTom Tromey6-17/+29
In the expression rewrite, Ada type resolution will be done at parse time rather than in a post-parse pass. At this point, language_defn::post_parser will be removed. However, for this to work, the information available to post_parser must be made available during the actual parse. This patch refactors this code slightly to make this possible. In particular, "void_context_p" is passed to the parser_state constructor, and the parser state is then passed to the post_parser method. gdb/ChangeLog 2020-12-16 Tom Tromey <tom@tromey.com> * rust-exp.y (rust_lex_tests): Update. * parser-defs.h (parser_state): Add void_p parameter. <void_context_p>: New member. * parse.c (parse_exp_in_context): Update. * language.h (language_defn::post_parser): Remove void_context_p, completing, tracker parameters. Add parser state. * ada-lang.c (ada_language::post_parser): Update.
2020-12-16Change void_context_p to boolTom Tromey4-6/+14
This patch changes void_context_p to bool, as a prerequisite to the change to post_parser that I submitted here: https://sourceware.org/pipermail/gdb-patches/2020-December/174080.html Tested by rebuilding. Note that nothing in-tree passes true here. I don't know why this is, but there is a use of this internally in AdaCore's tree. I will try to submit that patch, if it is needed. (And if not, I will come back around and remove this.) gdb/ChangeLog 2020-12-16 Tom Tromey <tom@tromey.com> * parse.c (parse_exp_1, parse_expression_for_completion): Update. (parse_exp_in_context): Change void_context_p to bool. * language.h (struct language_defn) <post_parser>: Change void_context_p to bool. * ada-lang.c (class ada_language) <post_parser>: Update.
2020-12-16gdb/testsuite: make some tests in gdb.base enable non-stop using GDBFLAGSSimon Marchi5-13/+27
For the same reason as explained in commit 7cb2893dfab1 ("gdb/testsuite: gdb.mi/mi-nonstop-exit.exp: enable non-stop using GDBFLAGS"). Note that the use of set GDBFLAGS "$GDBFLAGS ..." instead of append GDBFLAGS "..." is intentional. "append" is silent when appending to a non-existent variable. So if this code if moved to a proc (as is the case already for step-sw-breakpoint-adjust-pc.exp) and we forget to add "global GDBFLAGS", the flag won't be added to the global GDBFLAGS, and we won't actually enable non-stop, and it might go unnoticed. Using the "set" version will turn into an error if we forget the "global". This makes these test work correctly with native-extended-gdbserver. Some of them were silently failing because we runto_main is silent when it fails. gdb/testsuite/ChangeLog: * gdb.base/async-shell.exp: Enable non-stop through GDBFLAGS. * gdb.base/continue-all-already-running.exp: Likewise. * gdb.base/moribund-step.exp: Likewise. * gdb.base/step-sw-breakpoint-adjust-pc.exp: Likewise. Change-Id: I19ef05d07a0ec4a9c9476af2ba6e1ea1159ee437
2020-12-16[gdb/testsuite] Fix prompt regexp in batch-preserve-term-settings.expTom de Vries2-1/+5
On openSUSE Leap 15.2, when running test-case gdb.base/batch-preserve-term-settings.exp I get: ... spawn /bin/sh^M PS1="gdb-subshell$ "^M sh-4.4$ PS1="gdb-subshell$ "^M gdb-subshell$ PASS: gdb.base/batch-preserve-term-settings.exp: batch run: \ spawn shell ... but on Ubuntu 18.04.5, I get instead: ... spawn /bin/sh^M PS1="gdb-subshell$ "^M $ gdb-subshell$ FAIL: gdb.base/batch-preserve-term-settings.exp: batch run: \ spawn shell (timeout) ... Fix this by making the regexp recognize the second pattern as well. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-16 Tom de Vries <tdevries@suse.de> * gdb.base/batch-preserve-term-settings.exp:
2020-12-16[gdb] Print progress for debuginfodMartin Liska2-10/+21
Prints progress like: Downloading 4.89 MB separate debug info for /usr/lib64/libgcrypt.so.20. Downloading 1.10 MB separate debug info for /usr/lib64/liblzma.so.5. Downloading 1.31 MB separate debug info for /usr/lib64/liblz4.so.1. Downloading 0.96 MB separate debug info for /usr/lib64/libsmime3.so. [### ] Tested on x86_64-linux. ChangeLog: 2020-12-16 Martin Liska <mliska@suse.cz> Tom de Vries <tdevries@suse.de> * gdb/debuginfod-support.c (struct user_data): Remove has_printed field. Add meter field. (progressfn): Print progress using meter.
2020-12-16[gdb/cli] Add a progress meterTom Tromey7-0/+224
Add a progress meter. It's not used anywhere yet. gdb/ChangeLog: 2020-12-16 Tom Tromey <tom@tromey.com> Tom Tromey <tromey@redhat.com> Tom de Vries <tdevries@suse.de> * utils.h (get_chars_per_line): Declare. * utils.c (get_chars_per_line): New function. (fputs_maybe_filtered): Handle '\r'. * ui-out.h (ui_out::progress_meter): New class. (ui_out::progress, ui_out::do_progress_start) (ui_out::do_progress_notify, ui_out::do_progress_end): New methods. * ui-out.c (do_progress_end) (make_cleanup_ui_out_progress_begin_end, ui_out_progress): New functions. * mi/mi-out.h (mi_ui_out::do_progress_start) (mi_ui_out::do_progress_notify, mi_ui_out::do_progress_end): New methods. * cli-out.h (struct cli_ui_out) <do_progress_start, do_progress_notify, do_progress_end>: New methods. <enum meter_stat, struct cli_progress_info>: New. <m_meters>: New member. * cli-out.c (cli_ui_out::do_progress_start) (cli_ui_out::do_progress_notify, cli_ui_out::do_progress_end): New methods.
2020-12-16[gdb/testsuite] Fix shlib compilation with target board unix/-pie/-fPIETom de Vries2-1/+43
When running test-case gdb.base/info-shared.exp with target board unix/-pie/-fPIE, we run into: ... spawn -ignore SIGHUP gcc -fno-stack-protector \ outputs/gdb.base/info-shared/info-shared-solib1.c.o \ -fdiagnostics-color=never -fPIC -shared -Wl,-soname,info-shared-solib1.so \ -lm -fPIE -pie -o outputs/gdb.base/info-shared/info-shared-solib1.so^M ld: Scrt1.o: in function `_start':^M start.S:104: undefined reference to `main'^M collect2: error: ld returned 1 exit status^M compiler exited with status 1 ... The intention of the -pie/-fPIE flags is to build and test PIE executables on platforms where that is not the default. However, the flags clash with the flags required to build shared libraries. Fix this by filtering out PIE-related flags out of the multilib_flags settings in compile_shared_lib. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-16 Tom de Vries <tdevries@suse.de> * lib/gdb.exp (gdb_compile_shlib_1): Factor out of ... (gdb_compile_shlib): ... here. Filter out PIE-related flags.
2020-12-16Record FPSR for SIMD/FP data instructionsLuis Machado2-1/+12
I noticed this failure in gdb.reverse/reverse-insn.exp: FAIL: gdb.reverse/insn-reverse.exp: adv_simd_vect_shift: compare registers on insn 0:fcvtzs s0, s0, #1 Turns out we're not recording changes to the FPSR. The SIMD/FP data instructions may set bits in the FPSR, so it needs to be recorded for proper reverse operations. gdb/ChangeLog: 2020-12-16 Luis Machado <luis.machado@linaro.org> * aarch64-tdep.c (aarch64_record_data_proc_simd_fp): Record FPSR.
2020-12-16Fix TBI handling for watchpointsLuis Machado5-12/+43
When inserting hw watchpoints, we take care of masking off the top byte of the address (and sign-extending it if needed). This guarantees we won't pass tagged addresses to the kernel via ptrace. However, from the kernel documentation on tagged pointers... "Non-zero tags are not preserved when delivering signals. This means that signal handlers in applications making use of tags cannot rely on the tag information for user virtual addresses being maintained for fields inside siginfo_t. One exception to this rule is for signals raised in response to watchpoint debug exceptions, where the tag information will be preserved." So the stopped data address after a hw watchpoint hit can be potentially tagged, and we don't handle this in GDB at the moment. This results in GDB missing a hw watchpoint hit and attempting to step over an unsteppable hw watchpoint, causing it to spin endlessly. The following patch fixes this by adjusting the stopped data address and adds some tests to expose the problem. gdb/ChangeLog: 2020-12-16 Luis Machado <luis.machado@linaro.org> * aarch64-linux-nat.c (aarch64_linux_nat_target::stopped_data_address): Handle the TBI. gdbserver/ChangeLog: 2020-12-16 Luis Machado <luis.machado@linaro.org> * linux-aarch64-low.cc (address_significant): New function. (aarch64_target::low_stopped_data_address): Handle the TBI. gdb/testsuite/ChangeLog: 2020-12-16 Luis Machado <luis.machado@linaro.org> * gdb.arch/aarch64-tagged-pointer.c (main): Add a few more pointer-based memory accesses. * gdb.arch/aarch64-tagged-pointer.exp: Exercise additional hw watchpoint cases.
2020-12-15gdb: multi-line support for "document" commandRae Kim5-7/+89
"document" command executed in python, gdb.execute("document <comname>\n...\nend\n"), will wait for user input. Python extension stops working from that point. multi-line suport was introduced in commit 56bcdbea2. But "document" support seem to be implemented. gdb/ChangeLog: 2020-12-02 Rae Kim <rae.kim@gmail.com> * cli/cli-script.c (do_document_command): Rename from document_command. Handle multi-line input. (multi_line_command_p): Handle document_control. (build_command_line): Likewise. (execute_control_command_1): Likewise. (process_next_line): Likewise. (document_command): Call do_document_command. * cli/cli-script.h (enum command_control_type): Add document_control. gdb/testsuite/ChangeLog: 2020-12-02 Rae Kim <rae.kim@gmail.com> * gdb.base/document.exp: New test. Change-Id: Ice262b980c05051de4c106af9f3fde5b2a6df6fe
2020-12-15Add expected type parameter to evaluate_expressionTom Tromey6-15/+26
While working on the expression rewrite, I found a few spots that called the internal functions of the expression evaluator, just to pass in an expected type. This patch adds a parameter to evaluate_expression so that these functions can avoid this dependency. Regression tested on x86-64 Fedora 28. gdb/ChangeLog 2020-12-15 Tom Tromey <tom@tromey.com> * stap-probe.c (stap_probe::evaluate_argument): Use evaluate_expression. * dtrace-probe.c (dtrace_probe::evaluate_argument): Use evaluate_expression. * value.h (evaluate_expression): Add expect_type parameter. * objc-lang.c (print_object_command): Call evaluate_expression. * eval.c (evaluate_expression): Add expect_type parameter.
2020-12-15Introduce expression::first_opcodeTom Tromey9-11/+31
This adds a new helper method, expression::first_opcode, that extracts the outermost opcode of an expression. This simplifies some patches in the expression rewrite series. Note that this patch requires the earlier patch to avoid manual dissection of OP_TYPE operations. 2020-12-15 Tom Tromey <tom@tromey.com> * varobj.c (varobj_create): Use first_opcode. * value.c (init_if_undefined_command): Use first_opcode. * typeprint.c (whatis_exp): Use first_opcode. * tracepoint.c (validate_actionline): Use first_opcode. (encode_actions_1): Use first_opcode. * stack.c (return_command): Use first_opcode. * expression.h (struct expression) <first_opcode>: New method. * eval.c (parse_and_eval_type): Use first_opcode. * dtrace-probe.c (dtrace_process_dof_probe): Use first_opcode.
2020-12-15Clean up arguments to evaluate_subexp_do_callTom Tromey4-19/+28
I noticed hat evaluate_subexp_do_call takes an array of arguments and a count -- but, unlike the usual convention, the count does not include the first element. This patch changes this function to match call_function_by_hand -- passing the callee separately, and using an array_view for the arguments. This makes it simpler to understand. Regression tested on x86-64 Fedora 28. gdb/ChangeLog 2020-12-15 Tom Tromey <tom@tromey.com> * f-lang.c (evaluate_subexp_f): Update. * expression.h (evaluate_subexp_do_call): Update. * eval.c (evaluate_subexp_do_call): Add callee parameter. Replace nargs, argvec with array_view. (evaluate_funcall): Update.
2020-12-15C++-ify Ada component interval handlingTom Tromey2-74/+43
The Ada component interval handling code, used for aggregate assignments, does a pre-pass over the sub-expressions so that it can size an array. For my expression rewrite, it was handy to C++-ify this. gdb/ChangeLog 2020-12-15 Tom Tromey <tom@tromey.com> * ada-lang.c (num_component_specs): Remove. (assign_aggregate): Update. (aggregate_assign_positional, aggregate_assign_from_choices) (aggregate_assign_others, add_component_interval): Change arguments.
2020-12-15Highlight deprecated commands using title styleTom Tromey4-7/+32
After Andrew's latest patch, I noticed that the deprecation warnings could use the (so-called) title style when printing command names. This patch implements this idea. gdb/ChangeLog 2020-12-15 Tom Tromey <tromey@adacore.com> * cli/cli-decode.c (deprecated_cmd_warning): Use title style for command names. gdb/testsuite/ChangeLog 2020-12-15 Tom Tromey <tromey@adacore.com> * gdb.base/style.exp: Add deprecation tests.
2020-12-15[gdb/testsuite] Handle PS1 quirk in gdb.base/multi-line-starts-subshell.expTom de Vries1-3/+3
On SLE-11, I run into: ... (gdb) if 1^M >shell HOME=/dev/null PS1="gdb-subshell$ " /bin/sh^M >end^M hostname:/dir> FAIL: gdb.base/multi-line-starts-subshell.exp: \ spawn subshell from multi-line (timeout) ... The problem is that the PS1 setting has no effect, due to a bug on older openSUSE/SLE version. The mechanism there is: - /etc/profile sets ENV=/etc/bash.bashrc - /bin/sh is started - /bin/sh executes ENV, in other words /etc/bash.bashrc - during the execution of /etc/bash.bashrc, PS1 is set unconditionally Fix this by setting PS1 after spawning the subshell. Tested on x86_64-linux. 2020-12-15 Tom de Vries <tdevries@suse.de> PR testsuite/26952 * gdb.base/multi-line-starts-subshell.exp: Set PS1 after spawning shell.
2020-12-14gdb/testsuite: fix typo in gdb_test_multiple docSimon Marchi2-1/+5
gdb/testsuite/ChangeLog: * lib/gdb.exp (gdb_test_multiple): Fix typo in doc. Change-Id: Ieb188b3382395ce951bfba5a5f25aaea0f89ebf9
2020-12-14Add form used for SPECIAL_expr as comment in testsuite Dwarf AssemblerMark Wielaard2-1/+16
Replace the "SPECIAL_expr" comment with either "DW_FORM_block" or "DW_FORM_exprloc" in the abbrev. gdb/testsuite/ChangeLog: * lib/dwarf.exp (Dwarf::_handle_attribute): Handle SPECIAL_expr specially, set attr_form_comment to the actual FORM string used.
2020-12-14Use DW_FORM_exprloc in testsuite Dwarf Assembler for DWARF version 4+.Mark Wielaard2-5/+16
Since DWARF version 4 expressions are represented by DW_FORM_exprloc instead of a block form. Support this in the testsuite Dwarf Assembler by setting the SPECIAL_expr form once we know the CU version. This doesn't change any testsuite results, it just makes the produced DWARF valid. gdb also accepts expressions in block form for DWARF version 4 and above, but this is technically incorrect. gdb/testsuite/ChangeLog: * lib/dwarf.exp (Dwarf::_read_constants): Don't set _constants(SPECIAL_expr) here, but set it... (Dwarf::cu): ...here based on _cu_version.
2020-12-14[gdb/testsuite] Don't pass -fPIC to gdb_compile_shlibTom de Vries12-23/+38
When running test-case gdb.base/info-shared.exp, I see in gdb.log: ... Executing on host: \ gcc ... -fPIC -fpic -c -o info-shared-solib1.c.o info-shared-solib1.c ... The -fPIC comes from the test-case: ... if { [gdb_compile_shlib $srcfile_lib1 $binfile_lib1 \ [list additional_flags=-fPIC]] != "" } { ... but the -fpic, which overrides the -fPIC comes from gdb_compile_shlib. The proc gdb_compile_shlib adds the -fpic or similar dependent on platform and compiler. However, in some cases it doesn't add anything, which is probably why all those test-case pass -fPIC. Fix this by removing -fPIC from all the calls to gdb_compile_shlib, and ensuring that gdb_compile_shlib takes care of adding it, if required. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-14 Tom de Vries <tdevries@suse.de> * lib/gdb.exp (gdb_compile_shlib): Make sure it's not necessary to pass -fPIC. * gdb.ada/catch_ex_std.exp: Don't pass -fPIC to gdb_compile_shlib. * gdb.base/break-probes.exp: Same. * gdb.base/ctxobj.exp: Same. * gdb.base/dso2dso.exp: Same. * gdb.base/global-var-nested-by-dso.exp: Same. * gdb.base/info-shared.exp: Same. * gdb.base/jit-reader-simple.exp: Same. * gdb.base/print-file-var.exp: Same. * gdb.base/skip-solib.exp: Same. * gdb.btrace/dlopen.exp: Same.
2020-12-14Do not manually dissect OP_TYPE operationsTom Tromey3-29/+15
Some code in GDB will examine the structure of an expression to see if it starts with OP_TYPE, and then proceed to extract the type by hand. There is no need to do this dissection manually. evaluate_type does the same thing via an "allowed" API. This patch changes such code to use evaluate_type. In two cases this simplifies the code. Regression tested on x86-64 Fedora 28. gdb/ChangeLog 2020-12-14 Tom Tromey <tom@tromey.com> * dtrace-probe.c (dtrace_process_dof_probe): Use value_type. * typeprint.c (whatis_exp): Always use evaluate_type. (maintenance_print_type): Likewise. Simplify.
2020-12-14[gdb/testsuite] Handle missing xz in gdb.base/gnu-debugdata.expTom de Vries2-1/+10
When running test-case gdb.base/gnu-debugdata.exp on SLE-11, I run into: ... FAIL: gdb.base/gnu-debugdata.exp: xz ... The fact that xz is not installed does not mean there's a fail, merely that the test is unsupported. Fix this by detecting the "spawn failed" reply in run_on_host and issuing UNSUPPORTED instead. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-14 Tom de Vries <tdevries@suse.de> PR testsuite/26963 * lib/gdb.exp (run_on_host): Declare test unsupported if spawn fails.
2020-12-14[gdb/testsuite] Handle no glibc debuginfo in gdb.base/solib-corrupted.expTom de Vries2-1/+17
When running test-case gdb.base/solib-corrupted.exp on SLE-11, I get: ... (gdb) PASS: gdb.base/solib-corrupted.exp: normal list p/x _r_debug->r_map->l_next = _r_debug->r_map^M '_r_debug' has unknown type; cast it to its declared type^M (gdb) FAIL: gdb.base/solib-corrupted.exp: make solibs looping ... The reason that _r_debug has unknown type is that glibc debuginfo is not installed. The test-case attempts to detect this but doesn't handle this particular error string. Fix this by adding the "unknown type" line to the regexp detecting missing glibc debuginfo. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-14 Tom de Vries <tdevries@suse.de> PR testsuite/26962 * gdb.base/solib-corrupted.exp: Handle "'_r_debug' has unknown type; cast it to its declared type".
2020-12-14[gdb/testsuite] Handle shell prompt in batch-preserve-term-settings.expTom de Vries2-3/+12
On SLE-11, I run into: ... FAIL: gdb.base/batch-preserve-term-settings.exp: batch run: spawn shell \ (timeout) ... The problem is that the shell prompt has PS1="\h:\w> ", but the test expects a shell prompt ending in a space preceded by either '$' or '#': ... set shell_prompt_re "\[$#\] " ... We could easily fix this by adding '>' to shell_prompt_re, but this wouldn't work for other PS1 setting. Fix this instead by setting the shell prompt to "gdb-subshell$ " (as in gdb.base/multi-line-starts-subshell.exp). Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-14 Tom de Vries <tdevries@suse.de> PR testsuite/26951 * gdb.base/batch-preserve-term-settings.exp: Use "gdb-subshell$ " as shell prompt.
2020-12-14Handle block-local names for AdaTom Tromey6-25/+92
GNAT can generate a mangled name with "B_N" (where N is a number) in the middle, like "hello__B_1__fourth.0". This is used for names local to a block. Multiple levels of block-local name can also occur, a possibility that was neglected by v1 of this patch. This patch changes gdb to handle these names. The wild name matcher is updated a straightforward way. The full matcher is rewritten. The hash function is updated to ensure that this works. This version does not seem to have the performance problems that affected v1. In particular, the previously-slow "bt" problem has been fixed. gdb/ChangeLog 2020-12-14 Tom Tromey <tromey@adacore.com> * dictionary.c (language_defn::search_name_hash): Ignore "B". * ada-lang.c (advance_wild_match): Ignore "B". (full_match): Remove. (do_full_match): Rewrite. gdb/testsuite/ChangeLog 2020-12-14 Tom Tromey <tromey@adacore.com> * gdb.ada/nested.exp: Add new tests. * gdb.ada/nested/hello.adb (Fourth, Fifth): New procedures.
2020-12-14Use exact match in get_var_valueTom Tromey2-3/+9
get_var_value is only used when an exact match is needed. This changes this function to ensure this sort of matching is done. gdb/ChangeLog 2020-12-14 Tom Tromey <tromey@adacore.com> * ada-lang.c (get_var_value): Only consider exact matches.
2020-12-14Be more careful when rewriting thick pointer array typeTom Tromey4-13/+162
To handle thick pointers with -fgnat-encodings=minimal, gdb will rewrite the underlying array type to remove the bounds. However, if the same DWARF type is used both for a thick pointer and for an ordinary array, this will have the side effect of removing the bounds from the array. This breaks the printing of objects of this type. This patch fixes the problem by copying the array type, its range, and its bounds. gdb/ChangeLog 2020-12-14 Tom Tromey <tromey@adacore.com> * dwarf2/read.c (rewrite_array_type): New function. (quirk_ada_thick_pointer_struct): Use rewrite_array_type. gdb/testsuite/ChangeLog 2020-12-14 Tom Tromey <tromey@adacore.com> * gdb.dwarf2/ada-thick-pointer.exp: New file.
2020-12-14Handle fixed-point division by zeroTom Tromey4-0/+13
fixed_point_binop did not account for division by zero. This would lead to gdb getting SIGFPE and subsequently cause some test cases to hang. gdb/ChangeLog 2020-12-14 Tom Tromey <tromey@adacore.com> * valarith.c (fixed_point_binop): Call error on division by zero. gdb/testsuite/ChangeLog 2020-12-14 Tom Tromey <tromey@adacore.com> * gdb.dwarf2/dw2-fixed-point.exp: Add test for division by zero.
2020-12-13Constify parse_and_eval_typeTom Tromey4-3/+9
I noticed that the argumen to parse_and_eval_type could be "const". This patch implements this change. I wonder if this could be removed. It's only called via check_stub_method_group, which seems questionable to me. However, I didn't look into doing this. gdb/ChangeLog 2020-12-13 Tom Tromey <tom@tromey.com> * gdbtypes.c (safe_parse_type): Make argument const. * value.h (parse_and_eval_type): Make argument const. * eval.c (parse_and_eval_type): Make argument const.
2020-12-13[gdb/testsuite] Fix gdb.base/endianity.exp with gcc-4.8Tom de Vries2-4/+13
When running test-case gdb.base/endianity.exp using gcc-4.8, we get: ... (gdb) x/x &o.v^M 0x7fffffffd120: 0x00000004^M (gdb) XFAIL: gdb.base/endianity.exp: x/x &o.v x/xh &o.w^M 0x7fffffffd124: 0x0003^M (gdb) FAIL: gdb.base/endianity.exp: x/xh &o.w ... The gcc 4.8 compiler does not support the scalar_storage_order attribute, so the testcase is compiled without that attribute, and the expected results are different. Fix this by rather than xfailing, skipping the tests if the compiler does not support the scalar_storage_order attribute. Tested on x86_64-linux, with gcc-4.8, gcc-7, and clang-10. gdb/testsuite/ChangeLog: 2020-12-13 Tom de Vries <tdevries@suse.de> PR testsuite/26953 * gdb.base/endianity.exp: Skip tests requiring scalar_storage_order attribute support if compiler doesn't support it.
2020-12-13[gdb/testsuite] Handle ada in gdb_compile_shlibTom de Vries3-23/+45
The single test-case in the testsuite that creates an ada shared library is gdb.ada/catch_ex_std.exp. The test-case does use gdb_compile_shlib, but with a few tweaks that make sure things are properly handled for ada. Move the ada-specific code to gdb_compile_shlib, such that gdb_compile_sh can be used for ada shared libs without tweaks. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-13 Tom de Vries <tdevries@suse.de> * lib/gdb.exp (gdb_compile_shlib): Handle ada. * gdb.ada/catch_ex_std.exp: Use gdb_compile_shlib to compile from source to shared lib. Add ada to options.
2020-12-13[gdb/testsuite] Avoid gnatbind/gnatlink in gdb.ada/catch_ex_std.expTom de Vries2-48/+28
There's a single test-case in the testsuite that explicitly calls gnatbind and gnatlink: gdb.ada/catch_ex_std.exp. Instead, use gnatmake and pass specific gnatbind and gnatlink options using gnatmake passthrough options -bargs and -largs. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-13 Tom de Vries <tdevries@suse.de> * gdb.ada/catch_ex_std.exp: Use gnatmake -bargs and -largs instead of calling gnatbind and gnatlink.
2020-12-13gdb: new command 'maint flush dcache'Andrew Burgess8-0/+143
Add a new command to flush the dcache. gdb/ChangeLog: * NEWS: Mention new commands. * target-dcache.c: Add 'cli/cli-cmds.h' include. (maint_flush_dcache_command): New function. (_initialize_target_dcache): Create new 'maint flush dcache' command. gdb/doc/ChangeLog: * gdb.texinfo (Caching Target Data): Document 'maint flush dcache'. gdb/testsuite/ChangeLog: * gdb.base/dcache-flush.c: New file. * gdb.base/dcache-flush.exp: New file.
2020-12-13gdb: introduce new 'maint flush ' prefix commandAndrew Burgess17-17/+96
We currently have two flushing commands 'flushregs' and 'maint flush-symbol-cache'. I'm planning to add at least one more so I thought it might be nice if we bundled these together into one place. And so I created the 'maint flush ' command prefix. Currently there are two commands: (gdb) maint flush symbol-cache (gdb) maint flush register-cache Unfortunately, even though both of the existing flush commands are maintenance commands, I don't know how keen we about deleting existing commands for fear of breaking things in the wild. So, both of the existing flush commands 'maint flush-symbol-cache' and 'flushregs' are still around as deprecated aliases to the new commands. I've updated the testsuite to use the new command syntax, and updated the documentation too. gdb/ChangeLog: * NEWS: Mention new commands, and that the old commands are now deprecated. * cli/cli-cmds.c (maintenanceflushlist): Define. * cli/cli-cmds.h (maintenanceflushlist): Declare. * maint.c (_initialize_maint_cmds): Initialise maintenanceflushlist. * regcache.c: Add 'cli/cli-cmds.h' include. (reg_flush_command): Add header comment. (_initialize_regcache): Create new 'maint flush register-cache' command, make 'flushregs' an alias. * symtab.c: Add 'cli/cli-cmds.h' include. (_initialize_symtab): Create new 'maint flush symbol-cache' command, make old command an alias. gdb/doc/ChangeLog: * gdb.texinfo (Symbols): Document 'maint flush symbol-cache'. (Maintenance Commands): Document 'maint flush register-cache'. gdb/testsuite/ChangeLog: * gdb.base/c-linkage-name.exp: Update to use new 'maint flush ...' commands. * gdb.base/killed-outside.exp: Likewise. * gdb.opt/inline-bt.exp: Likewise. * gdb.perf/gmonster-null-lookup.py: Likewise. * gdb.perf/gmonster-print-cerr.py: Likewise. * gdb.perf/gmonster-ptype-string.py: Likewise. * gdb.python/py-unwind.exp: Likewise.
2020-12-11gdb: improve the warning given for deprecated aliases with a prefixAndrew Burgess4-43/+59
Consider this GDB session: (gdb) define set xxx_yyy Type commands for definition of "set xxx_yyy". End with a line saying just "end". >echo in set xxx_yyy command\n >end (gdb) alias set qqq_aaa=set xxx_yyy (gdb) maintenance deprecate set qqq_aaa (gdb) set qqq_aaa Warning: 'qqq_aaa', an alias for the command 'xxx_yyy' is deprecated. No alternative known. in set xxx_yyy command (gdb) Notice the warning mentions 'qqq_aaa' and 'xxx_yyy', I consider this to be wrong. I think the proper warning should read: (gdb) set qqq_aaa Warning: 'set qqq_aaa', an alias for the command 'set xxx_yyy', is deprecated. No alternative known. With the 'set' prefixes added and a comma before the final 'is deprecated'. That is what this patch does. The expected results are updated as needed. gdb/ChangeLog: * cli/cli-decode.c (deprecated_cmd_warning): Ignore the prefix result from lookup_cmd_composition_1, use the prefixes from both the command and the alias instead. (lookup_cmd_composition_1): Initial prefix command is the based on the search list being passed in. Simplify the logic for tracking the prefix command. Replace a use of alloca with a local std::string. gdb/testsuite/ChangeLog: * gdb.base/commands.exp: Update expected results.
2020-12-11gdb: make deprecated_cmd_warning i18n friendlyAndrew Burgess2-40/+45
Rewrite deprecated_cmd_warning to be i18n friendly. While I'm going through the function I also cleaned up some whitespace issues, replaced uses of NULL with nullptr, and moved some comments to avoid having to add { ... }. Though the message being printed has a 'Warning: ' prefix I could have changed from using printf_filtered to use warning, however, I haven't done that in this commit as that would change what GDB outputs and I wanted this commit NOT to change the output. There should be no user visible changes after this commit. gdb/ChangeLog: * cli/cli-decode.c (deprecated_cmd_warning): Use nullptr instead of NULL. Don't print message piece by piece, but sentence at a time to allow internationalisation. Some whitespace cleanup.
2020-12-11gdb: give deprecated command warning for aliases with a prefixAndrew Burgess7-15/+90
I noticed that deprecated aliases that have a prefix don't give a deprecated command warning. For example looking in mi/mi-main.c we see this: c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &setlist); deprecate_cmd (c, "set mi-async"); c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &showlist); deprecate_cmd (c, "show mi-async"); So both 'set target-async' and 'show target-async' are deprecated and should be giving a warning, however, in use we see no warning given. This is a consequence of how the code that should give this warning (deprecated_cmd_warning) performs a second command lookup in order to distinguish between aliases and real commands, and that the code that calls this (lookup_cmd_1) strips off prefix commands as it calls itself recursively. As a result when we are considering an alias like 'set target-async' we first enter lookup_cmd_1 with text = "set target-async", we spot the 'set' command prefix and then recursively call lookup_cmd_1 with text = "target-async". We spot that 'target-async' is a known alias but that it is deprecated, and so call deprecated_cmd_warning passing in the value of text, which remember is now "target-async". In deprecated_cmd_warning we again perform a command lookup starting from the top-level cmdlist, but now we're trying to find just "target-async", this fails (as this command requires the 'set' prefix, and so no warning is given. I resolved this issue by passing a command list to the function deprecated_cmd_warning, this is the list in which the command can be found. A new test is added to cover this case. However, there is an additional problem which will be addressed in a subsequent patch. Consider this GDB session: (gdb) define set xxx_yyy Type commands for definition of "set xxx_yyy". End with a line saying just "end". >echo in set xxx_yyy command\n >end (gdb) alias set qqq_aaa=set xxx_yyy (gdb) maintenance deprecate set qqq_aaa (gdb) set qqq_aaa Warning: 'qqq_aaa', an alias for the command 'xxx_yyy' is deprecated. No alternative known. in set xxx_yyy command (gdb) Notice the warning mentions 'qqq_aaa' and 'xxx_yyy', I consider this to be wrong. I think the proper warning should read: (gdb) set qqq_aaa Warning: 'set qqq_aaa', an alias for the command 'set xxx_yyy' is deprecated. No alternative known. With the 'set' prefixes added. A later patch will resolve this issue. gdb/ChangeLog: PR cli/15104 * cli/cli-decode.c (lookup_cmd_1): Pass command list to deprecated_cmd_warning. (deprecated_cmd_warning): Take extra parameter, call lookup_cmd_composition_1 and pass new parameter through. (lookup_cmd_composition_1): New function, takes implementation of lookup_cmd_composition but with extra parameter. (lookup_cmd_composition): Now calls lookup_cmd_composition_1 passing in cmdlist. * command.h (deprecated_cmd_warning): Add extra parameter to declaration. * top.c (execute_command): Pass cmdlist to deprecated_cmd_warning. gdb/testsuite/ChangeLog: PR cli/15104 * gdb.base/commands.exp: Add additional tests. * gdb.base/completion.exp: Add additional tests.
2020-12-11gdb: don't warn about deprecated aliases during tab completionAndrew Burgess6-51/+74
Consider this gdb session, where on line #3 tab completion is used: (gdb) alias xxx_yyy_zzz=break (gdb) maint deprecate xxx_yyy_zzz (gdb) xxx_yyy_<TAB> The third line then updates to look like this: (gdb) xxx_yyy_Warning: 'xxx_yyy_zzz', an alias for the command 'break' is deprecated. No alternative known. zzz What's happened is during tab completion the alias has been resolved to the actual command being aliased, and at this stage the warning is issued. Clearly this is not what we want during tab completion. In this commit I add a new parameter to the lookup function, a boolean that indicates if the lookup is being done as part of completion. This flag is used to suppress the warning. Now we get the expected behaviour, the alias completes without any warning, but the warning is still given once the user executes the alias. gdb/ChangeLog: * cli/cli-decode.c (lookup_cmd_1): Move header comment into command.h, add extra parameter, and use this to guard giving a warning. * command.h (lookup_cmd_1): Add comment from cli/cli-decode.c, include argument names in declaration, add new argument. * completer.c (complete_line_internal_1): Remove unneeded brackets, pass extra argument to lookup_cmd_1. gdb/testsuite/ChangeLog: * gdb.base/completion.exp: Add additional tests.
2020-12-11gdb: make debug_infrun a boolSimon Marchi3-9/+15
gdb/ChangeLog: * infrun.h (debug_infrun): Make a bool. * infrun.c (debug_infrun): Make a bool. (_initialize_infrun): Use add_setshow_boolean_cmd to define "set debug infrun". Change-Id: If934106a6d3f879b93d265855eb705b1d606339a
2020-12-11gdb: factor out debug_prefixed_printf_condSimon Marchi5-30/+16
The same pattern happens often to define a "debug_printf" macro: #define displaced_debug_printf(fmt, ...) \ do \ { \ if (debug_displaced) \ debug_prefixed_printf ("displaced", __func__, fmt, ##__VA_ARGS__); \ } \ while (0) Move this pattern behind a helper macro, debug_prefixed_printf_cond and update the existing macros to use it. gdb/ChangeLog: * displaced-stepping.h (displaced_debug_printf): Use debug_prefixed_printf_cond. * dwarf2/read.c (dwarf_read_debug_printf): Likewise. (dwarf_read_debug_printf_v): Likewise. * infrun.h (infrun_debug_printf): Likewise. * linux-nat.c (linux_nat_debug_printf): Likewise. gdbsupport/ChangeLog: * common-debug.h (debug_prefixed_printf_cond): New. * event-loop.h (event_loop_debug_printf): Use debug_prefixed_printf_cond. Change-Id: I1ff48b98b8d1cc405d1c7e8da8ceadf4e3a17f99
2020-12-11[gdb/testsuite] Update gdb.arch/i386-mpx-call.exp for -m32Tom de Vries2-3/+35
When running test-case gdb.arch/i386-mpx-call.exp with target board unix/-m32, we run into: ... (gdb) continue^M Continuing.^M (gdb) FAIL: gdb.arch/i386-mpx-call.exp: upper_bnd0: continue to a bnd violation ... Let's look first for reference at -m64, where the test passes. The test-case uses -mmpx -fcheck-pointer-bounds to generate pointer checks in the exec. Effectively, -fcheck-pointer-bounds modifies the calling ABI: a call passes pointer bounds as well as arguments. The call to upper (with four pointer arguments and an int argument, passed in 5 registers) is modified like this: ... lea -0xa0(%rbp),%rcx lea -0x80(%rbp),%rdx lea -0x60(%rbp),%rsi lea -0x40(%rbp),%rax mov $0x0,%r8d + bndmov -0x110(%rbp),%bnd3 + bndmov -0x100(%rbp),%bnd2 + bndmov -0xf0(%rbp),%bnd1 + bndmov -0xe0(%rbp),%bnd0 mov %rax,%rdi - callq <upper> + bnd callq <upper> ... passsing the four pointer bounds in bounds registers BND0-3. The top-level mechanism of the test is as follows: - run the exec to after all mallocs are done, such that all pointer variables are valid - do inferior calls, similar to those present in the program The inferior call mechanism doesn't differentiate between a call to a function compiled with -fcheck-pointer-bounds, and one without. It merely resets the bound registers to all-allowed state (see amd64_push_dummy_call), to make sure the checks don't trigger during the inferior call. [ This is the same as what happens when executing a call without bnd prefix when the BNDPRESERVE bit of the BNDCFG register is set to 0, a provision for calling an instrumented function using a non-instrumented call. ] First, two inferior calls are done (default_run and verify_default_values) with the bound registers unmodified by the test. So, the memory accesses are performed with the bounds registers set by amd64_push_dummy_call to all-allowed, and the bounds checks do not trigger. Then we try to do an inferior call with modified bounds registers, set to none-allowed. In order to do that, we set a breakpoint at *upper before doing the inferior call. Once we hit the breakpoint during the inferior call, the bounds registers are set to none-allowed, and we continue expecting to run into an triggered bounds check, which takes the shape of a sigsegv. Back to -m32. Here, the pointer arguments are passed in memory rather than registers, so with -fcheck-pointer-bounds, the pointer bounds are placed in the Bounds Table using bndstx: ... movl $0x0,0x10(%eax) lea -0x70(%ebp),%edx mov %edx,0xc(%eax) lea -0x5c(%ebp),%edx mov %edx,0x8(%eax) lea -0x48(%ebp),%edx mov %edx,0x4(%eax) lea -0x34(%ebp),%edx mov %edx,(%eax) lea 0xc(%eax),%edx mov 0xc(%eax),%ecx bndmov -0xa8(%ebp),%bnd1 bndstx %bnd1,(%edx,%ecx,1) lea 0x8(%eax),%edx mov 0x8(%eax),%ecx bndmov -0xa0(%ebp),%bnd3 bndstx %bnd3,(%edx,%ecx,1) lea 0x4(%eax),%edx mov 0x4(%eax),%ecx bndmov -0x98(%ebp),%bnd1 bndstx %bnd1,(%edx,%ecx,1) mov (%eax),%edx bndmov -0x90(%ebp),%bnd3 bndstx %bnd3,(%eax,%edx,1) bnd call 804893f <upper> ... Again, the bounds registers are reset at the start of the inferior call by amd64_push_dummy_call, and modified by the test-case, but neither has any effect. The code in upper reads the pointer bounds from the Bounds Table, not from the bounds registers. Note that for a test.c with an out-of-bounds access: ... $ cat test.c void foo (int *a) { volatile int v = a[1]; } int main (void) { int a; foo (&a); return 0; } $ gcc test.c -mmpx -fcheck-pointer-bounds -g -m32 $ ./a.out Saw a #BR! status 1 at 0x804848d ... and inferior call foo (&a) right before "bnd call foo" (at the point that the bounds for a are setup in the bounds table) doesn't trigger a bounds violation: ... (gdb) call foo (&a) (gdb) ... This is because the bounds table doesn't associate a pointer with bounds, but rather a pair of pointer and pointer location. So, the bound is setup for &a, with as location the pushed argument in the frame. The inferior call however executes in a dummy frame, so the bound is checked for &a with as location the pushed argument in the dummy frame, which is different, so the bounds check doesn't trigger. In conclusion, this is expected behaviour. Update the test-case to not expect to override effective pointer bounds using the bounds registers when the bounds passing is done via the Bounds Table. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-12-11 Tom de Vries <tdevries@suse.de> PR testsuite/26991 * gdb.arch/i386-mpx-call.exp: Don't expect to trigger bounds violations by setting bounds registers if the bounds are passed in the Bounds Table.
2020-12-11Avoid side effects in expression lexersTom Tromey4-36/+44
I noticed that some of the lexers were calling write_dollar_variable from the lexer. This seems like a bad practice, so this patch moves the side effects into the parsers. I tested this by re-running gdb.fortran and gdb.modula2; the Pascal compiler on my machine seems not to work, so I couldn't test gdb.pascal. I note that the type-tracking in the Pascal is also incorrect, in that a convenience variable's type may change between parsing and evaluation (or even during the course of evaluation). gdb/ChangeLog 2020-12-11 Tom Tromey <tom@tromey.com> * p-exp.y (intvar): Remove global. (DOLLAR_VARIABLE): Change type. (start): Update. (exp): Call write_dollar_variable here... (yylex): ... not here. * m2-exp.y (DOLLAR_VARIABLE): Change type. (variable): Call write_dollar_variable here... (yylex): ... not here. * f-exp.y (DOLLAR_VARIABLE): Change type. (exp): Call write_dollar_variable here... (yylex): ... not here.
2020-12-11install_variable cannot failTom Tromey2-9/+8
I noticed that install_variable will never return false, so this patch changes the return type to void. I couldn't find a spot in history where it did return false, maybe it's always been like this. gdb/ChangeLog 2020-12-11 Tom Tromey <tom@tromey.com> * varobj.c (varobj_create): Update. (install_variable): Return void.