aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2
AgeCommit message (Collapse)AuthorFilesLines
2021-08-10Ignore .debug_types when reading .debug_arangesTom Tromey1-1/+2
I noticed that the fission-reread.exp test case can cause a complaint when run with --target_board=cc-with-debug-names: warning: Section .debug_aranges in [...]/fission-reread has duplicate debug_info_offset 0x0, ignoring .debug_aranges. The bug here is that this executable has both .debug_info and .debug_types, and both have a CU at offset 0x0. This triggers the duplicate warning. Because .debug_types doesn't provide any address ranges, these CUs can be ignored. That is, this bug turns out to be another regression from the info/types merger patch. This patch fixes the problem by having this loop igore type units. fission-reread.exp is updated to test for the bug.
2021-08-06[gdb/symtab] Recognize .gdb_index symbol table with empty entries as emptyTom de Vries1-20/+2
When reading a .gdb_index that contains a non-empty symbol table with only empty entries, gdb doesn't recognize it as empty. Fix this by recognizing that the constant pool is empty, and then setting the symbol table to empty. Tested on x86_64-linux. gdb/ChangeLog: 2021-08-01 Tom de Vries <tdevries@suse.de> PR symtab/28159 * dwarf2/read.c (read_gdb_index_from_buffer): Handle symbol table filled with empty entries. gdb/testsuite/ChangeLog: 2021-08-01 Tom de Vries <tdevries@suse.de> PR symtab/28159 * gdb.dwarf2/dw2-zero-range.exp: Remove kfail.
2021-08-06[gdb/symtab] Fix zero address complaint for shlibTom de Vries3-0/+230
In PR28004 the following warning / Internal error is reported: ... $ gdb -q -batch \ -iex "set sysroot $(pwd -P)/repro" \ ./repro/gdb \ ./repro/core \ -ex bt ... Program terminated with signal SIGABRT, Aborted. #0 0x00007ff8fe8e5d22 in raise () from repro/usr/lib/libc.so.6 [Current thread is 1 (LWP 1762498)] #1 0x00007ff8fe8cf862 in abort () from repro/usr/lib/libc.so.6 warning: (Internal error: pc 0x7ff8feb2c21d in read in psymtab, \ but not in symtab.) warning: (Internal error: pc 0x7ff8feb2c218 in read in psymtab, \ but not in symtab.) ... #2 0x00007ff8feb2c21e in __gnu_debug::_Error_formatter::_M_error() const \ [clone .cold] (warning: (Internal error: pc 0x7ff8feb2c21d in read in \ psymtab, but not in symtab.) ) from repro/usr/lib/libstdc++.so.6 ... The warning is about the following: - in find_pc_sect_compunit_symtab we try to find the address (0x7ff8feb2c218 / 0x7ff8feb2c21d) in the symtabs. - that fails, so we try again in the partial symtabs. - we find a matching partial symtab - however, the partial symtab has a full symtab, so we should have found a matching symtab in the first step. The addresses are: ... (gdb) info sym 0x7ff8feb2c218 __gnu_debug::_Error_formatter::_M_error() const [clone .cold] in \ section .text of repro/usr/lib/libstdc++.so.6 (gdb) info sym 0x7ff8feb2c21d __gnu_debug::_Error_formatter::_M_error() const [clone .cold] + 5 in \ section .text of repro/usr/lib/libstdc++.so.6 ... which correspond to unrelocated addresses 0x9c218 and 0x9c21d: ... $ nm -C repro/usr/lib/libstdc++.so.6.0.29 | grep 000000000009c218 000000000009c218 t __gnu_debug::_Error_formatter::_M_error() const \ [clone .cold] ... which belong to function __gnu_debug::_Error_formatter::_M_error() in /build/gcc/src/gcc/libstdc++-v3/src/c++11/debug.cc. The partial symtab that is found for the addresses is instead the one for /build/gcc/src/gcc/libstdc++-v3/src/c++98/bitmap_allocator.cc, which is incorrect. This happens as follows. The bitmap_allocator.cc CU has DW_AT_ranges at .debug_rnglist offset 0x4b50: ... 00004b50 0000000000000000 0000000000000056 00004b5a 00000000000a4790 00000000000a479c 00004b64 00000000000a47a0 00000000000a47ac ... When reading the first range 0x0..0x56, it doesn't trigger the "start address of zero" complaint here: ... /* A not-uncommon case of bad debug info. Don't pollute the addrmap with bad data. */ if (range_beginning + baseaddr == 0 && !per_objfile->per_bfd->has_section_at_zero) { complaint (_(".debug_rnglists entry has start address of zero" " [in module %s]"), objfile_name (objfile)); continue; } ... because baseaddr != 0, which seems incorrect given that when loading the shared library individually in gdb (and consequently baseaddr == 0), we do see the complaint. Consequently, we run into this case in dwarf2_get_pc_bounds: ... if (low == 0 && !per_objfile->per_bfd->has_section_at_zero) return PC_BOUNDS_INVALID; ... which then results in this code in process_psymtab_comp_unit_reader being called with cu_bounds_kind == PC_BOUNDS_INVALID, which sets the set_addrmap argument to 1: ... scan_partial_symbols (first_die, &lowpc, &highpc, cu_bounds_kind <= PC_BOUNDS_INVALID, cu); ... and consequently, the CU addrmap gets build using address info from the functions. During that process, addrmap_set_empty is called with a range that includes 0x9c218 and 0x9c21d: ... (gdb) p /x start $7 = 0x9989c (gdb) p /x end_inclusive $8 = 0xb200d ... but it's called for a function at DIE 0x54153 with DW_AT_ranges at 0x40ae: ... 000040ae 00000000000b1ee0 00000000000b200e 000040b9 000000000009989c 00000000000998c4 000040c3 <End of list> ... and neither range includes 0x9c218 and 0x9c21d. This is caused by this code in partial_die_info::read: ... if (dwarf2_ranges_read (ranges_offset, &lowpc, &highpc, cu, nullptr, tag)) has_pc_info = 1; ... which pretends that the function is located at addresses 0x9989c..0xb200d, which is indeed not the case. This patch fixes the first problem encountered: fix the "start address of zero" complaint warning by removing the baseaddr part from the condition. Same for dwarf2_ranges_process. The effect is that: - the complaint is triggered, and - the warning / Internal error is no longer triggered. This does not fix the observed problem in partial_die_info::read, which is filed as PR28200. Tested on x86_64-linux. Co-Authored-By: Simon Marchi <simon.marchi@polymtl.ca> gdb/ChangeLog: 2021-07-29 Simon Marchi <simon.marchi@polymtl.ca> Tom de Vries <tdevries@suse.de> PR symtab/28004 * gdb/dwarf2/read.c (dwarf2_rnglists_process, dwarf2_ranges_process): Fix zero address complaint. * gdb/testsuite/gdb.dwarf2/dw2-zero-range-shlib.c: New test. * gdb/testsuite/gdb.dwarf2/dw2-zero-range.c: New test. * gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp: New file.
2021-08-05Replace the symbol needs evaluator with a parserZoran Zaric3-0/+268
This patch addresses a design problem with the symbol_needs_eval_context class. It exposes the problem by introducing two new testsuite test cases. To explain the issue, I first need to explain the dwarf_expr_context class that the symbol_needs_eval_context class derives from. The intention behind the dwarf_expr_context class is to commonize the DWARF expression evaluation mechanism for different evaluation contexts. Currently in gdb, the evaluation context can contain some or all of the following information: architecture, object file, frame and compilation unit. Depending on the information needed to evaluate a given expression, there are currently three distinct DWARF expression evaluators:  - Frame: designed to evaluate an expression in the context of a call    frame information (dwarf_expr_executor class). This evaluator doesn't    need a compilation unit information.  - Location description: designed to evaluate an expression in the    context of a source level information (dwarf_evaluate_loc_desc    class). This evaluator expects all information needed for the    evaluation of the given expression to be present.  - Symbol needs: designed to answer a question about the parts of the    context information required to evaluate a DWARF expression behind a    given symbol (symbol_needs_eval_context class). This evaluator    doesn't need a frame information. The functional difference between the symbol needs evaluator and the others is that this evaluator is not meant to interact with the actual target. Instead, it is supposed to check which parts of the context information are needed for the given DWARF expression to be evaluated by the location description evaluator. The idea is to take advantage of the existing dwarf_expr_context evaluation mechanism and to fake all required interactions with the actual target, by returning back dummy values. The evaluation result is returned as one of three possible values, based on operations found in a given expression: - SYMBOL_NEEDS_NONE, - SYMBOL_NEEDS_REGISTERS and - SYMBOL_NEEDS_FRAME. The problem here is that faking results of target interactions can yield an incorrect evaluation result. For example, if we have a conditional DWARF expression, where the condition depends on a value read from an actual target, and the true branch of the condition requires a frame information to be evaluated, while the false branch doesn't, fake target reads could conclude that a frame information is not needed, where in fact it is. This wrong information would then cause the expression to be actually evaluated (by the location description evaluator) with a missing frame information. This would then crash the debugger. The gdb.dwarf2/symbol_needs_eval_fail.exp test introduces this scenario, with the following DWARF expression:                    DW_OP_addr $some_variable                    DW_OP_deref                    # conditional jump to DW_OP_bregx                    DW_OP_bra 4                    DW_OP_lit0                    # jump to DW_OP_stack_value                    DW_OP_skip 3                    DW_OP_bregx $dwarf_regnum 0                    DW_OP_stack_value This expression describes a case where some variable dictates the location of another variable. Depending on a value of some_variable, the variable whose location is described by this expression is either read from a register or it is defined as a constant value 0. In both cases, the value will be returned as an implicit location description on the DWARF stack. Currently, when the symbol needs evaluator fakes a memory read from the address behind the some_variable variable, the constant value 0 is used as the value of the variable A, and the check returns the SYMBOL_NEEDS_NONE result. This is clearly a wrong result and it causes the debugger to crash. The scenario might sound strange to some people, but it comes from a SIMD/SIMT architecture where $some_variable is an execution mask.  In any case, it is a valid DWARF expression, and GDB shouldn't crash while evaluating it. Also, a similar example could be made based on a condition of the frame base value, where if that value is concluded to be 0, the variable location could be defaulted to a TLS based memory address. The gdb.dwarf2/symbol_needs_eval_timeout.exp test introduces a second scenario. This scenario is a bit more abstract due to the DWARF assembler lacking the CFI support, but it exposes a different manifestation of the same problem. Like in the previous scenario, the DWARF expression used in the test is valid:                        DW_OP_lit1                        DW_OP_addr $some_variable                        DW_OP_deref                        # jump to DW_OP_fbreg                        DW_OP_skip 4                        DW_OP_drop                        DW_OP_fbreg 0                        DW_OP_dup                        DW_OP_lit0                        DW_OP_eq                        # conditional jump to DW_OP_drop                        DW_OP_bra -9                        DW_OP_stack_value Similarly to the previous scenario, the location of a variable A is an implicit location description with a constant value that depends on a value held by a global variable. The difference from the previous case is that DWARF expression contains a loop instead of just one branch. The end condition of that loop depends on the expectation that a frame base value is never zero. Currently, the act of faking the target reads will cause the symbol needs evaluator to get stuck in an infinite loop. Somebody could argue that we could change the fake reads to return something else, but that would only hide the real problem. The general impression seems to be that the desired design is to have one class that deals with parsing of the DWARF expression, while there are virtual methods that deal with specifics of some operations. Using an evaluator mechanism here doesn't seem to be correct, because the act of evaluation relies on accessing the data from the actual target with the possibility of skipping the evaluation of some parts of the expression. To better explain the proposed solution for the issue, I first need to explain a couple more details behind the current design: There are multiple places in gdb that handle DWARF expression parsing for different purposes. Some are in charge of converting the expression to some other internal representation (decode_location_expression, disassemble_dwarf_expression and dwarf2_compile_expr_to_ax), some are analysing the expression for specific information (compute_stack_depth_worker) and some are in charge of evaluating the expression in a given context (dwarf_expr_context::execute_stack_op and decode_locdesc). The problem is that all those functions have a similar (large) switch statement that handles each DWARF expression operation. The result of this is a code duplication and harder maintenance. As a step into the right direction to solve this problem (at least for the purpose of a DWARF expression evaluation) the expression parsing was commonized inside of an evaluator base class (dwarf_expr_context). This makes sense for all derived classes, except for the symbol needs evaluator (symbol_needs_eval_context) class. As described previously the problem with this evaluator is that if the evaluator is not allowed to access the actual target, it is not really evaluating. Instead, the desired function of a symbol needs evaluator seems to fall more into expression analysis category. This means that a more natural fit for this evaluator is to be a symbol needs analysis, similar to the existing compute_stack_depth_worker analysis. Another problem is that using a heavyweight mechanism of an evaluator to do an expression analysis seems to be an unneeded overhead. It also requires a more complicated design of the parent class to support fake target reads. The reality is that the whole symbol_needs_eval_context class can be replaced with a lightweight recursive analysis function, that will give more correct result without compromising the design of the dwarf_expr_context class. The analysis treats the expression byte stream as a DWARF operation graph, where each graph node can be visited only once and each operation can decide if the frame context is needed for their evaluation. The downside of this approach is adding of one more similar switch statement, but at least this way the new symbol needs analysis will be a lightweight mechnism and it will provide a correct result for any given DWARF expression. A more desired long term design would be to have one class that deals with parsing of the DWARF expression, while there would be a virtual methods that deal with specifics of some DWARF operations. Then that class would be used as a base for all DWARF expression parsing mentioned at the beginning. This however, requires a far bigger changes that are out of the scope of this patch series. The new analysis requires the DWARF location description for the argc argument of the main function to change in the assembly file gdb.python/amd64-py-framefilter-invalidarg.S. Originally, expression ended with a 0 value byte, which was never reached by the symbol needs evaluator, because it was detecting a stack underflow when evaluating the operation before. The new approach does not simulate a DWARF stack anymore, so the 0 value byte needs to be removed because it makes the DWARF expression invalid. gdb/ChangeLog: * dwarf2/loc.c (class symbol_needs_eval_context): Remove. (dwarf2_get_symbol_read_needs): New function. (dwarf2_loc_desc_get_symbol_read_needs): Remove. (locexpr_get_symbol_read_needs): Use dwarf2_get_symbol_read_needs. gdb/testsuite/ChangeLog: * gdb.python/amd64-py-framefilter-invalidarg.S : Update argc DWARF location expression. * lib/dwarf.exp (_location): Handle DW_OP_fbreg. * gdb.dwarf2/symbol_needs_eval.c: New file. * gdb.dwarf2/symbol_needs_eval_fail.exp: New file. * gdb.dwarf2/symbol_needs_eval_timeout.exp: New file.
2021-08-02Handle compiler-generated suffixes in Ada namesTom Tromey1-0/+72
The compiler may add a suffix to a mangled name. A typical example would be splitting a function and creating a ".cold" variant. This patch changes Ada decoding (aka demangling) to handle these suffixes. It also changes the encoding process to handle them as well. A symbol like "function.cold" will now be displayed to the user as "function[cold]". The "." is not simply preserved because that is already used in Ada.
2021-08-02[gdb/testsuite] Fix gdb.dwarf2/dw2-using-debug-str.exp with cc-with-dwz-mTom de Vries1-0/+13
When running with target board cc-with-dwz-m, we run into: ... (gdb) file dw2-using-debug-str-no-debug-str^M Reading symbols from dw2-using-debug-str-no-debug-str...^M (gdb) FAIL: gdb.dwarf2/dw2-using-debug-str.exp: file dw2-using-debug-str ... With native, the .debug_str section is present in the dw2-using-debug-str executable, and removed from the dw2-using-debug-str-no-debug-str executable. When loading the latter, a dwarf error is triggered. With cc-with-dwz-m, the .debug_str section is not present in the dw2-using-debug-str executable, because it's already moved to .tmp/dw2-using-debug-str.dwz. Consequently, the removal has no effect, and no dwarf error is triggered, which causes the FAIL. The same problem arises with target board cc-with-gnu-debuglink. Fix this by detecting whether the .debug_str section is missing, and skipping the remainder of the test-case. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-08-02 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/dw2-using-debug-str.exp: Handle missing .debug_str section in dw2-using-debug-str.
2021-08-02[gdb/testsuite] Fix gdb.dwarf2/dw2-using-debug-str.exp with cc-with-gdb-indexTom de Vries1-12/+16
When running with target board cc-with-gdb-index, we run into: ... (gdb) file dw2-using-debug-str-no-debug-str^M Reading symbols from dw2-using-debug-str-no-debug-str...^M Dwarf Error: DW_FORM_strp used without required section^M (gdb) FAIL: gdb.dwarf2/dw2-using-debug-str.exp: file dw2-using-debug-str ... The test expects the dwarf error, but has no matching pattern for the entire output. Fix this by updating the regexp. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-08-02 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/dw2-using-debug-str.exp: Update regexp to match cc-with-gdb-index output.
2021-08-02[gdb/testsuite] Fix gdb.dwarf2/per-bfd-sharing.exp with cc-with-gdb-indexTom de Vries1-1/+5
When running with target board cc-with-gdb-index, we run into: ... rm: cannot remove '/tmp/tmp.JmYTeiuFjj/*.gdb-index': \ No such file or directory^M FAIL: gdb.dwarf2/per-bfd-sharing.exp: \ couldn't remove files in temporary cache dir ... Fix this, as in gdb.base/index-cache.exp, by only FAILing when $expecting_index_cache_use. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-08-02 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/per-bfd-sharing.exp: Only expect index-cache files when $expecting_index_cache_use.
2021-08-02[gdb/testsuite] Fix gdb.dwarf2/gdb-index-nodebug.exp with cc-with-gdb-indexTom de Vries1-2/+21
When running with target board cc-with-gdb-index, we run into: ... (gdb) save gdb-index .^M Error while writing index for `gdb-index-nodebug': \ Cannot use an index to create the index^M (gdb) FAIL: gdb.dwarf2/gdb-index-nodebug.exp: try to save gdb index ... Fix this by detecting an already present index, and marking the test unsupported. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-08-02 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/gdb-index-nodebug.exp: Mark unsupported when index already present.
2021-07-06[gdb/symtab] Fix skipping of import of C++ CUTom de Vries4-7/+43
Tom Tromey observed that when changing the language in gdb.dwarf2/imported-unit-bp.exp from c to c++, the test failed. This is due to this code in process_imported_unit_die: ... /* We're importing a C++ compilation unit with tag DW_TAG_compile_unit into another compilation unit, at root level. Regard this as a hint, and ignore it. */ if (die->parent && die->parent->parent == NULL && per_cu->unit_type == DW_UT_compile && per_cu->lang == language_cplus) return; ... which should have a partial symtabs counterpart. Add the missing counterpart in process_psymtab_comp_unit. Tested on x86_64-linux (openSUSE Leap 15.2), no regressions for config: - using default gcc version 7.5.0 (with 5 unexpected FAILs) - gcc 10.3.0 and target board unix/-flto/-O0/-flto-partition=none/-ffat-lto-objects (with 1000 unexpected FAILs) gdb/ChangeLog: 2021-07-06 Tom de Vries <tdevries@suse.de> * dwarf2/read.c (scan_partial_symbols): Skip top-level imports of c++ CU. * testsuite/gdb.dwarf2/imported-unit-bp.exp: Moved to ... * testsuite/gdb.dwarf2/imported-unit-bp.exp.tcl: ... here. * testsuite/gdb.dwarf2/imported-unit-bp-c++.exp: New test. * testsuite/gdb.dwarf2/imported-unit-bp-c.exp: New test. * testsuite/gdb.dwarf2/imported-unit.exp: Update.
2021-06-29gdb: introduce FRAME_SCOPED_DEBUG_ENTER_EXITSimon Marchi1-2/+2
Introduce FRAME_SCOPED_DEBUG_ENTER_EXIT and use it to print enter/exit messages in important frame-related functions. I think this helps understand which lower-level operations are done as part of which higher-level operation. And it helps visually skip over a higher-level operation you are not interested in. Here's an example, combined with some py-unwind messages: [frame] frame_unwind_find_by_frame: enter [frame] frame_unwind_find_by_frame: this_frame=0 [frame] frame_unwind_try_unwinder: trying unwinder "dummy" [frame] frame_unwind_try_unwinder: no [frame] frame_unwind_try_unwinder: trying unwinder "dwarf2 tailcall" [frame] frame_unwind_try_unwinder: no [frame] frame_unwind_try_unwinder: trying unwinder "inline" [frame] frame_unwind_try_unwinder: no [frame] frame_unwind_try_unwinder: trying unwinder "jit" [frame] frame_unwind_try_unwinder: no [frame] frame_unwind_try_unwinder: trying unwinder "python" [py-unwind] pyuw_sniffer: enter [frame] frame_unwind_register_value: enter [frame] frame_unwind_register_value: frame=-1, regnum=7(rsp) [frame] frame_unwind_register_value: -> register=7 bytes=[40ddffffff7f0000] [frame] frame_unwind_register_value: exit [py-unwind] pyuw_sniffer: frame=0, sp=0x7fffffffdd40, pc=0x5555555551ec [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_eq: l={stack=<sentinel>,!code,special=0x0000000000000000}, r={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_unwind_register_value: enter [frame] frame_unwind_register_value: frame=-1, regnum=6(rbp) [frame] frame_unwind_register_value: -> register=6 bytes=[50ddffffff7f0000] [frame] frame_unwind_register_value: exit [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_eq: l={stack=<sentinel>,!code,special=0x0000000000000000}, r={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] get_prev_frame: enter [frame] get_prev_frame_always_1: enter [frame] get_prev_frame_always_1: this_frame=-1 [frame] get_prev_frame_always_1: -> {level=0,type=NORMAL_FRAME,unwind=0x5588ee3d17c0,pc=0x5555555551ec,id=<not computed>,func=<unknown>} // cached [frame] get_prev_frame_always_1: exit [frame] get_prev_frame: exit [frame] value_fetch_lazy_register: (frame=0, regnum=6(rbp), ...) -> register=6 bytes=[50ddffffff7f0000] [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_eq: l={stack=<sentinel>,!code,special=0x0000000000000000}, r={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_unwind_register_value: enter [frame] frame_unwind_register_value: frame=-1, regnum=7(rsp) [frame] frame_unwind_register_value: -> register=7 bytes=[40ddffffff7f0000] [frame] frame_unwind_register_value: exit [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_eq: l={stack=<sentinel>,!code,special=0x0000000000000000}, r={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] get_prev_frame: enter [frame] get_prev_frame_always_1: enter [frame] get_prev_frame_always_1: this_frame=-1 [frame] get_prev_frame_always_1: -> {level=0,type=NORMAL_FRAME,unwind=0x5588ee3d1824,pc=0x5555555551ec,id=<not computed>,func=<unknown>} // cached [frame] get_prev_frame_always_1: exit [frame] get_prev_frame: exit [frame] value_fetch_lazy_register: (frame=0, regnum=7(rsp), ...) -> register=7 bytes=[40ddffffff7f0000] [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_eq: l={stack=<sentinel>,!code,special=0x0000000000000000}, r={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_unwind_register_value: enter [frame] frame_unwind_register_value: frame=-1, regnum=16(rip) [frame] frame_unwind_register_value: -> register=16 bytes=[ec51555555550000] [frame] frame_unwind_register_value: exit [frame] frame_id_p: l={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] frame_id_eq: l={stack=<sentinel>,!code,special=0x0000000000000000}, r={stack=<sentinel>,!code,special=0x0000000000000000} -> 1 [frame] get_prev_frame: enter [frame] get_prev_frame_always_1: enter [frame] get_prev_frame_always_1: this_frame=-1 [frame] get_prev_frame_always_1: -> {level=0,type=NORMAL_FRAME,unwind=0x5588ee3d1888,pc=0x5555555551ec,id=<not computed>,func=<unknown>} // cached [frame] get_prev_frame_always_1: exit [frame] get_prev_frame: exit [frame] value_fetch_lazy_register: (frame=0, regnum=16(rip), ...) -> register=16 bytes=[ec51555555550000] [py-unwind] pyuw_sniffer: frame claimed by unwinder test unwinder [py-unwind] pyuw_sniffer: exit [frame] frame_unwind_try_unwinder: yes [frame] frame_unwind_find_by_frame: exit gdb/ChangeLog: * frame.h (FRAME_SCOPED_DEBUG_ENTER_EXIT): New. * frame.c (compute_frame_id, get_prev_frame_always_1, get_prev_frame): Use FRAME_SCOPED_DEBUG_ENTER_EXIT. * frame-unwind.c (frame_unwind_find_by_frame): Likewise. (frame_unwind_register_value): Likewise. Change-Id: I45b69b4ed962e70572bc55b8adfb211483c1eeed
2021-06-29gdb: introduce frame_debug_printfSimon Marchi1-1/+4
Introduce frame_debug_printf, to convert the "frame" debug messages to the new system. Replace fprint_frame with a frame_info::to_string method that returns a string, like what was done with frame_id::to_string. This makes it easier to use with frame_debug_printf. gdb/ChangeLog: * frame.h (frame_debug_printf): New. * frame.c: Use frame_debug_printf throughout when printing frame debug messages. * amd64-windows-tdep.c: Likewise. * value.c: Likewise. gdb/testsuite/ChangeLog: * gdb.dwarf2/dw2-reg-undefined.exp: Update regexp. Change-Id: I3c230b0814ea81c23af3e1aca1aac8d4ba91d726
2021-06-25gdb/mi: add regexp filtering to -file-list-exec-source-filesAndrew Burgess1-1/+1
This commit extends the existing MI command -file-list-exec-source-files to provide the same regular expression based filtering that the equivalent CLI command "info sources" provides. The new command syntax is: -file-list-exec-source-files [--basename | --dirname] [--] [REGEXP] All options are optional, which ensures the command is backward compatible. As part of this work I have unified the CLI and MI code. As a result of the unified code I now provide additional information in the MI command output, there is now a new field 'debug-fully-read' included with each source file. This field which has the values 'true' or 'false', indicates if the source file is from a compilation unit that has had its debug information fully read. However, as this is additional information, a well written front-end should just ignore this field if it doesn't understand it, so things should still be backward compatible. gdb/ChangeLog: * NEWS: Mention additions to -file-list-exec-source-files. * mi/mi-cmd-file.c (print_partial_file_name): Delete. (mi_cmd_file_list_exec_source_files): Rewrite to handle command options, and make use of info_sources_worker. * symtab.c (struct info_sources_filter): Moved to symtab.h. (info_sources_filter::print): Take uiout argument, produce output through uiout. (struct output_source_filename_data) <output_source_filename_data>: Take uiout argument, store into m_uiout. <output>: Rewrite comment, add additional arguments to declaration. <operator()>: Send more arguments to output. <m_uiout>: New member variable. (output_source_filename_data::output): Take extra arguments, produce output through m_uiout, and structure for MI. (output_source_filename_data::print_header): Produce output through m_uiout. (info_sources_worker): New function, the implementation is taken from info_sources_command, but modified so produce output through a ui_out. (info_sources_command): The second half of this function has gone to become info_sources_worker. * symtab.h (struct info_sources_filter): Moved from symtab.c, add extra parameter to print member function. (info_sources_worker): Declare. gdb/doc/ChangeLog: * gdb.texinfo (GDB/MI File Commands): Document extensions to -file-list-exec-source-files. gdb/testsuite/ChangeLog: * gdb.dwarf2/dw2-filename.exp: Update expected results. * gdb.mi/mi-file.exp: Likewise. * gdb.mi/mi-info-sources-base.c: New file. * gdb.mi/mi-info-sources.c: New file. * gdb.mi/mi-info-sources.exp: New file.
2021-06-22gdb: Support DW_LLE_start_endAndreas Schwab2-0/+174
Without that it is impossible to debug on riscv64. gdb/ PR symtab/27999 * dwarf2/loc.c (decode_debug_loclists_addresses): Support DW_LLE_start_end. gdb/testsuite/ PR symtab/27999 * lib/dwarf.exp (start_end): New proc inside loclists. * gdb.dwarf2/loclists-start-end.exp: New file. * gdb.dwarf2/loclists-start-end.c: New file.
2021-06-22[gdb/testsuite] Add gdb.dwarf2/imported-unit-c.expTom de Vries1-0/+110
This test-case is intended to excercise this code in process_imported_unit_die: ... /* We're importing a C++ compilation unit with tag DW_TAG_compile_unit into another compilation unit, at root level. Regard this as a hint, and ignore it. */ if (die->parent && die->parent->parent == NULL && per_cu->unit_type == DW_UT_compile && per_cu->lang == language_cplus) return; ... in the sense that the test-case should fail if the "per_cu->lang == language_cplus" clause is removed. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-06-22 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/imported-unit-c.exp: New file.
2021-06-07gdb: handle case where type alignment is unknownAndrew Burgess2-0/+152
It was spotted that if type_align returned 0 then it was possible to trigger a divide by zero exception within GDB. It turns out this will only happen in an edge case where GDB is unable to figure out the alignment of a field within a structure. The attached test generates some non-standard, probably broken, DWARF, that triggers this condition, and then fixes this issue by throwing an exception when this case occurs. gdb/ChangeLog: PR gdb/27847 * amd64-tdep.c (amd64_has_unaligned_fields): Move call to type_align, and spot case where the alignment is unknown. gdb/testsuite/ChangeLog: PR gdb/27847 * gdb.dwarf2/dw2-weird-type-len.c: New file. * gdb.dwarf2/dw2-weird-type-len.exp: New file.
2021-06-02Fix temp-dir leakage in per-bfd-sharing.expBernd Edlinger1-5/+5
Whan using clang as compiler this compile step fails due to the unknown option "-Wl,--build-id". This leaks the already created temp-dir. Fixed by compiling first, and creating the temp-dir only when the compile succeeded. 2021-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de> * gdb.dwarf2/per-bfd-sharing.exp: Fix temp-dir leakage.
2021-05-27[gdb/symtab] Fix segfault in process_psymtab_comp_unitTom de Vries1-5/+1
When running test-case gdb.dwarf2/dw2-dummy-cu.exp without -readnow, we run into: ... (gdb) file outputs/gdb.dwarf2/dw2-dummy-cu/dw2-dummy-cu^M Reading symbols from outputs/gdb.dwarf2/dw2-dummy-cu/dw2-dummy-cu...^M ERROR: Couldn't load dw2-dummy-cu into GDB (eof). ... The problem is that we're running into a segfault: ... Thread 1 "gdb" received signal SIGSEGV, Segmentation fault. process_psymtab_comp_unit (this_cu=0x2141090, per_objfile=0x1aa4140, want_partial_unit=false, pretend_language=language_minimal) at /home/vries/gdb_versions/devel/src/gdb/dwarf2/read.c:7023 7023 switch (reader.comp_unit_die->tag) ... due to reader.comp_unit_die == nullptr: ... (gdb) p reader.comp_unit_die $1 = (die_info *) 0x0 ... Indeed, there's no CU DIE in the test-case: ... $ readelf -wi outputs/gdb.dwarf2/dw2-dummy-cu/dw2-dummy-cu Contents of the .debug_info section: Compilation Unit @ offset 0x0: Length: 0x7 (32-bit) Version: 2 Abbrev Offset: 0x0 Pointer Size: 4 $ ... Fix this by handling reader.comp_unit_die == nullptr in process_psymtab_comp_unit. Update the test-case to trigger this PR, as per PR27920 - "[gdb/testsuite] hardcoding -readnow skips testing of partial symbols". Tested on x86_64-linux. gdb/ChangeLog: 2021-05-27 Tom de Vries <tdevries@suse.de> PR symtab/27919 * dwarf2/read.c (process_psymtab_comp_unit): gdb/testsuite/ChangeLog: 2021-05-27 Tom de Vries <tdevries@suse.de> PR symtab/27919 PR testsuite/27920 * gdb.dwarf2/dw2-dummy-cu.exp: Use maint expand-symtabs instead of -readnow.
2021-05-27[gdb/testsuite] Prevent proc override in gdb-index.expTom de Vries1-2/+3
When running these two test-cases in this specific order we get: ... $ make check 'RUNTESTFLAGS=gdb.dwarf2/gdb-index.exp \ gdb.dwarf2/gdb-add-index-symlink.exp' ... Running gdb.dwarf2/gdb-index.exp ... Running gdb.dwarf2/gdb-add-index-symlink.exp ... FAIL: gdb.dwarf2/gdb-add-index-symlink.exp: gdb-index file created FAIL: gdb.dwarf2/gdb-add-index-symlink.exp: Unable to call \ gdb-add-index with a symlink to a symfile ... The problem is that gdb-index.exp introduces a proc add_gdb_index which overrides the one in lib/gdb.exp and stays active after the test is done. Consequently it's used in gdb-add-index-symlink.exp, which should use the one from lib/gdb.exp. Fix this by renaming proc add_gdb_index in gdb-index.exp. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-05-27 Tom de Vries <tdevries@suse.de> PR testsuite/27921 * gdb.dwarf2/gdb-index.exp (add_gdb_index): Rename to ... (local_add_gdb_index): ... this.
2021-05-21testsuite/gdb.dwarf2: avoid dead code in dw2-inline-with-lexical-scope.cTankut Baris Aktemur1-2/+2
The test in gdb.dwarf2/dw2-inline-with-lexical-scope.c fails with icc. The reason is, icc did not emit code for a dead statement, which in turn caused some labels to be collapsed. Fix this by replacing the dead code with assignment to a global value. The statement itself does not change the test scenario. Also fix a whitespacing problem around an assignment operator. gdb/testsuite/ChangeLog: 2021-05-21 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * gdb.dwarf2/dw2-inline-with-lexical-scope.c (func): Replace a dead code with an assignment to a global var. Fix a whitespacing problem around an assignment operator.
2021-05-14testsuite: Cleanup some temp dirs with gdb-index filesBernd Edlinger1-0/+12
After the gdb test-suite runs there are some files left in /tmp/tmp*/*.gdb-index, remove those files and the directory at the end of the test case. gdb/testsuite: 2021-05-14 Bernd Edlinger <bernd.edlinger@hotmail.de> * gdb.base/index-cache.exp: Cleanup $cache_dir/*.gdb-index and remove the directory. * gdb.dwarf2/per-bfd-sharing.exp: Likewise.
2021-05-10[PR gdb/27614] gdb-add-index fails on symlinks.Lancelot SIX1-0/+47
PR 27614 shows that gdb-add-index fails to generate the index when its argument is a symlink. The following one liner illustrates the reported problem: $ echo 'int main(){}'|gcc -g -x c -;ln -s a.out symlink;gdb-add-index symlink gdb-add-index: No index was created for symlink gdb-add-index: [Was there no debuginfo? Was there already an index?] $ ls -l -rwxr-xr-x 1 25712 Mar 19 23:05 a.out* -rw------- 1 8277 Mar 19 23:05 a.out.gdb-index lrwxrwxrwx 1 5 Mar 19 23:05 symlink -> a.out* GDB generates the .gdb-index file with a name that matches the name of the actual program (a.out.gdb-index here), not the symlink that references it. The remaining of the script is looking for a file named after the provided argument (would be 'symlink.gdb-index' in our example). gdb/ChangeLog: PR gdb/27614 * contrib/gdb-add-index.sh: Fix when called with a symlink as an argument. gdb/testsuite/ChangeLog: PR gdb/27614 * gdb.dwarf2/gdb-add-index-symlink.exp: New test.
2021-04-26Add test case for gdb 10 crashTom Tromey3-0/+202
PR gdb/27743 points out a gdb crash when expanding partial symtabs, where one of the compilation units uses DW_TAG_imported_unit. This crash happens for gdb 10, but not git trunk. This patch pulls over the new test case only. gdb/testsuite/ChangeLog 2021-04-26 Tom Tromey <tromey@adacore.com> PR gdb/27743: * gdb.dwarf2/imported-unit-bp.exp: New file. * gdb.dwarf2/imported-unit-bp-main.c: New file. * gdb.dwarf2/imported-unit-bp-alt.c: New file.
2021-04-17Avoid crash in write_psymtabs_to_indexTom Tromey1-0/+28
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-16Print bfloat16 DWARF types correctlyLuis Machado1-0/+82
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-15Avoid crash in Ada value printing with optimized-out arrayTom Tromey1-1/+32
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-14testsuite, dwarf2: use @DW_INL_declared_inlined in a testTankut Baris Aktemur1-1/+1
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 Aktemur2-0/+191
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-07gdb: handle relative paths to DWO filesCaroline Tice2-0/+158
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.
2021-04-07gdb/testsuite: fix fission support in the Dwarf assemblerAndrew Burgess9-402/+371
This commit fixes fission support in the Dwarf assembler. I added the new test gdb.dwarf2/fission-absolute-dwo.exp which is a simple example of using the fission support. I also rewrote the existing test gdb.dwarf2/fission-multi-cu.exp to use the new functionality (instead of using an x86-64 only assembler file). To better support compiling the assembler files produced by the Dwarf assembler I have added the new proc build_executable_and_dwo_files in lib/dwarf.exp, this replaces build_executable_from_fission_assembler, all the tests that used the old proc have been updated. Where the old proc assumed a single .S source file which contained the entire test, the new proc allows for multiple source files. The Dwarf assembler already had some fission support, however, this was not actually used in any tests, and when I tried using it there were a few issues. The biggest change is that we now generate DW_FORM_GNU_addr_index instead of DW_FORM_addr for the low and high pc in _handle_macro_at_range, support for the DW_FORM_GNU_addr_index is new in this commit. gdb/testsuite/ChangeLog: * gdb.dwarf2/fission-absolute-dwo.c: New file. * gdb.dwarf2/fission-absolute-dwo.exp: New file. * gdb.dwarf2/fission-base.exp: Use build_executable_and_dwo_files instead of build_executable_from_fission_assembler. * gdb.dwarf2/fission-loclists-pie.exp: Likewise. * gdb.dwarf2/fission-loclists.exp: Likewise.
2021-04-07gdb: Handle missing .debug_str sectionAndrew Burgess1-0/+41
While messing with the Dwarf assembler (gdb/testsuite/lib/dwarf.exp) I managed to create an ELF which made use of DW_FORM_strp, but didn't include a .debug_str section. When I started GDB on this ELF, GDB crashed. I would have expected to get an error instead. I tracked this down to an unfortunate design choice in dwarf2_section_info, a class which wraps around a bfd section, and is used for reading in debug information. GBB creates many dwarf2_section_info objects, one for each debug section that might need to be read, then as we find the input bfd sections we associate them with the corresponding dwarf2_section_info. If no matching input bfd section is found then the dwarf2_section_info is left in an unassociated state, its internal bfd section pointer is null. If later GDB tries to read content from the dwarf2_section_info, for example, which trying to read the string associated with DW_FORM_strp, we spot that there is no associated bfd section and issue an error message. To make the users life easier, the error message includes the section name being looked for, and the bfd from which the section was obtained. However, we get the section name by calling bfd_section_name on the associated section, and we get the bfd filename by calling bfd_get_filename on the owner of the associated section. Of course, if there is no associated section then both the calls bfd_section_name and dwarf2_section_info::get_bfd_owner will result in undefined behaviour (e.g. a crash). The solution I propose in this patch is, I know, not ideal. I simply spot the case where there is no associated section, and print a simpler error message, leaving out the section name and filename. A better solution would involve redesigning dwarf2_section_info, we could associate each dwarf2_section_info with the initial bfd being parsed. We would then display this filename if there's nothing better to display (e.g. if we find a section in a dwo/dwp split dwarf file then we would probably use that filename in preference). Each dwarf2_section_info could also have the concept of the default section name that would be read for that section, for example, string data might appear in ".debug_str" or ".zdebug_str", but if neither is found, then it would probably be OK to just say ".debug_str" is missing. Anyway, I didn't do any of that redesign, I just wanted to stop GDB crashing for now, so instead we get this: Dwarf Error: DW_FORM_strp used without required section Which isn't the best, but in context, isn't too bad: Reading symbols from /path/to/executable... Dwarf Error: DW_FORM_strp used without required section (No debugging symbols found in /path/to/executable) I also added some asserts into dwarf2_section_info which should trigger before GDB crashes in future, if we trigger any other bad paths through this code. And there's a test for the specific issue I hit. gdb/ChangeLog: * dwarf2/section.c (dwarf2_section_info::get_bfd_owner): Add an assert. (dwarf2_section_info::get_file_name): Add an assert. (dwarf2_section_info::read_string): Display a minimal, sane error when the dwarf2_section_info is not associated with a bfd section. gdb/testsuite/ChangeLog: * gdb.dwarf2/dw2-using-debug-str.exp: Add an additional test.
2021-03-30gdb/dwarf: disable per-BFD resource sharing for -readnow objfilesSimon Marchi2-0/+121
New in v2: - Disable sharing only for -readnow objfiles, not all objfiles. As described in PR 27541, we hit an internal error when loading a binary the standard way and then loading it with the -readnow option: $ ./gdb -nx -q --data-directory=data-directory ~/a.out -ex "set confirm off" -ex "file -readnow ~/a.out" Reading symbols from /home/simark/a.out... Reading symbols from ~/a.out... /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:8098: internal-error: void create_all_comp_units(dwarf2_per_objfile*): Assertion `per_objfile->per_bfd->all_comp_units.empty ()' failed. This is a recurring problem that exposes a design issue in the DWARF per-BFD sharing feature. Things work well when loading a binary with the same method (with/without index, with/without readnow) twice in a row. But they don't work so well when loading a binary with different methods. See this previous fix, for example: efb763a5ea35 ("gdb: check for partial symtab presence in dwarf2_initialize_objfile") That one handled the case where the first load is normal (uses partial symbols) and the second load uses an index. The problem is that when loading an objfile with a method A, we create a dwarf2_per_bfd and some dwarf2_per_cu_data and initialize them with the data belonging to that method. When loading another obfile sharing the same BFD but with a different method B, it's not clear how to re-use the dwarf2_per_bfd/dwarf2_per_cu_data previously created, because they contain the data specific to method A. I think the most sensible fix would be to not share a dwarf2_per_bfd between two objfiles loaded with different methods. That means that two objfiles sharing the same BFD and loaded the same way would share a dwarf2_per_bfd. Two objfiles sharing the same BFD but loaded with different methods would use two different dwarf2_per_bfd structures. However, this isn't a trivial change. So to fix the known issue quickly (including in the gdb 10 branch), this patch just disables all dwarf2_per_bfd sharing for objfiles using READNOW. Generalize the gdb.base/index-cache-load-twice.exp test to test all the possible combinations of loading a file with partial symtabs, index and readnow. Move it to gdb.dwarf2, since it really exercises features of the DWARF reader. gdb/ChangeLog: PR gdb/27541 * dwarf2/read.c (dwarf2_has_info): Don't share dwarf2_per_bfd with objfiles using READNOW. gdb/testsuite/ChangeLog: PR gdb/27541 * gdb.base/index-cache-load-twice.exp: Remove. * gdb.base/index-cache-load-twice.c: Remove. * gdb.dwarf2/per-bfd-sharing.exp: New. * gdb.dwarf2/per-bfd-sharing.c: New. Change-Id: I9ffcf1e136f3e75242f70e4e58e4ba1fd3083389
2021-03-30[gdb/testsuite] Add missing .debug_abbrev terminator in dw2-cu-size.STom de Vries1-0/+3
Since commit 27012aba8a6 "Remove Irix 6 workaround from DWARF abbrev reader" we have: ... (gdb) file dw2-cu-size^M Reading symbols from dw2-cu-size...^M DW_FORM_strp pointing outside of .debug_str section [in module dw2-cu-size]^M (No debugging symbols found in dw2-cu-size)^M (gdb) ptype noloc^M No symbol table is loaded. Use the "file" command.^M (gdb) FAIL: gdb.dwarf2/dw2-cu-size.exp: ptype noloc ... The problem is a missing .debug_abbrev terminator in dw2-cu-size.S, which causes the .debug_abbrev contribution to be merged with the next: ... Number TAG (0x9b) 1 DW_TAG_compile_unit [has children] DW_AT_name DW_FORM_string DW_AT_producer DW_FORM_string DW_AT_language DW_FORM_data1 DW_AT value: 0 DW_FORM value: 0 2 DW_TAG_variable [no children] DW_AT_name DW_FORM_string DW_AT_type DW_FORM_ref4 DW_AT_external DW_FORM_flag DW_AT value: 0 DW_FORM value: 0 3 DW_TAG_base_type [no children] DW_AT_name DW_FORM_string DW_AT_byte_size DW_FORM_data1 DW_AT_encoding DW_FORM_data1 DW_AT value: 0 DW_FORM value: 0 4 DW_TAG_const_type [no children] DW_AT_type DW_FORM_ref_udata DW_AT value: 0 DW_FORM value: 0 1 DW_TAG_compile_unit [has children] DW_AT_producer DW_FORM_strp DW_AT_language DW_FORM_data1 DW_AT_name DW_FORM_strp DW_AT_comp_dir DW_FORM_strp DW_AT_low_pc DW_FORM_addr DW_AT_high_pc DW_FORM_data8 DW_AT_stmt_list DW_FORM_sec_offset DW_AT value: 0 DW_FORM value: 0 ... and consequently, abbreviation code 1 no longer refers to a unique entry. The eventually causes us to access the first attribute of this DIE: ... <0><124>: Abbrev Number: 1 (DW_TAG_compile_unit) <125> DW_AT_name : file1.txt <12f> DW_AT_producer : GNU C 3.3.3 <13b> DW_AT_language : 1 (ANSI C) ... which has form DW_FORM_string, using DW_FORM_strp. Fix this by adding the missing .debug_abbrev terminator in dw2-cu-size.S. gdb/testsuite/ChangeLog: 2021-03-30 Tom de Vries <tdevries@suse.de> PR testsuite/27604 * gdb.dwarf2/dw2-cu-size.S: Add missing .debug_abbrev terminator.
2021-03-22gdb: handle invalid DWARF when compilation unit is missingAndrew Burgess2-0/+101
Replace an abort call in process_psymtab_comp_unit with a real error, and add a test to cover this case. The case is question is when badly formed DWARF is missing a DW_TAG_compile_unit, DW_TAG_partial_unit, or DW_TAG_type_unit as its top level tag. I then tested with --target_board=readnow and added additional code to also validate the top-level tag in this case. I added an assert that would trigger for the readnow case before I added the fix. I suspect there's lots of places where badly formed DWARF could result in the builder being nullptr when it shouldn't be, but I only added this one assert, as this is the one that would have helped me in this case. gdb/ChangeLog: * dwarf2/read.c (process_psymtab_comp_unit): Replace abort with an error. (process_full_comp_unit): Validate the top-level tag before processing the first DIE. (read_func_scope): Ensure we have a valid builder. gdb/testsuite/ChangeLog: * gdb.dwarf2/dw2-missing-cu-tag.c: New file. * gdb.dwarf2/dw2-missing-cu-tag.exp: New file.
2021-03-22gdb/testsuite: use the correct .debug_str section name for DW_FORM_strpAndrew Burgess2-0/+129
When handling DWARF attributes of the form DW_FORM_strp the strings should be placed in the .debug_str section, not .debug_string as they currently are by the DWARF assembler (in lib/dwarf.exp). I've added a test. This is as much to test the DWARF generator as it is to test GDB as GCC makes frequent use of DW_FORM_strp so we can be pretty sure this part of GDB is already well tested. gdb/testsuite/ChangeLog: * gdb.dwarf2/dw2-using-debug-str.c: New file. * gdb.dwarf2/dw2-using-debug-str.exp: New file. * lib/dwarf.exp (Dwarf::DW_FORM_strp): Create .debug_str section, not .debug_string.
2021-03-06Avoid crash on missing dwz fileTom Tromey1-0/+60
If DWARF contains a reference to a "dwz" file, but there is no .gnu_debugaltlink section, then gdb will crash. This happens because dwarf2_get_dwz_file will return NULL, but some callers do not expect this. This patch changes dwarf2_get_dwz_file so that callers can require a dwz file. Then, it updates the callers that are attempting to process references to the dwz file to require one. This includes a new testcase. The dwarf.exp changes don't handle the new forms exactly correctly -- they are only handled well enough to let this test case complete. gdb/ChangeLog 2021-03-06 Tom Tromey <tom@tromey.com> * dwarf2/read.h (dwarf2_get_dwz_file): Add 'require' parameter. * dwarf2/read.c (dwarf2_get_dwz_file): Add 'require' parameter. (get_abbrev_section_for_cu, read_attribute_value) (get_debug_line_section): Update. * dwarf2/macro.c (dwarf_decode_macro_bytes): Update. gdb/testsuite/ChangeLog 2021-03-06 Tom Tromey <tom@tromey.com> * lib/dwarf.exp (_handle_DW_FORM): Treat DW_FORM_GNU_ref_alt and DW_FORM_GNU_strp_alt like DW_FORM_sec_offset. * gdb.dwarf2/dwznolink.exp: New file.
2021-02-16Correction of gdb.dwarf2/pr13961.SAlok Kumar Sharma1-73/+84
Please consider output of objdump for the executable generated from pr13961.S ------------- Contents of the .debug_info section: ... <1><62>: Abbrev Number: 2 (DW_TAG_class_type) <63> DW_AT_name : foo2 <68> DW_AT_byte_size : 4 <69> DW_AT_decl_file : 1 <6a> DW_AT_decl_line : 1 <6b> DW_AT_sibling : <0x3f> !!! There is no DIE <0x3f> ... Contents of the .debug_types section: ... <1><25>: Abbrev Number: 8 (DW_TAG_class_type) !! Hand-inserted of size=5 <26> DW_AT_specification: <0x2a> <1><2a>: Abbrev Number: 2 (DW_TAG_class_type) <2b> DW_AT_name : foo <2f> DW_AT_byte_size : 4 <30> DW_AT_decl_file : 1 <31> DW_AT_decl_line : 1 <32> DW_AT_sibling : <0x3f> !!! There is no DIE <0x3f>, should be <44> <2><36>: Abbrev Number: 3 (DW_TAG_member) <37> DW_AT_name : bar <3b> DW_AT_decl_file : 1 <3c> DW_AT_decl_line : 4 <3d> DW_AT_type : <0x3f> !!! There is no DIE <0x3f> <41> DW_AT_data_member_location: 0 <42> DW_AT_accessibility: 1 (public) <2><43>: Abbrev Number: 0 <1><44>: Abbrev Number: 4 (DW_TAG_base_type) <45> DW_AT_byte_size : 4 <46> DW_AT_encoding : 5 (signed) <47> DW_AT_name : int ... --------------- The original assembly is generated from a source file and then modified to insert DIE, with that the subsequent DIE references should have been updated, which were not. It is now getting updated to replace hardcoded DIE references with label-calculated references. gdb/testsuite/ChangeLog: 2021-02-16 Alok Kumar Sharma <AlokKumar.Sharma@amd.com> * gdb.dwarf2/pr13961.S: Corrected invalide DIE references.
2021-02-08[gdb/testsuite] Use DW_FORM_ref_addr in gdb.dwarf2/enqueued-cu-base-addr.expTom de Vries1-1/+1
When running test-case gdb.dwarf2/enqueued-cu-base-addr.exp with target board cc-with-dwz, I get: ... gdb compile failed, dwz: enqueued-cu-base-addr: \ Couldn't find DIE at [100] referenced by DW_AT_type from DIE at [d8] ... At 0xd8 we have DIE: ... <1><d8>: Abbrev Number: 3 (DW_TAG_variable) <d9> DW_AT_name : foo <dd> DW_AT_type : <0x100> <e1> DW_AT_const_value : 1 ... referring to: ... <1><100>: Abbrev Number: 3 (DW_TAG_base_type) <101> DW_AT_byte_size : 4 <102> DW_AT_encoding : 5 (signed) <103> DW_AT_name : int ... The reference is inter-CU, but the used abbrev uses DW_FORM_ref4: ... 3 DW_TAG_variable [no children] DW_AT_name DW_FORM_string DW_AT_type DW_FORM_ref4 DW_AT_const_value DW_FORM_sdata DW_AT value: 0 DW_FORM value: 0 ... which is for intra-CU references. Fix this by using a '%' instead of a ':' label prefix in the dwarf assembly. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-02-08 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/enqueued-cu-base-addr.exp: Fix inter-CU reference.
2021-02-05[gdb/testsuite] Add KFAILs for PR symtab/24549Tom de Vries1-1/+13
When an executable contains an index such as a .gdb_index or .debug_names section, gdb ignores the DW_AT_subprogram attribute. This problem has been filed as PR symtab/24549. Add KFAILs for this PR in test-cases gdb.dwarf2/main-subprogram.exp and gdb.fortran/mixed-lang-stack.exp. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-02-05 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/main-subprogram.exp: Add KFAIL for PR symtab/24549. * gdb.fortran/mixed-lang-stack.exp: Same.
2021-02-05[gdb/symtab] Fix duplicate CUs in create_cus_from_debug_names_listTom de Vries1-0/+16
When running test-case gdb.dwarf2/clang-debug-names.exp, I run into the following warning: ... (gdb) file clang-debug-names^M Reading symbols from clang-debug-names...^M warning: Section .debug_aranges in clang-debug-names has duplicate \ debug_info_offset 0xc7, ignoring .debug_aranges.^M ... This is caused by a missing return in commit 3ee6bb113af "[gdb/symtab] Fix incomplete CU list assert in .debug_names". Fix this by adding the missing return, such that we have instead this warning: ... (gdb) file clang-debug-names^M Reading symbols from clang-debug-names...^M warning: Section .debug_aranges in clang-debug-names \ entry at offset 0 debug_info_offset 0 does not exists, \ ignoring .debug_aranges.^M ... which is a known problem filed as PR25969 - "Ignoring .debug_aranges with clang .debug_names". Tested on x86_64-linux. gdb/ChangeLog: 2021-02-05 Tom de Vries <tdevries@suse.de> PR symtab/27307 * dwarf2/read.c (create_cus_from_debug_names_list): Add missing return. gdb/testsuite/ChangeLog: 2021-02-05 Tom de Vries <tdevries@suse.de> PR symtab/27307 * gdb.dwarf2/clang-debug-names.exp: Check file command warnings.
2021-02-02gdb/testsuite: add test for .debug_{rng,loc}lists section without offset arraySimon Marchi3-3/+117
It is possible for the tables in the .debug_{rng,loc}lists sections to not have an array of offsets. In that case, the offset_entry_count field of the header is 0. The forms DW_FORM_{rng,loc}listx (reference by index) can't be used with that table. Instead, the DW_FORM_sec_offset form, which references a {rng,loc}list by direct offset in the section, must be used. From what I saw, this is what GCC currently produces. Add tests for this case. I didn't see any bug related to this, I just think that it would be nice to have coverage for this. A new `-with-offset-array` option is added to the `table` procs, used when generating {rng,loc}lists, to decide whether to generate the offset array. gdb/testsuite/ChangeLog: * lib/dwarf.exp (rnglists): Add -no-offset-array option to table proc. * gdb.dwarf2/rnglists-sec-offset.exp: Add test for .debug_rnglists table without offset array. * gdb.dwarf2/loclists-sec-offset.exp: Add test for .debug_loclists table without offset array. Change-Id: I8e34a7bf68c9682215ffbbf66600da5b7db91ef7
2021-02-02gdb/dwarf: split dwarf2_cu::ranges_base in twoSimon Marchi3-9/+126
Consider the test case added in this patch. It defines a compilation unit with a DW_AT_rnglists_base attribute (used for attributes of form DW_FORM_rnglistx), but also uses DW_AT_ranges of form DW_FORM_sec_offset: 0x00000027: DW_TAG_compile_unit DW_AT_ranges [DW_FORM_sec_offset] (0x0000004c [0x0000000000005000, 0x0000000000006000)) DW_AT_rnglists_base [DW_FORM_sec_offset] (0x00000044) The DW_AT_rnglists_base does not play a role in reading the DW_AT_ranges of form DW_FORM_sec_offset, but it should also not do any harm. This case is currently not handled correctly by GDB. This is not something that a compiler is likely to emit, but in my opinion there's no reason why GDB should fail reading it. The problem is that in partial_die_info::read and a few other places where the same logic is replicated, the cu->ranges_base value, containing the DW_AT_rnglists_base value, is wrongfully added to the DW_AT_ranges value. It is quite messy how to decide whether cu->ranges_base should be added to the attribute's value or not. But to summarize, the only time we want to add it is when the attribute comes from a pre-DWARF 5 split unit file (a .dwo) [1]. In this case, the DW_AT_ranges attribute from the split unit file will have form DW_FORM_sec_offset, pointing somewhere in the linked file's .debug_ranges section. *But* it's not a "true" DW_FORM_sec_offset, in that it's an offset relative to the beginning of that CU's contribution in the section, not relative to the beginning of the section. So in that case, and only that case, do we want to add the ranges base value, which we found from the DW_AT_GNU_ranges_base attribute on the skeleton unit. Almost all instances of the DW_AT_ranges attribute will be found in the split unit (on DW_TAG_subprogram, for example), and therefore need to have the ranges base added. However, the DW_TAG_compile_unit DIE in the skeleton may also have a DW_AT_ranges attribute. For that one, the ranges base must not be added. Once the DIEs have been loaded in GDB, however, the distinction between what's coming from the skeleton and what's coming from the split unit is not clear. It is all merged in one big happy tree. So how do we know if a given attribute comes from the split unit or not? We use the fact that in pre-DWARF 5 split DWARF, DW_AT_ranges is found on the skeleton's DW_TAG_compile_unit (in the linked file) and never in the split unit's DW_TAG_compile_unit. This is why you have this in partial_die_info::read: int need_ranges_base = (tag != DW_TAG_compile_unit && attr.form != DW_FORM_rnglistx); However, with the corner case described above (where we have a DW_AT_rnglists_base attribute and a DW_AT_ranges attribute of form DW_FORM_sec_offset) the condition gets it wrong when it encounters an attribute like DW_TAG_subprogram with a DW_AT_ranges attribute of DW_FORM_sec_offset form: it thinks that it is necessary to add the base, when it reality it is not. The problem boils down to failing to differentiate these cases: - a DW_AT_ranges attribute of form DW_FORM_sec_offset in a pre-DWARF 5 split unit (in which case we need to add the base) - a DW_AT_ranges attribute of form DW_FORM_sec_offset in a DWARF 5 non-split unit (in which case we must not add the base) What makes it unnecessarily complex is that the cu->ranges_base field is overloaded, used to hold the pre-DWARF 5, non-standard DW_AT_GNU_ranges_base and the DWARF 5 DW_AT_rnglists_base. In reality, these two are called "bases" but are not the same thing. The result is that we need twisted conditions to try to determine whether or not we should add the base to the attribute's value. To fix it, split the field in two distinct fields. I renamed everything related to the "old" ranges base to "gnu_ranges_base", to make it clear that it's about the non-standard, pre-DWARF 5 thing. And everything related to the DWARF 5 thing gets renamed "rnglists". I think it becomes much easier to reason this way. The issue described above gets fixed by the fact that the DW_AT_rnglists_base value does not end up in cu->gnu_ranges_base, so cu->gnu_ranges_base stays 0. The condition to determine whether gnu_ranges_base should be added can therefore be simplified back to: tag != DW_TAG_compile_unit ... as it was before rnglistx support was added. Extend the gdb.dwarf2/rnglists-sec-offset.exp to cover this case. I also extended the test case for loclists similarly, just to see if there would be some similar problem. There wasn't, but I think it's not a bad idea to test that case for loclists as well, so I left it in the patch. [1] https://gcc.gnu.org/wiki/DebugFission gdb/ChangeLog: * dwarf2/die.h (struct die_info) <ranges_base>: Split in... <gnu_ranges_base>: ... this... <rnglists_base>: ... and this. * dwarf2/read.c (struct dwarf2_cu) <ranges_base>: Split in... <gnu_ranges_base>: ... this... <rnglists_base>: ... and this. (read_cutu_die_from_dwo): Adjust (dwarf2_get_pc_bounds): Adjust (dwarf2_record_block_ranges): Adjust. (read_full_die_1): Adjust (partial_die_info::read): Adjust. (read_rnglist_index): Adjust. gdb/testsuite/ChangeLog: * gdb.dwarf2/rnglists-sec-offset.exp: Add test for DW_AT_ranges of DW_FORM_sec_offset form plus DW_AT_rnglists_base attribute. * gdb.dwarf2/loclists-sec-offset.exp: Add test for DW_AT_location of DW_FORM_sec_offset plus DW_AT_loclists_base attribute Change-Id: Icd109038634b75d0e6e9d7d1dcb62fb9eb951d83
2021-02-02gdb/testsuite: add .debug_loclists testsSimon Marchi4-0/+345
Add tests for the various issues fixed in the previous patches. Add a new "loclists" procedure to the DWARF assembler, to allow generating .debug_loclists sections. gdb/testsuite/ChangeLog: PR gdb/26813 * lib/dwarf.exp (_handle_DW_FORM): Handle DW_FORM_loclistx. (loclists): New proc. * gdb.dwarf2/loclists-multiple-cus.c: New. * gdb.dwarf2/loclists-multiple-cus.exp: New. * gdb.dwarf2/loclists-sec-offset.c: New. * gdb.dwarf2/loclists-sec-offset.exp: New. Change-Id: I209bcb2a9482762ae943e518998d1f7761f76928
2021-02-02gdb/testsuite: add .debug_rnglists testsSimon Marchi2-0/+182
Add tests for the various issues fixed in the previous patches. Add a new "rnglists" procedure to the DWARF assembler, to allow generating .debug_rnglists sections. A trivial change is required to support the DWARF 5 CU header layout. gdb/testsuite/ChangeLog: PR gdb/26813 * lib/dwarf.exp (_handle_DW_FORM): Handle DW_FORM_rnglistx. (cu): Generate header for DWARF 5. (rnglists): New proc. * gdb.dwarf2/rnglists-multiple-cus.exp: New. * gdb.dwarf2/rnglists-sec-offset.exp: New. Change-Id: I5b297e59c370c60cf671dec19796a6c3b9a9f632
2021-02-02[gdb/symtab] Fix assert in write_one_signatured_typeTom de Vries1-0/+15
When running test-case gdb.dwarf2/fission-reread.exp with target board cc-with-gdb-index, we run into an abort during the generation of the gdb-index by cc-with-tweaks.sh: ... build/gdb/testsuite/cache/gdb.sh: line 1: 27275 Aborted (core dumped) ... This can be reproduced on the command line like this: ... $ gdb -batch ./outputs/gdb.dwarf2/fission-reread/fission-reread \ -ex 'save gdb-index ./outputs/gdb.dwarf2/fission-reread' warning: Could not find DWO TU fission-reread.dwo(0x9022f1ceac7e8b19) \ referenced by TU at offset 0x0 [in module fission-reread] warning: Could not find DWO CU fission-reread.dwo(0x807060504030201) \ referenced by CU at offset 0x561 [in module fission-reread] Aborted (core dumped) ... The abort is a segfault due to a using a nullptr psymtab in write_one_signatured_type. The problem is that we're trying to write index entries for the type unit with signature: ... (gdb) p /x entry->signature $2 = 0x9022f1ceac7e8b19 ... which is a skeleton type unit: ... Contents of the .debug_types section: Compilation Unit @ offset 0x0: Length: 0x4a (32-bit) Version: 4 Abbrev Offset: 0x165 Pointer Size: 4 Signature: 0x9022f1ceac7e8b19 Type Offset: 0x0 <0><17>: Abbrev Number: 2 (DW_TAG_type_unit) <18> DW_AT_comp_dir : /tmp/src/gdb/testsuite <2f> DW_AT_GNU_dwo_name: fission-reread.dwo <42> DW_AT_GNU_pubnames: 0x0 <46> DW_AT_GNU_pubtypes: 0x0 <4a> DW_AT_GNU_addr_base: 0x0 ... referring to a .dwo file, but as the warnings show, the .dwo file is not found. Fix this by skipping the type unit in write_one_signatured_type if psymtab == nullptr. Tested on x86_64-linux. gdb/ChangeLog: 2021-02-02 Tom de Vries <tdevries@suse.de> PR symtab/24620 * dwarf2/index-write.c (write_one_signatured_type): Skip if psymtab == nullptr. gdb/testsuite/ChangeLog: 2021-02-02 Tom de Vries <tdevries@suse.de> PR symtab/24620 * gdb.dwarf2/fission-reread.exp: Add test-case.
2021-02-01[gdb/testsuite] Fix gdb.dwarf2/fission-reread.exp with .gdb_indexTom de Vries10-52/+51
When running test-case gdb.dwarf2/fission-reread.exp with target board cc-with-gdb-index, we run into: ... gdb compile failed, warning: Could not find DWO TU \ fission-reread.dwo(0x9022f1ceac7e8b19) referenced by TU at offset 0x0 \ [in module outputs/gdb.dwarf2/fission-reread/fission-reread] ... The problem is that the .dwo file is not found. There's code added in the .exp file to make sure the .dwo can be found: ... # Make sure we can find the .dwo file, regardless of whether we're # running in parallel mode. gdb_test_no_output "set debug-file-directory [file dirname $binfile]" \ "set debug-file-directory" ... This works normally, but not for the gdb invocation done by cc-with-tweaks.sh for target board cc-with-gdb-index. Fix this by finding the full path to the .dwo file and passing it to the compilation. Tested on x86_64-linux with native and target boards cc-with-gdb-index, cc-with-debug-names and readnow. gdb/testsuite/ChangeLog: 2021-02-01 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/fission-base.S: Pass -DDWO=$dwo. * gdb.dwarf2/fission-loclists-pie.S: Same. * gdb.dwarf2/fission-loclists.S: Same. * gdb.dwarf2/fission-multi-cu.S: Same. * gdb.dwarf2/fission-reread.S: Same. * gdb.dwarf2/fission-base.exp: Use DWO. * gdb.dwarf2/fission-loclists-pie.exp: Same. * gdb.dwarf2/fission-loclists.exp: Same. * gdb.dwarf2/fission-multi-cu.exp: Same. * gdb.dwarf2/fission-reread.exp: Same.
2021-01-29[gdb/breakpoint] Fix stepping past non-stmt line-table entriesTom de Vries2-0/+170
Consider the test-case small.c: ... $ cat -n small.c 1 __attribute__ ((noinline, noclone)) 2 int foo (char *c) 3 { 4 asm volatile ("" : : "r" (c) : "memory"); 5 return 1; 6 } 7 8 int main () 9 { 10 char tpl1[20] = "/tmp/test.XXX"; 11 char tpl2[20] = "/tmp/test.XXX"; 12 int fd1 = foo (tpl1); 13 int fd2 = foo (tpl2); 14 if (fd1 == -1) { 15 return 1; 16 } 17 18 return 0; 19 } ... Compiled with gcc-8 and optimization: ... $ gcc-8 -O2 -g small.c ... We step through the calls to foo, but fail to visit line 13: ... 12 int fd1 = foo (tpl1); (gdb) step foo (c=c@entry=0x7fffffffdea0 "/tmp/test.XXX") at small.c:5 5 return 1; (gdb) step foo (c=c@entry=0x7fffffffdec0 "/tmp/test.XXX") at small.c:5 5 return 1; (gdb) step main () at small.c:14 14 if (fd1 == -1) { (gdb) ... This is caused by the following. The calls to foo are implemented by these insns: .... 4003df: 0f 29 04 24 movaps %xmm0,(%rsp) 4003e3: 0f 29 44 24 20 movaps %xmm0,0x20(%rsp) 4003e8: e8 03 01 00 00 callq 4004f0 <foo> 4003ed: 48 8d 7c 24 20 lea 0x20(%rsp),%rdi 4003f2: 89 c2 mov %eax,%edx 4003f4: e8 f7 00 00 00 callq 4004f0 <foo> 4003f9: 31 c0 xor %eax,%eax ... with corresponding line table entries: ... INDEX LINE ADDRESS IS-STMT 8 12 0x00000000004003df Y 9 10 0x00000000004003df 10 11 0x00000000004003e3 11 12 0x00000000004003e8 12 13 0x00000000004003ed 13 12 0x00000000004003f2 14 13 0x00000000004003f4 Y 15 13 0x00000000004003f4 16 14 0x00000000004003f9 Y 17 14 0x00000000004003f9 ... Once we step out of the call to foo at 4003e8, we land at 4003ed, and gdb enters process_event_stop_test to figure out what to do. That entry has is-stmt=n, so it's not the start of a line, so we don't stop there. However, we do update ecs->event_thread->current_line to line 13, because the frame has changed (because we stepped out of the function). Next we land at 4003f2. Again the entry has is-stmt=n, so it's not the start of a line, so we don't stop there. However, because the frame hasn't changed, we don't update update ecs->event_thread->current_line, so it stays 13. Next we land at 4003f4. Now is-stmt=y, so it's the start of a line, and we'd like to stop here. But we don't stop because this test fails: ... if ((ecs->event_thread->suspend.stop_pc == stop_pc_sal.pc) && (ecs->event_thread->current_line != stop_pc_sal.line || ecs->event_thread->current_symtab != stop_pc_sal.symtab)) { ... because ecs->event_thread->current_line == 13 and stop_pc_sal.line == 13. Fix this by resetting ecs->event_thread->current_line to 0 if is-stmt=n and the frame has changed, such that we have: ... 12 int fd1 = foo (tpl1); (gdb) step foo (c=c@entry=0x7fffffffdbc0 "/tmp/test.XXX") at small.c:5 5 return 1; (gdb) step main () at small.c:13 13 int fd2 = foo (tpl2); (gdb) ... Tested on x86_64-linux, with gcc-7 and gcc-8. gdb/ChangeLog: 2021-01-29 Tom de Vries <tdevries@suse.de> PR breakpoints/26063 * infrun.c (process_event_stop_test): Reset ecs->event_thread->current_line to 0 if is-stmt=n and frame has changed. gdb/testsuite/ChangeLog: 2021-01-29 Tom de Vries <tdevries@suse.de> PR breakpoints/26063 * gdb.dwarf2/dw2-step-out-of-function-no-stmt.c: New test. * gdb.dwarf2/dw2-step-out-of-function-no-stmt.exp: New file.
2021-01-28[gdb/testsuite] Fix ERROR in gdb.dwarf2/dw2-out-of-range-end-of-seq.expTom de Vries1-3/+4
When running test-case gdb.dwarf2/dw2-out-of-range-end-of-seq.exp on a system with debug packages installed, I run into: ... (gdb) maint info line-table^M ... <lots of output> ... ERROR: internal buffer is full. UNRESOLVED: gdb.dwarf2/dw2-out-of-range-end-of-seq.exp: \ END with address 1 eliminated ... Fix this by limiting the output of the command using a regexp. I also noticed that when making the regexp match nothing, meaning the command has no output, the test didn't FAIL. Fixed this by adding a PASS pattern. I also noticed that the FAIL pattern didn't work with -m32, fixed that as well. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2021-01-28 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/dw2-out-of-range-end-of-seq.exp: Add regexp to "maint info line-table". Make PASS pattern more specific. Make FAIL pattern work for -m32.
2021-01-25[gdb/symtab] Handle DW_AT_ranges with DW_FORM_sec_off in partial DIETom de Vries1-1/+4
While looking into a failure in gdb.go/package.exp with gcc-11, I noticed that gdb shows some complaints when loading the executable (also with gcc-10, where the test-case passes): ... $ gdb -batch -iex "set complaints 100" package.10 -ex start During symbol reading: Attribute value is not a constant (DW_FORM_sec_offset) Temporary breakpoint 1 at 0x402ae6: file gdb.go/package1.go, line 8. During symbol reading: Attribute value is not a constant (DW_FORM_sec_offset) During symbol reading: Invalid .debug_rnglists data (no base address) ... Fix this by using as_unsigned () to read DW_AT_ranges in the partial DIE reader, similar to how that is done in dwarf2_get_pc_bounds. Tested on x86_64-linux. gdb/ChangeLog: 2021-01-25 Bernd Edlinger <bernd.edlinger@hotmail.de> Simon Marchi <simon.marchi@polymtl.ca> Tom de Vries <tdevries@suse.de> * dwarf2/read.c (partial_die_info::read): Use as_unsigned () for DW_AT_ranges. gdb/testsuite/ChangeLog: 2021-01-25 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/dw2-ranges-psym.exp (gdb_load_no_complaints): New proc. * lib/gdb.exp: Use gdb_load_no_complaints.
2021-01-04[gdb/symtab] Remove superfluous end-of-sequence markerTom de Vries1-0/+94
While working on PR26935 I noticed that when running test-case gdb.base/morestack.exp with target board unix/-m32/-fPIE/-pie and ld linker, I get this linetable fragment for morestack.S using readelf -wL: ... CU: ../../../../libgcc/config/i386/morestack.S: Line number Starting address View Stmt 109 0xc9c x ... 838 0xe03 x - 0xe04 636 0 x 637 0x3 x - 0x4 ... but with "maint info line-table" I get: ... INDEX LINE ADDRESS IS-STMT 0 END 0x00000004 Y 1 109 0x00000c9c Y ... 110 838 0x00000e03 Y 111 END 0x00000e04 Y ... So, apparently the entries with addresses 0x0 and 0x3 are filtered out because the addresses are out of range, but the same doesn't happen with the end-of-seq terminator. Fix this by filtering out end-of-seq terminators that do not actually terminate anything. Tested on x86_64-linux. gdb/ChangeLog: 2021-01-04 Tom de Vries <tdevries@suse.de> * buildsym.c (buildsym_compunit::record_line): Filter out end-of-seq terminators that do not terminate anything. gdb/testsuite/ChangeLog: 2021-01-04 Tom de Vries <tdevries@suse.de> * gdb.dwarf2/dw2-out-of-range-end-of-seq.exp: New file.