aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2
AgeCommit message (Collapse)AuthorFilesLines
2020-04-08Remove objfile parameter from read_gdb_index_from_bufferSimon Marchi1-5/+3
I noticed this was unused, so remove it. gdb/ChangeLog: * dwarf2/read.c (read_gdb_index_from_buffer): Remove objfile parameter.c. (dwarf2_read_gdb_index): Update.
2020-04-07DWARFv5: Info address command error in gdb with DWARFfv5.nitachra1-4/+19
GDB throws the error 'Unrecognized DWARF opcode 0x02 at 2' when running Info address command with the executable file compiled with -gdwarf-5 flag. This patch fixes this error. Tested by running the testsuite before and after the patch and there is no increase in the number of test cases that fails. Tested with both -gdwarf-4 and -gdwarf-5 flags. Also tested -gslit-dwarf along with -gdwarf-4 as well as -gdwarf-5 flags. Used clang version 10.0.0. This is the test case used- void bar(int arr[], int l, int m, int r) { int i, j, k, n1= m - l + 1, n2= r - m, L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1+ j]; } int main() { int arr[] = {12, 11}; bar(arr,0,1,2); return 0; } clang -gdwarf-5 test.c -o test.out gdb test.out gdb> start gdb> step gdb> step gdb> step gdb> step gdb> info address L Symbol "L" is multi-location: Range 0x7c04007902bc5084-0x67fb876440700: a complex DWARF expression: 0: DW_OP_breg16 1 [$rip] Unrecognized DWARF opcode 0x02 at 2 gdb/ChangeLog: 2020-04-07 Nitika Achra <Nitika.Achra@amd.com> * dwarf2/loc.c (loclist_describe_location): Call the function decode_debug_loclists_ addresses if DWARF version is 5 or more because DW_LLE_start* or DW_LLE_offset_pair with DW_LLE_base_addressx are being emitted in DWARFv5. Add the newly added kind DW_LOC_OFFSET_PAIR also. The length of location description is an unsigned ULEB integer in DWARFv5 instead of unsigned integer.
2020-04-07DWARFv5: Handle location list for split dwarf.nitachra1-5/+13
GDB throws the error '<error reading variable: dwarf2_find_location_ expression: Corrupted DWARF expression.>' while printing the variable value with executable file compiled with -gdwarf-5 and -gdwarf-split flags. This is because DW_LLE_start* or DW_LLE_offset_pair with DW_LLE_base_addressx are being emitted in DWARFv5 location list instead of DW_LLE_GNU*. This patch fixes this error. Tested by running the testsuite before and after the patch and there is no increase in the number of test cases that fails. Tested with both -gdwarf-4 and -gdwarf-5 flags. Also tested -gslit-dwarf along with -gdwarf-4 as well as -gdwarf-5 flags. Used clang version 10.0.0. This is the test case used- void bar(int arr[], int l, int m, int r) { int i, j, k, n1= m - l + 1, n2= r - m, L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1+ j]; } int main() { int arr[] = {12, 11}; bar(arr,0,1,2); return 0; } clang -gdwarf-5 -gsplit-dwarf test.c -o test.out gdb test.out gdb> start gdb> step gdb> step gdb> step gdb> step gdb> p L[0] dwarf2_find_location_expression: Corrupted DWARF expression. gdb/ChangeLog: 2020-04-07 Nitika Achra <Nitika.Achra@amd.com> * dwarf2/loc.c (enum debug_loc_kind): Add a new kind DEBUG_LOC_OFFSET_PAIR. (dwarf2_find_location_expression): Call the function decode_debug_loclists_ addresses if DWARF version is 5 or more. DW_LLE_start* or DW_LLE_offset_pair with DW_LLE_base_addressx are being emitted in DWARFv5 instead of DW_LLE_GNU*. Add applicable base address if the entry is DW_LLE_offset_pair from DWO. (decode_debug_loclists_addresses): Return DEBUG_LOC_OFFSET_PAIR instead of DEBUG_LOC_START_END in case of DW_LLE_offset_pair.
2020-04-07Support for DW_AT_loclists_base and DW_FORM_loclistx.nitachra2-1/+136
Hi Tom, This is the updated series with ChangeLogs edits. Regards, Nitika
2020-04-07gdb: small cleanups in dwarf2_psymtab constructorsSimon Marchi2-9/+4
I noticed that only one of the two dwarf2_psymtab constructors are actually used. The one that is used accepts an `addr` parameter (the base text offset), but its sole caller passes a constant, 0. We want to keep calling the three-arguments standard_psymtab constructor form, however, since it differs from the two-arguments form in subtle ways. Also, I believe the dwarf2_per_cu_data associated to the created dwarf2_psymtab should be passed as a constructor argument. That will help me in a future patchset, to convince myself that the `per_cu_data` field can't be NULL. So this patch: - Removes the two-parameters constructor of dwarf2_psymtab, as it is unused. - Removes the `addr` parameter of the remaining constructor, passing 0 directly to the base class' constructor. - Adds a `per_cu` parameter, to assign the `per_cu_data` field at construction. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_psymtab): Remove two-parameters constructor. Remove `addr` parameter from other constructor and add `per_cu` parameter. * dwarf2/read.c (create_partial_symtab): Update.
2020-04-07[gdb/symtab] Add symbol with inherited DW_AT_const_value to psymtabsTom de Vries1-0/+37
Consider the test-case added in this patch, with resulting dwarf (related to variable aaa): ... <0><d2>: Abbrev Number: 2 (DW_TAG_partial_unit) <1><eb>: Abbrev Number: 4 (DW_TAG_variable) <ec> DW_AT_name : aaa <f0> DW_AT_type : <0xe4> <f4> DW_AT_const_value : 1 <0><10c>: Abbrev Number: 2 (DW_TAG_compile_unit) <10e> DW_AT_name : <artificial> <1><11b>: Abbrev Number: 3 (DW_TAG_variable) <11c> DW_AT_abstract_origin: <0xeb> ... When running the test-case, we see: ... (gdb) p aaa^M No symbol "aaa" in current context.^M (gdb) FAIL: gdb.dwarf2/imported-unit-abstract-const-value.exp: p aaa ... while with target board readnow.exp, we have: ... (gdb) p aaa^M $1 = 1^M ... This is due to the fact that there's no aaa symbol in the partial symtabs: ... Partial symtab for source file <artificial>@0x101 (object 0x351cf40)^M ... Global partial symbols:^M `main', function, 0x4004a7^M ^M ... which is due to the fact that when attempting to add the symbol corresponding to DIE 0x11b in add_partial_symbol: ... (gdb) p /x pdi->sect_off $4 = 0x11b (gdb) p pdi.has_const_value $5 = 0 ... it seems the DW_AT_const_value was not inherited from DIE 0xeb, and consequently we leave without adding a partial symbol. Fix this by making sure that partial_die_info::has_const_value is inherited in partial_die_info::fixup. Build and reg-tested on x86_64-linux. Tested test-case with target boards readnow, cc-with-gdb-index and cc-with-debug-names. The "print aaa" test fails for cc-with-gdb-index, that's PR25791, the test passes when applying the corresponding proposed patch. gdb/ChangeLog: 2020-04-07 Tom de Vries <tdevries@suse.de> PR symtab/25796 * dwarf2/read.c (can_have_DW_AT_const_value_p): New function. (partial_die_info::fixup): Inherit has_const_value. gdb/testsuite/ChangeLog: 2020-04-07 Tom de Vries <tdevries@suse.de> PR symtab/25796 * gdb.dwarf2/imported-unit-abstract-const-value.exp: New file.
2020-04-06Handle complex error type in read_base_typeTom Tromey1-1/+13
It turns out there was one more bug in the earlier complex series: read_base_type could cause an assertion failure on some platforms. I found this running the AdaCore internal test suite, but you can also see it by running gdb's "gdb.cp" tests for x86 (not x86-64). In particular, the DW_ATE_complex_float case calls dwarf2_init_complex_target_type, which calls dwarf2_init_float_type, which can return a type using TYPE_CODE_ERROR. This patch changes the DWARF reader to handle this case, the same way that the f-lang.c patch did. Perhaps init_complex_type really should be changed to allow TYPE_CODE_ERROR? I was not sure. Tested on x86-64 Fedora 30, using an x86 build. I'm checking this in. gdb/ChangeLog 2020-04-06 Tom Tromey <tromey@adacore.com> * dwarf2/read.c (read_base_type) <DW_ATE_complex_float>: Handle TYPE_CODE_ERROR.
2020-04-03Fix attributes of typed enums of typedefsHannes Domani1-4/+6
For this enum: typedef unsigned char byte; enum byte_enum : byte { byte_val = 128 }; The unsigned attribute is not set: (gdb) p byte_val $1 = -128 That's because it uses the attributes of the 'byte' typedef for the enum. So this changes it to use the attributes of the underlying 'unsigned char' instead. gdb/ChangeLog: 2020-04-03 Hannes Domani <ssbssa@yahoo.de> PR gdb/25325 * dwarf2/read.c (read_enumeration_type): Fix typed enum attributes. gdb/testsuite/ChangeLog: 2020-04-03 Hannes Domani <ssbssa@yahoo.de> PR gdb/25325 * gdb.cp/typed-enum.cc: New test. * gdb.cp/typed-enum.exp: New file.
2020-04-03Fix DWARF disassembly of DW_OP_const_typeTom Tromey1-0/+6
While debugging another issue, I noticed that disassembling a DWARF expression using DW_OP_const_type did not work. disassemble_dwarf_expression was not properly decoding this operation. This patch fixes the problem. Tested by re-debugging gdb. I didn't write a test case because that seemed like overkill for what's essentially a maintainer's helper. The expression evaluator does decode this properly, so no other change was needed. gdb/ChangeLog 2020-04-03 Tom Tromey <tromey@adacore.com> * dwarf2/loc.c (disassemble_dwarf_expression) <DW_OP_const_type>: Read constant block.
2020-04-02Micro-optimize partial_die_info::readTom Tromey1-4/+3
While profiling the DWARF reader, I noticed that partial_die_info::read creates a vector to store attributes. However, the vector is not needed, as this code only processes a single attribute at a time. This patch removes the vector. On my machine, this improves the time of "./gdb ./gdb" from 2.22 seconds to 1.92 seconds (mean times over 10 runs). Note that the attribute is initialized by read_attribute, so it does not need any special initialization. Avoiding this also improves performance a bit. Tested on x86-64 Fedora 30. I'm checking this in. gdb/ChangeLog 2020-04-02 Tom Tromey <tromey@adacore.com> * dwarf2/read.c (partial_die_info::read): Do not create a vector of attributes.
2020-04-02[gdb/ada] Fix -readnow FAILsTom de Vries1-3/+29
When running test-case gdb.ada/access_to_packed_array we have: ... (gdb) print pack.a^M $1 = (0 => 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)^M ... but with target board readnow.exp, we have instead: ... (gdb) print pack.a^M 'pack.a' has unknown type; cast it to its declared type^M ... The symbol is normally found by the map_matching_symbols call in ada-lang.c:add_nonlocal_symbols: ... for (objfile *objfile : current_program_space->objfiles ()) { data.objfile = objfile; objfile->sf->qf->map_matching_symbols (objfile, lookup_name, domain, global, callback, (is_wild_match ? NULL : compare_names)); ... which maps onto psym_map_matching_symbols. Function psym_map_matching_symbols iterates over all the partial symtabs, and: - if not expanded, searches in the partial symtab: - if not found, continues to the next - if found, expands into full symtab - searches in the full symtab However, with -readnow the call maps onto dw2_map_matching_symbols instead, which is unimplemented, and consequently no symbol is found. Fix this by detecting -readnow in dw2_map_matching_symbols, and handling that appropriately given that partial symtabs are not present, and full symtabs are: iterate over all the symtabs and search them. Tested on x86_64-linux, with native and target board -readnow. This removes 217 FAILs with board -readnow. gdb/ChangeLog: 2020-04-02 Tom de Vries <tdevries@suse.de> PR ada/24671 * dwarf2/read.c (dw2_map_matching_symbols): Handle -readnow.
2020-04-02[gdb] Use partial symbol table to find language for mainTom de Vries1-0/+2
When language is set to auto, part of loading an executable is to update the language accordingly. This is implemented by set_initial_language. The implementation of set_initial_language works as follows: - check if any objfile in the progspace has name_of_main/language_of_main set, and if so, use the first one found. [ This is what you get f.i. when using dwarf with DW_AT_main_subprogram. ] - otherwise, check for known names in the minimal symbols, and either: - use the associated language if any (f.i. for ada), or - lookup the symbol in the symtab for the name and use the symbol language (f.i. for c/c++). The symbol lookup can be slow though. In the case of the cc1 binary from PR23710 comment 1, getting to the initial prompt takes ~8s: ... $ time.sh gdb cc1 -batch -ex "show language" The current source language is "auto; currently c++". maxmem: 1272260 real: 8.05 user: 7.73 system: 0.38 ... but if we skip guessing the initial language by setting it instead, it takes only ~4s: ... $ time.sh gdb -iex "set language c++" cc1 -batch -ex "show language" The current source language is "c++". maxmem: 498272 real: 3.99 user: 3.90 system: 0.15 ... In both cases, we load the partial symbols for the executable, but in the first case only we also do a lookup of main, which causes the corresponding partial symtab to be expanded into a full symtab. Ideally, we'd like to get the language of the symbol without triggering expansion into a full symtab, and get the speedup without having to set the language manually. There's a related fixme in the header comment of set_initial_language: ... /* Set the initial language. FIXME: A better solution would be to record the language in the psymtab when reading partial symbols, and then use it (if known) to set the language. This would be a win for formats that encode the language in an easily discoverable place, such as DWARF. For stabs, we can jump through hoops looking for specially named symbols or try to intuit the language from the specific type of stabs we find, but we can't do that until later when we read in full symbols. */ void set_initial_language (void) ... Since we're already tracking the language of partial symbols, use this to set the language for the main symbol. Note that this search in partial symbol tables is not guaranteed to yield the same result as the lookup_symbol_in_language call currently done in set_initial_language. Build and reg-tested on x86_64-linux. gdb/ChangeLog: 2020-04-02 Tom de Vries <tdevries@suse.de> * dwarf2/read.c (dwarf2_gdb_index_functions, dwarf2_debug_names_functions): Init lookup_global_symbol_language with NULL. * psymtab.c (psym_lookup_global_symbol_language): New function. (psym_functions): Init psym_lookup_global_symbol_language with psym_lookup_global_symbol_language. * symfile-debug.c (debug_sym_quick_functions): Init lookup_global_symbol_language with NULL. * symfile.c (set_initial_language): Remove fixme comment. * symfile.h (struct quick_symbol_functions): Add lookup_global_symbol_language. * symtab.c (find_quick_global_symbol_language): New function. (find_main_name): Use find_quick_global_symbol_language. gdb/testsuite/ChangeLog: 2020-04-02 Tom de Vries <tdevries@suse.de> * gdb.base/main-psymtab.exp: New file.
2020-04-01Change how complex types are createdTom Tromey1-1/+1
This patch changes how complex types are created. init_complex_type and arch_complex_type are unified, and complex types are reused, by attaching them to the underlying scalar type. gdb/ChangeLog 2020-04-01 Tom Tromey <tom@tromey.com> * stabsread.c (rs6000_builtin_type, read_sun_floating_type) (read_range_type): Update. * mdebugread.c (basic_type): Update. * go-lang.c (build_go_types): Use init_complex_type. * gdbtypes.h (struct main_type) <complex_type>: New member. (init_complex_type): Update. (arch_complex_type): Don't declare. * gdbtypes.c (init_complex_type): Remove "objfile" parameter. Make name if none given. Use alloc_type_copy. Look for cached complex type. (arch_complex_type): Remove. (gdbtypes_post_init): Use init_complex_type. * f-lang.c (build_fortran_types): Use init_complex_type. * dwarf2/read.c (read_base_type): Update. * d-lang.c (build_d_types): Use init_complex_type. * ctfread.c (read_base_type): Update.
2020-04-01Avoid copying in lookup_name_infoTom Tromey1-1/+1
lookup_name_info always copies the name that is passed in. However, normally a copy is not needed. This patch changes this class to avoid copying. This required changing the "name" method to return something else; I chose a gdb::string_view, to avoid excessive calls to strlen in the code using the lookup_name_info. However, as this class does not allow an arbitrary string_view, I've also added a c_str method that guarantees a \0-terminated result -- a pedantic difference but one that respects the string_view contract, IMO. gdb/ChangeLog 2020-04-01 Tom Tromey <tromey@adacore.com> * symtab.h (class lookup_name_info) <lookup_name_info>: Change "name" parameter to rvalue reference. Initialize m_name_holder. <lookup_name_info>: New overloads. <name>: Return gdb::string_view. <c_str>: New method. <make_ignore_params>: Update. <search_name_hash>: Update. <language_lookup_name>: Return const char *. <m_name>: Change type. * symtab.c (demangle_for_lookup_info::demangle_for_lookup_info) (demangle_for_lookup_info::demangle_for_lookup_info): Update. (lookup_name_info::match_any): Update. * psymtab.c (match_partial_symbol, lookup_partial_symbol): Update. * minsyms.c (linkage_name_str): Update. * language.c (default_symbol_name_matcher): Update. * dwarf2/read.c (mapped_index_base::find_name_components_bounds): Update. * ada-lang.c (ada_fold_name): Change parameter to string_view. (ada_lookup_name_info::ada_lookup_name_info): Update. (literal_symbol_name_matcher): Update.
2020-03-31Don't pass NULL to memcpy in gdbTom Tromey1-2/+3
I compiled gdb with -fsanitize=undefined and ran the test suite. A couple of reports came from passing NULL to memcpy, e.g.: [...]btrace-common.cc:176:13: runtime error: null pointer passed as argument 2, which is declared to never be null While it would be better to fix this in the standard, in the meantime it seems easy to avoid this error. gdb/ChangeLog 2020-03-31 Tom Tromey <tromey@adacore.com> * dwarf2/abbrev.c (abbrev_table::read): Conditionally call memcpy. gdbsupport/ChangeLog 2020-03-31 Tom Tromey <tromey@adacore.com> * btrace-common.cc (btrace_data_append): Conditionally call memcpy.
2020-03-29gdb: rename partial_symtab::read_dependencies to expand_dependenciesSimon Marchi1-2/+2
This method calls partial_symtab::expand_psymtab on all dependencies of a psymtab. Given that there is also a partial_symtab::read_symtab method, I think it would be clearer to name this function expand_dependencies, rather than read_dependencies. gdb/ChangeLog: * psympriv.h (partial_symtab) <read_dependencies>: Rename to... <expand_dependencies>: ... this. * psymtab.c (partial_symtab::read_dependencies): Rename to... (partial_symtab::expand_dependencies): ... this. * dwarf2/read.c (dwarf2_include_psymtab) <expand_psymtab>: Update. (dwarf2_psymtab::expand_psymtab): Update. * dbxread.c (dbx_psymtab_to_symtab_1): Update. * mdebugread.c (psymtab_to_symtab_1): Update. * xcoffread.c (xcoff_psymtab_to_symtab_1): Update.
2020-03-28Fix comment in dwarf2/attribute.hTom Tromey1-3/+3
I noticed that a comment in dwarf2/attribute.h still referred to dwarf2_get_attr_constant_value. However, this is now a method on struct attribute. gdb/ChangeLog 2020-03-28 Tom Tromey <tom@tromey.com> * dwarf2/attribute.h (struct attribute) <form_is_constant>: Update comment.
2020-03-28Fix formatting of read_attribute_reprocessTom Tromey1-2/+3
I noticed that the start of read_attribute_reprocess had the wrong formatting. This patch fixes it. gdb/ChangeLog 2020-03-28 Tom Tromey <tom@tromey.com> * dwarf2/read.c (read_attribute_reprocess): Fix formatting.
2020-03-26Change two functions to be methods on struct attributeTom Tromey3-60/+67
This changes dwarf2_get_ref_die_offset and dwarf2_get_attr_constant_value to be methods on struct attribute. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (handle_data_member_location, dwarf2_add_field) (mark_common_block_symbol_computed, read_tag_string_type) (attr_to_dynamic_prop, read_subrange_type): Update. (dwarf2_get_ref_die_offset, dwarf2_get_attr_constant_value): Move to be methods on struct attribute. (skip_one_die, process_imported_unit_die, read_namespace_alias) (read_call_site_scope, partial_die_info::read) (partial_die_info::read, lookup_die_type, follow_die_ref): Update. * dwarf2/attribute.c (attribute::get_ref_die_offset): New method, from dwarf2_get_ref_die_offset. (attribute::constant_value): New method, from dwarf2_get_attr_constant_value. * dwarf2/attribute.h (struct attribute) <get_ref_die_offset>: Declare method. <constant_value>: New method.
2020-03-26Move DWARF-constant stringifying code to new fileTom Tromey3-93/+153
This moves the DWARF debugging functions that stringify various constants to a new file, dwarf2/stringify.c. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (dwarf_unit_type_name, dwarf_tag_name) (dwarf_attr_name, dwarf_form_name, dwarf_bool_name) (dwarf_type_encoding_name): Move to stringify.c. * Makefile.in (COMMON_SFILES): Add dwarf2/stringify.c. * dwarf2/stringify.c: New file. * dwarf2/stringify.h: New file.
2020-03-26Rewrite new die_info methodsTom Tromey1-12/+16
This rewrites the two new die_info methods to iterate over attributes rather than to do two separate searches. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/die.h (struct die_info) <addr_base, ranges_base>: Rewrite.
2020-03-26Change two more functions to be methods on die_infoTom Tromey2-31/+29
This changes lookup_addr_base and lookup_ranges_base to be methods on die_info. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/die.h (struct die_info) <addr_base, ranges_base>: New methods. * dwarf2/read.c (lookup_addr_base): Move to die.h. (lookup_ranges_base): Likewise. (read_cutu_die_from_dwo, read_full_die_1): Update.
2020-03-26Remove sibling_dieTom Tromey1-36/+26
The sibling_die helper function does not seem to add much value, considering that many other fields of die_info are directly accessed. So, this removes it. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (read_import_statement, read_file_scope) (read_type_unit_scope, inherit_abstract_dies, read_func_scope) (read_lexical_block_scope, read_call_site_scope) (dwarf2_get_subprogram_pc_bounds, get_scope_pc_bounds) (handle_struct_member_die, process_structure_scope) (update_enumeration_type_from_children) (process_enumeration_scope, read_array_type, read_common_block) (read_namespace, read_module, read_subroutine_type): Update. (sibling_die): Remove.
2020-03-26Change dwarf2_attr_no_follow to be a methodTom Tromey2-29/+19
This changes dwarf2_attr_no_follow to be a method on die_info. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (lookup_addr_base, lookup_ranges_base) (build_type_psymtabs_reader, read_structure_type) (read_enumeration_type, read_full_die_1): Update. (dwarf2_attr_no_follow): Move to die.h. * dwarf2/die.h (struct die_info) <attr>: New method.
2020-03-26Remove dwarf2_cu::base_knownTom Tromey1-30/+17
This removes dwarf2_cu::base_known, changing base_address to be a gdb::optional. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (struct dwarf2_cu) <base_known>: Remove. <base_address>: Now an optional. (dwarf2_find_base_address, dwarf2_rnglists_process) (dwarf2_ranges_process, fill_in_loclist_baton) (dwarf2_symbol_mark_computed): Update.
2020-03-26Move die_info to new headerTom Tromey2-39/+63
This moves struct die_info to a new header, dwarf2/die.h. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (struct die_info): Move to die.h. * dwarf2/die.h: New file.
2020-03-26Move more code to line-header.cTom Tromey3-329/+352
This moves some more code out of read.c and into line-header.c. dwarf_decode_line_header is split into two -- the part remaining in read.c handles interfacing to the dwarf2_cu; while the part in line-header.c (more or less) purely handles the actual decoding. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/line-header.h (dwarf_decode_line_header): Declare. * dwarf2/read.c (dwarf2_statement_list_fits_in_line_number_section_complaint): Move to line-header.c. (read_checked_initial_length_and_offset, read_formatted_entries): Likewise. (dwarf_decode_line_header): Split into two. * dwarf2/line-header.c (dwarf2_statement_list_fits_in_line_number_section_complaint): Move from read.c. (read_checked_initial_length_and_offset, read_formatted_entries): Likewise. (dwarf_decode_line_header): New function, split from read.c.
2020-03-26Convert read_indirect_line_string to a methodTom Tromey2-20/+20
This changes read_indirect_line_string to be a method on dwarf2_per_objfile. This makes it a bit simpler to share between files. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.h (struct dwarf2_per_objfile) <read_line_string>: Declare method. * dwarf2/read.c (read_attribute_value): Update. (dwarf2_per_objfile::read_line_string): Rename from read_indirect_line_string. (read_formatted_entries): Update.
2020-03-26Trivial fix in dwarf_decode_macro_bytesTom Tromey1-3/+3
One spot in dwarf_decode_macro_bytes could use the existing "objfile" local variable. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/macro.c (dwarf_decode_macro_bytes): Use objfile local variable.
2020-03-26Use a const dwarf2_section_info in macro readerTom Tromey2-6/+7
This changes the DWARF macro reader to use a const dwarf2_section_info. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/macro.h (dwarf_decode_macros): Make section parameter const. * dwarf2/macro.c (skip_form_bytes, skip_unknown_opcode) (dwarf_decode_macro_bytes, dwarf_decode_macros): Make section parameter const.
2020-03-26Use a const line_header in macro readerTom Tromey3-5/+5
This changes the DWARF macro reader to use a const line_header. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (dwarf_decode_macros): Make "lh" const. * dwarf2/macro.h (dwarf_decode_macros): Constify "lh" parameter. * dwarf2/macro.c (macro_start_file): Constify "lh" parameter. (dwarf_decode_macro_bytes, dwarf_decode_macros): Likewise.
2020-03-26Make some line_header methods constTom Tromey2-6/+16
This changes a few line_header methods to be const. In some cases, a const overload is added. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/line-header.h (struct line_header) <is_valid_file_index, file_names_size, file_full_name, file_file_name>: Use const. <file_name_at, file_names>: Add const overload. * dwarf2/line-header.c (line_header::file_file_name) (line_header::file_full_name): Update.
2020-03-26Move code to new file dwarf2/macro.cTom Tromey3-830/+902
This moves some more code out of dwarf2/read.c, introducing new files dwarf2/macro.c and dwarf2/macro.h. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (dwarf2_macro_malformed_definition_complaint) (macro_start_file, consume_improper_spaces) (parse_macro_definition, skip_form_bytes, skip_unknown_opcode) (dwarf_parse_macro_header, dwarf_decode_macro_bytes) (dwarf_decode_macros): Move to macro.c. * dwarf2/macro.c: New file. * dwarf2/macro.h: New file. * Makefile.in (COMMON_SFILES): Add dwarf2/macro.c.
2020-03-26Add dwarf2_section_info::read_string methodTom Tromey3-49/+33
This moves a string-reading function to be a method on dwarf2_section_info, and then updates the users. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/section.h (struct dwarf2_section_info) <read_string>: New method. * dwarf2/section.c: New method. From read_indirect_string_at_offset_from. * dwarf2/read.c (mapped_debug_names::namei_to_name): Update. (read_indirect_string_at_offset_from): Move to section.c. (read_indirect_string_at_offset): Rewrite. (read_indirect_line_string_at_offset): Remove. (read_indirect_string, read_indirect_line_string) (dwarf_decode_macro_bytes): Update.
2020-03-26Convert dwarf2_section_buffer_overflow_complaint to a methodTom Tromey3-11/+11
This changes dwarf2_section_buffer_overflow_complaint to be a method on dwarf2_section_info. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/section.h (struct dwarf2_section_info) <overload_complaint>: Declare. (dwarf2_section_buffer_overflow_complaint): Don't declare. * dwarf2/section.c (dwarf2_section_info::overflow_complaint): Rename from dwarf2_section_buffer_overflow_complaint. * dwarf2/read.c (skip_one_die, partial_die_info::read) (skip_form_bytes, dwarf_decode_macro_bytes): Update.
2020-03-26Move dwarf2_section_buffer_overflow_complaint to dwarf2/section.cTom Tromey3-9/+13
This moves dwarf2_section_buffer_overflow_complaint to dwarf2/section.c. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/section.h (dwarf2_section_buffer_overflow_complaint): Declare. * dwarf2/section.c (dwarf2_section_buffer_overflow_complaint): Move from read.c. * dwarf2/read.c (dwarf2_section_buffer_overflow_complaint): Move to section.c.
2020-03-26Split dwarf_decode_macros into two overloadsTom Tromey1-43/+59
This splits dwarf_decode_macros into two overloads -- one that's suitable for splitting into a separate file, and one that finds the correct section and should remain in dwarf2/read.c. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (dwarf_decode_macros): Split into two overloads.
2020-03-26Change dwarf_decode_macro_bytes calling conventionTom Tromey1-10/+13
This changes dwarf_decode_macro_bytes to accept a buildsym_compunit rather than a dwarf2_cu. This enables some subsequent changes; and also makes the function accept a "more specific" parameter. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (macro_start_file): Change "cu" parameter to "builder". (dwarf_decode_macro_bytes): Likewise. Add dwarf2_per_objfile parameter. (dwarf_decode_macros): Update.
2020-03-26Add dwz.c and dwz_file::read_stringTom Tromey3-32/+49
This changes read_indirect_string_from_dwz to be a method on the dwz_file, and adds a new dwarf2/dwz.c file. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.c (read_attribute_value): Update. (read_indirect_string_from_dwz): Move to dwz.c; change into method. (dwarf_decode_macro_bytes): Update. * dwarf2/dwz.h (struct dwz_file) <read_string>: Declare method. * dwarf2/dwz.c: New file. * Makefile.in (COMMON_SFILES): Add dwz.c.
2020-03-26Introduce dwarf2/dwz.hTom Tromey5-31/+61
This moves "struct dwz_file" to a new header file, dwarf2/dwz.h. gdb/ChangeLog 2020-03-26 Tom Tromey <tom@tromey.com> * dwarf2/read.h (struct dwz_file): Move to dwz.h. * dwarf2/read.c: Add include. * dwarf2/index-write.c: Add include. * dwarf2/index-cache.c: Add include. * dwarf2/dwz.h: New file.
2020-03-20Make dwarf2_evaluate_property parameter constTom Tromey2-3/+3
dwarf2_evaluate_property should not modify its "addr_stack" parameter's contents. This patch makes this part of the API, by marking it const. gdb/ChangeLog 2020-03-20 Tom Tromey <tromey@adacore.com> * dwarf2/loc.h (dwarf2_evaluate_property): Make "addr_stack" const. * dwarf2/loc.c (dwarf2_evaluate_property): Make "addr_stack" const.
2020-03-17[gdb] Skip imports of c++ CUsTom de Vries2-0/+28
The DWARF standard appendix E.1 describes techniques that can be used for compression and deduplication: DIEs can be factored out into a new compilation unit, and referenced using DW_FORM_ref_addr. Such a new compilation unit can either use a DW_TAG_compile_unit or DW_TAG_partial_unit. If a DW_TAG_compile_unit is used, its contents is evaluated by consumers as though it were an ordinary compilation unit. If a DW_TAG_partial_unit is used, it's only considered by consumers in the context of a DW_TAG_imported_unit. An example of when DW_TAG_partial_unit is required is when the factored out DIEs are not top-level, f.i. because they were children of a namespace. In such a case the corresponding DW_TAG_imported_unit will occur as child of the namespace. In the case of factoring out DIEs from c++ compilation units, we can factor out into a new DW_TAG_compile_unit, and no DW_TAG_imported_unit is required. This begs the question how to interpret a top-level DW_TAG_imported_unit of a c++ DW_TAG_compile_unit compilation unit. The semantics of DW_TAG_imported_unit describe that the imported unit logically appears at the point of the DW_TAG_imported_unit entry. But it's not clear what the effect should be in this case, since all the imported DIEs are already globally visible anyway, due to the use of DW_TAG_compile_unit. So, skip top-level imports of c++ DW_TAG_compile_unit compilation units in process_imported_unit_die. Using the cc1 binary from PR23710 comment 1 and setting a breakpoint on do_rpo_vn: ... $ gdb \ -batch \ -iex "maint set dwarf max-cache-age 316" \ -iex "set language c++" \ -ex "b do_rpo_vn" \ cc1 ... we get a 8.1% reduction in execution time, due to reducing the number of partial symtabs expanded into full symtabs from 212 to 175. Build and reg-tested on x86_64-linux. gdb/ChangeLog: 2020-03-17 Tom de Vries <tdevries@suse.de> PR gdb/23710 * dwarf2/read.h (struct dwarf2_per_cu_data): Add unit_type and lang fields. * dwarf2/read.c (process_psymtab_comp_unit): Initialize unit_type and lang fields. (process_imported_unit_die): Skip import of c++ CUs.
2020-03-16Fix dwarf2_name caching bugTom Tromey1-10/+8
PR gdb/25663 points out that dwarf2_name will cache a value in the bcache and then return a substring. However, this substring return is only done on the branch that caches the value -- so if the function is called twice with the same arguments, it will return different values. This patch fixes this problem. This area is strange. We cache the entire demangled string, but only return the suffix. I looked at caching just the suffix, but it turns out that anonymous_struct_prefix assumes that the entire string is stored. Also weird is that this code is demangling the linkage name and then storing the demangled form back into the linkage name attribute -- that seems bad, because what if some code wants to find the actual linkage name? Fixing these issues was non-trivial, though; and in the meantime this patch seems like an improvement. Regression tested on x86-64 Fedora 30. gdb/ChangeLog 2020-03-16 Tom Tromey <tromey@adacore.com> PR gdb/25663: * dwarf2/read.c (dwarf2_name): Strip leading namespaces after putting value into bcache.
2020-03-11[gdb] Fix segv in "maint print symbols" for ada execTom de Vries1-1/+5
When using the executable from test-case gdb.ada/access_to_packed_array.exp (read-in using -readnow) and printing the symbols using "maint print symbols", we run into a segv: ... $ gdb -readnow -batch access_to_packed_array/foo -ex "maint print symbols" ... info: array (<>) of character; computed at runtime ptr: range 0 .. 2147483647; computed at runtime Aborted (core dumped) ... What happens is that dwarf2_evaluate_property gets called and sets the local frame variable to the current frame, which happens to be NULL. Subsequently the PROP_LOCLIST handling code is executed, where get_frame_address_in_block gets called with argument NULL, and the segv is triggered. Fix this by handling a NULL frame in the PROP_LOCLIST handling code in dwarf2_evaluate_property. Build and reg-tested on x86_64-linux. gdb/ChangeLog: 2020-03-11 Tom de Vries <tdevries@suse.de> * dwarf2/loc.c (dwarf2_evaluate_property): Handle NULL frame in PROP_LOCLIST handling code. gdb/testsuite/ChangeLog: 2020-03-11 Tom de Vries <tdevries@suse.de> * gdb.ada/access_to_packed_array.exp: Test printing of expanded symtabs.
2020-03-10gdb: Add support for tracking the DWARF line table is-stmt fieldAndrew Burgess1-6/+7
This commit brings support for the DWARF line table is_stmt field to GDB. The is_stmt field is used by the compiler when a single source line is split into multiple assembler instructions, especially if the assembler instructions are interleaved with instruction from other source lines. The compiler will set the is_stmt flag false from some instructions from the source lines, these instructions are not a good place to insert a breakpoint in order to stop at the source line. Instructions which are marked with the is_stmt flag true are a good place to insert a breakpoint for that source line. Currently GDB ignores all instructions for which is_stmt is false. This is fine in a lot of cases, however, there are some cases where this means the debug experience is not as good as it could be. Consider stopping at a random instruction, currently this instruction will be attributed to the last line table entry before this point for which is_stmt was true - as these are the only line table entries that GDB tracks. This can easily be incorrect in code with even a low level of optimisation. With is_stmt tracking in place, when stopping at a random instruction we now attribute the instruction back to the real source line, even when is_stmt is false for that instruction in the line table. When inserting breakpoints we still select line table entries for which is_stmt is true, so the breakpoint placing behaviour should not change. When stepping though code (at the line level, not the instruction level) we will still stop at instruction where is_stmt is true, I think this is more likely to be the desired behaviour. Instruction stepping is, of course, unchanged, stepping one instruction at a time, but we should now report more accurate line table information with each instruction step. The original motivation for this work was a patch posted by Bernd here: https://sourceware.org/ml/gdb-patches/2019-11/msg00792.html As part of that thread it was suggested that many issues would be resolved if GDB supported line table views, this isn't something I've attempted in this patch, though reading the spec, it seems like this would be a useful feature to support in GDB in the future. The spec is here: http://dwarfstd.org/ShowIssue.php?issue=170427.1 And Bernd gives a brief description of the benefits here: https://sourceware.org/ml/gdb-patches/2020-01/msg00147.html With that all said, I think that there is benefit to having proper is_stmt support regardless of whether we have views support, so I think we should consider getting this in first, and then building view support on top of this. The gdb.cp/step-and-next-inline.exp test is based off a test proposed by Bernd Edlinger in this message: https://sourceware.org/ml/gdb-patches/2019-12/msg00842.html gdb/ChangeLog: * buildsym-legacy.c (record_line): Pass extra parameter to record_line. * buildsym.c (buildsym_compunit::record_line): Take an extra parameter, reduce duplication in the line table, and record the is_stmt flag in the line table. * buildsym.h (buildsym_compunit::record_line): Add extra parameter. * disasm.c (do_mixed_source_and_assembly_deprecated): Ignore non-statement lines. * dwarf2/read.c (dwarf_record_line_1): Add extra parameter, pass this to the symtab builder. (dwarf_finish_line): Pass extra parameter to dwarf_record_line_1. (lnp_state_machine::record_line): Pass a suitable is_stmt flag through to dwarf_record_line_1. * infrun.c (process_event_stop_test): When stepping, don't stop at a non-statement instruction, and only refresh the step info when we land in the middle of a line's range. Also add an extra comment. * jit.c (jit_symtab_line_mapping_add_impl): Initialise is_stmt field. * record-btrace.c (btrace_find_line_range): Only record lines marked as is-statement. * stack.c (frame_show_address): Show the frame address if we are in a non-statement sal. * symmisc.c (dump_symtab_1): Print the is_stmt flag. (maintenance_print_one_line_table): Print a header for the is_stmt column, and include is_stmt information in the output. * symtab.c (find_pc_sect_line): Find lines marked as statements in preference to non-statements. (find_pcs_for_symtab_line): Prefer is-statement entries. (find_line_common): Likewise. * symtab.h (struct linetable_entry): Add is_stmt field. (struct symtab_and_line): Likewise. * xcoffread.c (arrange_linetable): Initialise is_stmt field when arranging the line table. gdb/testsuite/ChangeLog: * gdb.cp/step-and-next-inline.cc: New file. * gdb.cp/step-and-next-inline.exp: New file. * gdb.cp/step-and-next-inline.h: New file. * gdb.dwarf2/dw2-is-stmt.c: New file. * gdb.dwarf2/dw2-is-stmt.exp: New file. * gdb.dwarf2/dw2-is-stmt-2.c: New file. * gdb.dwarf2/dw2-is-stmt-2.exp: New file. * gdb.dwarf2/dw2-ranges-base.exp: Update line table pattern.
2020-03-07[gdb] Support anonymous typedef generated by gcc -feliminate-dwarf2-dupsTom de Vries1-0/+10
Gcc supports an option -feliminate-dwarf2-dups (up until gcc-7, removed in gcc-8). When running tests with target board unix/-feliminate-dwarf2-dups, we run into: ... (gdb) PASS: gdb.ada/arraydim.exp: print m'length(3) ptype global_3dim_for_gdb_testing^M type = array (Unexpected type in ada_discrete_type_low_bound.^M (gdb) FAIL: gdb.ada/arraydim.exp: ptype global_3dim_for_gdb_testing ... The DWARF for the variable global_3dim_for_gdb_testing looks as follows: ... <0><824>: Abbrev Number: 1 (DW_TAG_compile_unit) <825> DW_AT_name : src/gdb/testsuite/gdb.ada/arraydim/inc.c <1><832>: Abbrev Number: 2 (DW_TAG_array_type) <833> DW_AT_type : <0x874> <2><837>: Abbrev Number: 3 (DW_TAG_subrange_type) <838> DW_AT_type : <0x84a> <83c> DW_AT_upper_bound : 0 <2><83d>: Abbrev Number: 3 (DW_TAG_subrange_type) <83e> DW_AT_type : <0x84a> <842> DW_AT_upper_bound : 1 <2><843>: Abbrev Number: 3 (DW_TAG_subrange_type) <844> DW_AT_type : <0x84a> <848> DW_AT_upper_bound : 2 <2><849>: Abbrev Number: 0 <1><84a>: Abbrev Number: 4 (DW_TAG_typedef) <84b> DW_AT_type : <0x86d> <1><84f>: Abbrev Number: 0 <0><85b>: Abbrev Number: 5 (DW_TAG_compile_unit) <861> DW_AT_name : src/gdb/testsuite/gdb.ada/arraydim/inc.c <1><86d>: Abbrev Number: 6 (DW_TAG_base_type) <86e> DW_AT_byte_size : 8 <86f> DW_AT_encoding : 7 (unsigned) <870> DW_AT_name : long unsigned int <1><874>: Abbrev Number: 7 (DW_TAG_base_type) <875> DW_AT_byte_size : 4 <876> DW_AT_encoding : 5 (signed) <877> DW_AT_name : int <1><87b>: Abbrev Number: 8 (DW_TAG_variable) <87c> DW_AT_name : global_3dim_for_gdb_testing <882> DW_AT_type : <0x832> <886> DW_AT_external : 1 ... The DWARF contains an anonymous typedef at 0x84a, referring to 0x86d. Strictly speaking, the anonymous typedef is illegal DWARF, because a DW_TAG_typedef is defined to have an DW_AT_name attribute containing the name of the typedef as it appears in the source program. The DWARF reading code creates a corresponding type for this typedef, which goes on to confuse the code handling arrays. Rather than trying to support the type representing this anonymous typedef in all the locations where it causes problems, fix this by treating the anonymous typedef as a forwarder DIE in the DWARF reader. Tested on x86_64-linux, with target boards unix and unix/-feliminate-dwarf2-dups. This fixes ~85 failures for unix/-feliminate-dwarf2-dups. gdb/ChangeLog: 2020-03-07 Tom de Vries <tdevries@suse.de> * dwarf2/read.c (read_typedef): Treat anonymous typedef as forwarder DIE.
2020-03-04Introduce objfile::internTom Tromey1-27/+16
This introduces a string cache on the per-BFD object, replacing the macro and filename caches. Both of these caches just store strings, so this consolidation by itself saves a little memory (about the size of a bcache per objfile). Then this patch switches some allocations on the objfile obstack to use this bcache instead. This saves more space; and turns out to be a bit faster as well. Here are the before and after "maint time" + "maint space" results of "file ./gdb": Command execution time: 4.664021 (cpu), 4.728518 (wall) Space used: 39190528 (+29212672 for this command) Command execution time: 4.216209 (cpu), 4.107023 (wall) Space used: 36667392 (+26689536 for this command) The main interface to the string cache is a new pair of overloaded methods, objfile::intern. gdb/ChangeLog 2020-03-04 Tom Tromey <tom@tromey.com> * symmisc.c (print_symbol_bcache_statistics) (print_objfile_statistics): Update. * symfile.c (allocate_symtab): Use intern. * psymtab.c (partial_symtab::partial_symtab): Use intern. * objfiles.h (struct objfile_per_bfd_storage) <filename_cache, macro_cache>: Remove. <string_cache>: New member. (struct objfile) <intern>: New methods. * elfread.c (elf_symtab_read): Use intern. * dwarf2/read.c (fixup_go_packaging): Intern package name. (dwarf2_compute_name, dwarf2_physname) (create_dwo_unit_in_dwp_v1, create_dwo_unit_in_dwp_v2): Intern names. (guess_partial_die_structure_name): Update. (partial_die_info::fixup): Intern name. (dwarf2_canonicalize_name): Change parameter to objfile. Intern name. (dwarf2_name): Intern name. Update. * buildsym.c (buildsym_compunit::get_macro_table): Use string_cache.
2020-03-03Find tailcall frames before inline framesTom Tromey1-26/+8
A customer reported a failure to unwind in a certain core dump. A lengthy investigation showed that the problem came from the interaction between the tailcall and inline frame sniffers. Normally, the regular DWARF unwinder may discover a chain of tail calls ending in the current frame. In this case, it sets a member on the dwarf2_frame_cache object, so that a subsequent call into the tailcall sniffer will create the tailcall frames. However, in this scenario, what happened is that the DWARF unwinder did find tailcall frames -- but then the PC of the first such frame was recognized and claimed by the inline frame sniffer. This then caused unwinding to go astray further up the stack. This patch fixes the problem by arranging for the tailcall sniffer to be called before the inline sniffer. This way, if a DWARF frame has tailcall information, the tailcalls will always be processed first. This is safe to do, because the tailcall sniffer can only claim a frame if the previous frame did in fact find this information. (So, for example, if no DWARF frame is ever found, then this sniffer will never trigger.) This patch also partially reverts: commit 1ec56e88aa9b052ab10b806d82fbdbc8d153d977 Author: Pedro Alves <palves@redhat.com> Date: Fri Nov 22 13:17:46 2013 +0000 Eliminate dwarf2_frame_cache recursion, don't unwind from the dwarf2 sniffer (move dwarf2_tailcall_sniffer_first elsewhere). That patch moved the call to dwarf2_tailcall_sniffer_first out of dwarf2_frame_cache, and into dwarf2_frame_prev_register. However, in this situation, this is too late -- by the time dwarf2_frame_prev_register is called, the frame in question is already recognized by the inline frame sniffer. Rather than fully revert that patch, though, this just arranges to call dwarf2_tailcall_sniffer_first from dwarf2_frame_cache -- which is called shortly after the DWARF frame sniffer succeeds, via compute_frame_id. I don't know how to write a test case for this. gdb/ChangeLog 2020-03-03 Tom Tromey <tromey@adacore.com> * dwarf2/frame.c (struct dwarf2_frame_cache) <checked_tailcall_bottom, entry_cfa_sp_offset, entry_cfa_sp_offset_p>: Remove members. (dwarf2_frame_cache): Call dwarf2_tailcall_sniffer_first. (dwarf2_frame_prev_register): Don't call dwarf2_tailcall_sniffer_first. (dwarf2_append_unwinders): Don't append tailcall unwinder. * frame-unwind.c (add_unwinder): New fuction. (frame_unwind_init): Use it. Add tailcall unwinder.
2020-02-28Pass correct die_reader_specs in cutu_reader::init_tu_and_read_dwo_diesSimon Marchi1-2/+1
Running anything with the fission.exp board fails since commit c0ab21c22bb ("Replace init_cutu_and_read_dies with a class"). GDB crashes while reading the DWARF info. cu is NULL in read_signatured_type: Thread 1 "gdb" received signal SIGSEGV, Segmentation fault. 0x000055555780663e in read_signatured_type sig_type=0x6210000c3600) at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:22782 22782 gdb_assert (cu->die_hash == NULL); (top-gdb) bt #0 0x000055555780663e in read_signatured_type (sig_type=0x6210000c3600) at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:22782 #1 0x00005555578062dd in load_full_type_unit (per_cu=0x6210000c3600) at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:22758 #2 0x00005555577c5fb7 in queue_and_load_dwo_tu (slot=0x60600007fc00, info=0x6210000c34e0) at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:12674 #3 0x0000555559934232 in htab_traverse_noresize (htab=0x60b000063670, callback=0x5555577c5e61 <queue_and_load_dwo_tu(void**, void*)>, info=0x6210000c34e0) at /home/simark/src/binutils-gdb/libiberty/hashtab.c:775 #4 0x00005555577c6252 in queue_and_load_all_dwo_tus (per_cu=0x6210000c34e0) at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:12701 #5 0x000055555777ebd8 in dw2_do_instantiate_symtab (per_cu=0x6210000c34e0, skip_partial=false) at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:2371 #6 0x000055555777eea2 in dw2_instantiate_symtab (per_cu=0x6210000c34e0, skip_partial=false) at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:2395 #7 0x0000555557786ab6 in dw2_lookup_symbol (objfile=0x614000007240, block_index=GLOBAL_BLOCK, name=0x602000025310 "main", domain=VAR_DOMAIN) at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:3539 After creating the reader object, the reader.cu field should not be NULL. By checking the commit previous to the faulty one mentioned above, I noticed that the cu field is normally set by init_cu_die_reader, called from read_cutu_die_from_dwo, itself called from cutu_reader::init_tu_and_read_dwo_dies, itself called from cutu_reader's constructor. However, cutu_reader::init_tu_and_read_dwo_dies calls read_cutu_die_from_dwo, passing a pointer to a local `die_reader_specs` variable. So it's the `cu` field of that object that gets set. cutu_reader itself is a `die_reader_specs` (it inherits from it), and the intention was most likely to pass `this` to read_cutu_die_from_dwo. This way, the fields of the cutu_reader object, which read_signatured_type will use, are set. With this, I am able to use: make check RUNTESTFLAGS='--target_board=fission' and it looks much better. There are still some failures to be investigated, but that's the usual state of the testsuite. gdb/ChangeLog: * dwarf2/read.c (cutu_reader::init_tu_and_read_dwo_dies): Remove reader variable, pass `this` to read_cutu_die_from_dwo.
2020-02-27Remove field_info::nfields memberTom Tromey1-7/+8
I noticed that there's no real reason to have field_info::nfields in the DWARF reader. It simply mirrors information that is already available. This patch removes it, in favor of a convenience method. gdb/ChangeLog 2020-02-27 Tom Tromey <tromey@adacore.com> * dwarf2/read.c (struct field_info) <nfields>: Now a method, not a member. (dwarf2_add_field): Don't update nfields. (dwarf2_attach_fields_to_type, process_structure_scope): Update.