aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2/read.h
AgeCommit message (Collapse)AuthorFilesLines
2020-08-09gdb: replace function pointer with `void *` data with function_viewSimon Marchi1-4/+4
Replace the function pointer + `void *` parameters of dwarf2_fetch_die_loc_sect_off and dwarf2_fetch_die_loc_cu_off with a function_view parameter. Change call sites to use a lambda function. This improves type-safety, so reduces the chances of errors. gdb/ChangeLog: * read.h (dwarf2_fetch_die_loc_sect_off, dwarf2_fetch_die_loc_cu_off): Replace function pointer + `void *` parameter with function_view. * read.c (dwarf2_fetch_die_loc_sect_off, dwarf2_fetch_die_loc_cu_off): Likewise. * loc.c (get_frame_pc_for_per_cu_dwarf_call): Remove. (per_cu_dwarf_call): Adjust. (get_frame_address_in_block_wrapper): Remove. (indirect_synthetic_pointer): Adjust. (get_ax_pc): Remove. (dwarf2_compile_expr_to_ax): Adjust. Change-Id: Ic9b6ced0c4128f2b75ca62e0ed638b0962a22859
2020-05-29gdb: rename dwarf2_per_objfile variables/fields to per_objfileSimon Marchi1-1/+1
While doing the psymtab-sharing patchset, I avoided renaming variables unnecessarily to avoid adding noise to patches, but I'd like to do it now. Basically, we have these dwarf2 per-something structures: - dwarf2_per_objfile - dwarf2_per_bfd - dwarf2_per_cu_data I named the instances of dwarf2_per_bfd `per_bfd` and most of instances of dwarf2_per_cu_data are called `per_cu`. Most pre-existing instances of dwarf2_per_objfile are named `dwarf2_per_objfile`. For consistency with the other type, I'd like to rename them to just `per_objfile`. The `dwarf2_` prefix is superfluous, since it's already clear we are in dwarf2 code. It also helps reducing the line wrapping by saving 7 precious columns. gdb/ChangeLog: * dwarf2/comp-unit.c, dwarf2/comp-unit.h, dwarf2/index-cache.c, dwarf2/index-cache.h, dwarf2/index-write.c, dwarf2/index-write.h, dwarf2/line-header.c, dwarf2/line-header.h, dwarf2/macro.c, dwarf2/macro.h, dwarf2/read.c, dwarf2/read.h: Rename struct dwarf2_per_objfile variables and fields from `dwarf2_per_objfile` to just `per_objfile` throughout. Change-Id: I3c45cdcc561265e90df82cbd36b4b4ef2fa73aef
2020-05-27Share DWARF partial symtabsTom Tromey1-0/+5
This changes the DWARF reader to share partial symtabs (or indices if they are available) across objfiles. This has a few parts. * If multiple objfiles backed by the same BFD can share partial symtabs (see below), a single dwarf2_per_bfd is created. It is stored in the per-bfd `dwarf2_per_bfd_bfd_data_key` registry. Multiple dwarf2_per_objfile objects will point to the same instance. The lifetime of these dwarf2_per_bfd objects is naturally handled. When all the objfiles using the BFD are destroyed, the BFD's refount drops to 0, which triggers the removal of the corresponding dwarf2_per_bfd object from the registry and its destruction. * If multiple objfiles backed by the same BFD can't share partial symtabs (see below), one dwarf2_per_bfd object is created for each objfile. Each dwarf2_per_objfile will point to their own instance of dwarf2_per_bfd. These instances of dwarf2_per_bfd are kept in a per-objfile registry, meaning that when the objfile gets destroyed, the dwarf2_per_bfd instance gets destroyed as well. * objfile::partial_symtabs is changed to be a shared_ptr again. This lets us stash a second reference in dwarf2_per_bfd; if the DWARF data is being shared, we can simply copy this value to the new objfile. * Two dwarf2_per_objfile objects backed by the same BFD may share a dwarf2_per_bfd instance if: * No other symbol reader has found symbols, and * No BFD section rqeuires relocation gdb/ChangeLog: YYYY-MM-DD Tom Tromey <tom@tromey.com> YYYY-MM-DD Simon Marchi <simon.marchi@efficios.com> * objfiles.h (struct objfile) <partial_symtabs>: Now a shared_ptr. * dwarf2/read.h (struct dwarf2_per_objfile) <partial_symtabs>: New member. * dwarf2/read.c (dwarf2_per_bfd_bfd_data_key, dwarf2_per_bfd_objfile_data_key>: New globals. (dwarf2_has_info): Use shared dwarf2_per_bfd if possible. (dwarf2_get_section_info): Use get_dwarf2_per_objfile. (dwarf2_initialize_objfile): Consider cases where per_bfd can be shared. (dwarf2_build_psymtabs): Set objfile::partial_symtabs and short-circuit when sharing. (dwarf2_build_psymtabs): Set dwarf2_per_objfile::partial_symtabs. (dwarf2_psymtab::expand_psymtab): Use free_cached_comp_units. Change-Id: I868c64448589102ab8cbb8f06c31a8de50a14004
2020-05-27Move line_header_hash to dwarf2_per_objfileSimon Marchi1-3/+3
The `line_header_hash` field of `struct dwarf2_per_bfd` contains some `struct line_header` objects. A `struct line_header` objects contains some `file_entry` objects. A `file_entry` object contains a pointer to the `symtab` object created from it. The `line_header_hash` is therefore ultimately objfile-dependent and can't be shared as-is between objfiles. Move it from `dwarf2_per_bfd` to `dwarf2_per_objfile`. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_bfd) <line_header_hash>: Move to... (struct dwarf2_per_objfile) <line_header_hash>: ... here. * dwarf2/read.c (handle_DW_AT_stmt_list): Update. Change-Id: I8d2ee04df4f4847c2db99061fc976c35af98ac71
2020-05-27Replace dwarf2_per_cu_data::cu backlink with per-objfile mapSimon Marchi1-12/+23
The dwarf2_per_cu_data type is going to become objfile-independent, while the dwarf2_cu type will stay object-dependent. This patch removes the backlink from dwarf2_per_cu_data to dwarf2_cu, in favor of the dwarf2_per_objfile::m_dwarf2_cus map. It maps dwarf2_per_cu_data objects to the corresponding dwarf2_cu objects for this objfile. If a CU has been read in in the context of this objfile, then an entry will be present in the map. The dwarf2_cu objects that are read in are currently kept in a linked list rooted in the dwarf2_per_bfd. Except that the dwarf2_cu objects are not simply linked together, they are interleaved with their corresponding dwarf2_per_cu_data objects. So if we have CUs A and B read in, the dwarf2_per_bfd::read_in_chain will point to a chain like this (DPCD == dwarf2_per_cu_data, DC == dwarf2_cu): DPCD A -> DC A -> DPCD B -> DC B Obviously, this can't stay as is, since a same CU can be read in for an objfile but not read in for another objfile sharing the same BFD, and the dwarf2_per_cu_data::cu link is removed. This is all replaced by the dwarf2_per_objfile::m_dwarf2_cus map. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_cu): Forward-declare. (struct dwarf2_per_bfd) <free_cached_comp_units>: Remove, move to dwarf2_per_objfile. <read_in_chain>: Remove. (struct dwarf2_per_objfile) <get_cu, set_cu, remove_cu, remove_all_cus, age_comp_units>: New methods. <m_dwarf2_cus>: New member. (struct dwarf2_per_cu_data) <cu>: Remove. * dwarf2/read.c (struct dwarf2_cu) <read_in_chain>: Remove. (age_cached_comp_units, free_one_cached_comp_unit): Remove, moved to methods of dwarf2_per_objfile. (dwarf2_clear_marks): Remove. (dwarf2_queue_item::~dwarf2_queue_item): Update. (dwarf2_per_bfd::~dwarf2_per_bfd): Don't free dwarf2_cus. (dwarf2_per_bfd::free_cached_comp_units): Remove. (dwarf2_per_objfile::remove_all_cus): New. (class free_cached_comp_units) <~free_cached_comp_units>: Update. (load_cu): Update. (dw2_do_instantiate_symtab): Adjust. (fill_in_sig_entry_from_dwo_entry): Adjust. (cutu_reader::init_tu_and_read_dwo_dies): Update. (cutu_reader::cutu_reader): Likewise. (cutu_reader::keep): Use dwarf2_per_objfile::set_cu. (cutu_reader::cutu_reader): Use dwarf2_per_objfile::get_cu. (process_psymtab_comp_unit): Use dwarf2_per_objfile::remove_cu and dwarf2_per_objfile::age_comp_units. (load_partial_comp_unit): Update. (maybe_queue_comp_unit): Use dwarf2_per_objfile::get_cu. (process_queue): Likewise. (find_partial_die): Use dwarf2_per_objfile::get_cu instead of cu backlink. (dwarf2_read_addr_index): Likewise. (follow_die_offset): Likewise. (dwarf2_fetch_die_loc_sect_off): Likewise. (dwarf2_fetch_constant_bytes): Likewise. (dwarf2_fetch_die_type_sect_off): Likewise. (follow_die_sig_1): Likewise. (load_full_type_unit): Likewise. (read_signatured_type): Likewise. (dwarf2_cu::dwarf2_cu): Don't set cu field. (dwarf2_cu::~dwarf2_cu): Remove. (dwarf2_per_objfile::get_cu): New. (dwarf2_per_objfile::set_cu): New. (age_cached_comp_units): Rename to... (dwarf2_per_objfile::age_comp_units): ... this. Adjust to std::unordered_map. (free_one_cached_comp_unit): Rename to... (dwarf2_per_objfile::remove_cu): ... this. Adjust to std::unordered_map. (dwarf2_per_objfile::~dwarf2_per_objfile): New. (dwarf2_mark_helper): Use dwarf2_per_objfile::get_cu, expect a dwarf2_per_objfile in data. (dwarf2_mark): Pass dwarf2_per_objfile in data to htab_traverse. (dwarf2_clear_marks): Remove. Change-Id: Ia33ac71c79b2de4710569008e22a6563a1505cde
2020-05-27Add comp_unit_head to dwarf2_per_cu_dataSimon Marchi1-0/+19
The per_cu_header_read_in function allows obtaining a filled comp_unit_head object for a given dwarf2_per_cu_data object. If a dwarf2_cu object exists for this dwarf2_per_cu_data, then it just returns a pointer to the comp_unit_head from that dwarf2_cu. Otherwise, it reads the header into a temporary buffer provided by the caller, and returns a pointer to that. Since the dwarf2_per_cu_data::cu link is going to be removed (dwarf2_per_cu_data will become objfile-independent while dwarf2_cu stays objfile-dependent), we cannot rely anymore on returning the header from the dwarf2_cu object. The not too complex solution implemented by this patch is to keep a copy of the header in the dwarf2_per_cu_data object, independent from the copy in dwarf2_cu. The new copy is only used in the addr_size, offset_size and ref_addr_size methods of dwarf2_per_cu_data. There's nothing intrinsic to the comp_unit_head object that prevents it to be shared between two dwarf2_cu objects (belonging to different objfiles) representing the same CU. In other words, I think we could eventually get rid of the copy in dwarf2_cu to only keep the one in dwarf2_per_cu_data. It is not trivial, however, so I have decided not to do it for the moment. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_cu_data) <m_header, m_header_read_in>: New fields. <get_header>: New method. * dwarf2/read.c (per_cu_header_read_in): Remove. (dwarf2_per_cu_data::get_header): New. (dwarf2_per_cu_data::addr_size): Update. (dwarf2_per_cu_data::offset_size): Update. (dwarf2_per_cu_data::ref_addr_size): Update. Change-Id: Id7541fca7562843eba110ece21c4df38d45fca23
2020-05-27Move signatured_type::type to unshareable objectTom Tromey1-7/+10
signatured_type has a link to the "struct type". However, types are inherently objfile-specific, so once sharing is implemented, this will be incorrect. This patch moves the type to a new map in the DWARF unshareable object. gdb/ChangeLog: YYYY-MM-DD Tom Tromey <tom@tromey.com> YYYY-MM-DD Simon Marchi <simon.marchi@efficios.com> * dwarf2/read.h (struct dwarf2_per_objfile) <get_type_for_signatured_type, set_type_for_signatured_type>: New methods. <m_type_map>: New member. (struct signatured_type) <type>: Remove. * dwarf2/read.c (dwarf2_per_objfile::get_type_for_signatured_type, dwarf2_per_objfile::set_type_for_signatured_type): New. (get_signatured_type): Use new methods. Change-Id: I765ae3c43fae1064f51ced352167a57638609f02
2020-05-27Split type_unit_groupTom Tromey1-0/+38
type_unit_group has links to the compunit_symtab and other symtabs. However, once this object is shared across objfiles, this will no longer be ok. This patch introduces a new type_unit_group_unshareable and arranges to store a map from type unit groups to type_unit_group_unshareable objects in dwarf2_per_objfile. gdb/ChangeLog: YYYY-MM-DD Tom Tromey <tom@tromey.com> YYYY-MM-DD Simon Marchi <simon.marchi@efficios.com> * dwarf2/read.h (struct type_unit_group_unshareable): New. (struct dwarf2_per_objfile) <type_units>: New member. <get_type_unit_group_unshareable>: New method. * dwarf2/read.c (struct type_unit_group) <compunit_symtab, num_symtabs, symtabs>: Remove; move to type_unit_group_unshareable. (dwarf2_per_objfile::get_type_unit_group_unshareable): New. (process_full_type_unit, dwarf2_cu::setup_type_unit_groups) (dwarf2_cu::setup_type_unit_groups): Use type_unit_group_unshareable. Change-Id: I1fec2fab59e0ec40fee3614fc821172a469c0e41
2020-05-27Remove dwarf2_per_cu_data::dwarf2_per_objfileSimon Marchi1-3/+0
Nothing references this field anymore, remove it. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_cu_data): <dwarf2_per_objfile>: Remove. * dwarf2/read.c (create_cu_from_index_list): Don't assign dwarf2_per_objfile. (create_signatured_type_table_from_index): Likewise. (create_signatured_type_table_from_debug_names): Likewise. (create_debug_type_hash_table): Likewise. (fill_in_sig_entry_from_dwo_entry): Likewise. (create_type_unit_group): Likewise. (read_comp_units_from_section): Likewise. (create_cus_hash_table): Likewise. Change-Id: Icf0b657a6beec953fe17cbe0fb2ae2c6e744d3ed
2020-05-27Add dwarf2_per_objfile parameter to get_die_type_at_offsetSimon Marchi1-1/+2
This allows removing some dwarf2_per_cu_data::dwarf2_per_objfile references. gdb/ChangeLog: * dwarf2/read.h (dwarf2_get_die_type): Add dwarf2_per_objfile parameter. * dwarf2/read.c (get_die_type_at_offset): Likewise. (read_namespace_alias): Update. (lookup_die_type): Update. (dwarf2_get_die_type): Add dwarf2_per_objfile parameter. * dwarf2/loc.c (class dwarf_evaluate_loc_desc) <get_base_type>: Update. (disassemble_dwarf_expression): Update. Change-Id: Ibaf5b684cb0a8eb8f0b23e62bd0283c295410aa5
2020-05-27Add dwarf2_per_objfile parameter to free_one_cached_comp_unitSimon Marchi1-2/+5
This allows removing some references to dwarf2_per_cu_data::dwarf2_per_objfile. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_queue_item): Add dwarf2_per_objfile parameter, assign new parameter. <per_objfile>: New field. * dwarf2/read.c (free_one_cached_comp_unit): Add dwarf2_per_objfile parameter. (queue_comp_unit): Likewise. (dw2_do_instantiate_symtab): Update. (process_psymtab_comp_unit): Update. (maybe_queue_comp_unit): Add dwarf2_per_objfile parameter. (process_imported_unit_die): Update. (queue_and_load_dwo_tu): Update. (follow_die_offset): Update. (follow_die_sig_1): Update. Change-Id: Ibb4a4ea28eeac5ebcbf73c0d2a13f9391e15c235
2020-05-27Remove dwarf2_per_cu_data::objfile ()Simon Marchi1-5/+0
Since dwarf2_per_cu_data objects are going to become objfile-independent, the backlink from dwarf2_per_cu_data to one particular objfile must be removed. Instead, users of dwarf2_per_cu_data that need an objfile must know from somewhere else in the context of which objfile they are using this CU. This also helps remove a dwarf2_per_cu_data::dwarf2_per_objfile reference (from where the objfile was obtained). Note that the dwarf2_per_cu_data::objfile method has a special case to make sure to return the main objfile, if the objfile associated to the dwarf2_per_cu_data is a separate debug objfile. I don't really know if this is necessary: I ignored that, and didn't see any regression when testing with the various Dejagnu boards with separate debug info, so I presume it wasn't needed. If it turns out this was needed, then we can have a helper method on the objfile type for that. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_cu_data) <objfile>: Remove. * dwarf2/read.c (dwarf2_compute_name): Pass per_objfile down. (read_call_site_scope): Assign per_objfile. (dwarf2_per_cu_data::objfile): Remove. * gdbtypes.h (struct call_site) <per_objfile>: New member. * dwarf2/loc.h (dwarf2_evaluate_loc_desc): Add dwarf2_per_objfile parameter. * dwarf2/loc.c (dwarf2_evaluate_loc_desc_full): Add dwarf2_per_objfile parameter. (dwarf_expr_reg_to_entry_parameter): Add output dwarf2_per_objfile parameter. (locexpr_get_frame_base): Update. (class dwarf_evaluate_loc_desc) <get_tls_address>: Update. <push_dwarf_reg_entry_value>: Update. <call_site_to_target_addr>: Update. (dwarf_entry_parameter_to_value): Add dwarf2_per_objfile parameter. (value_of_dwarf_reg_entry): Update. (rw_pieced_value): Update. (indirect_synthetic_pointer): Update. (dwarf2_evaluate_property): Update. (dwarf2_loc_desc_get_symbol_read_needs): Add dwarf2_per_objfile parameter. (locexpr_read_variable): Update. (locexpr_get_symbol_read_needs): Update. (loclist_read_variable): Update. Change-Id: Idb40d1a94995af305054d463967bb6ce11a08f25
2020-05-27Add dwarf2_per_objfile parameters to dwarf2_fetch_* functionsSimon Marchi1-2/+6
This allows removing dwarf2_per_cu_data references. gdb/ChangeLog: * dwarf2/read.h (dwarf2_fetch_die_loc_sect_off, dwarf2_fetch_die_loc_cu_off, dwarf2_fetch_constant_bytes, dwarf2_fetch_die_type_sect_off): Add dwarf2_per_objfile parameter. * dwarf2/read.c (dwarf2_fetch_die_loc_sect_off, dwarf2_fetch_die_loc_cu_off, dwarf2_fetch_constant_bytes, dwarf2_fetch_die_type_sect_off): Add dwarf2_per_objfile parameter. * dwarf2/loc.c (indirect_synthetic_pointer, per_cu_dwarf_call, sect_variable_value): Add dwarf2_per_objfile parameter. (class dwarf_evaluate_loc_desc) <dwarf_call, dwarf_variable_value>: Update. (fetch_const_value_from_synthetic_pointer): Add dwarf2_per_objfile parameter. (fetch_const_value_from_synthetic_pointer): Update. (coerced_pieced_ref): Update. (class symbol_needs_eval_context) <dwarf_call, dwarf_variable_value>: Update. (dwarf2_compile_expr_to_ax): Update. Change-Id: I07cf1806380633d0572304cea049a1fa5e9ea67f
2020-05-27Add dwarf2_per_objfile parameter to dwarf2_read_addr_indexSimon Marchi1-0/+1
Pass it all the way from the symbol batons. This allows removing a dwarf2_per_cu_data::dwarf2_per_objfile reference. gdb/ChangeLog: * dwarf2/read.h (dwarf2_read_addr_index): Add dwarf2_per_objfile parameter. * dwarf2/read.c (dwarf2_read_addr_index): Likewise. * dwarf2/loc.c (decode_debug_loclists_addresses): Add dwarf2_per_objfile parameter. (decode_debug_loc_dwo_addresses): Likewise. (dwarf2_find_location_expression): Update. (class dwarf_evaluate_loc_desc) <get_addr_index>: Update. (locexpr_describe_location_piece): Add dwarf2_per_objfile parameter. (disassemble_dwarf_expression): Add dwarf2_per_objfile parameter. (locexpr_describe_location_1): Likewise. (locexpr_describe_location): Update. Change-Id: I8414755e41a87c92f96e408524cc7aaccf086cda
2020-05-27Remove dwarf2_per_cu_data::text_offsetSimon Marchi1-6/+0
This method simply returns the text offset of the objfile associated to the dwarf2_per_cu_data object. Since dwarf2_per_cu_data objects are going to become objfile-independent, we can't keep this method. This patch removes it. Existing callers need to figure out the in the context of which objfile this is being used, and call text_offset on it. Typically, this comes from a symbol baton, where we store the corresponding dwarf2_per_objfile. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_cu_data) <text_offset>: Remove. * dwarf2/read.c (dwarf2_per_cu_data::text_offset): Remove. * dwarf2/loc.c (dwarf2_find_location_expression): Update. (dwarf2_compile_property_to_c): Update. (dwarf2_compile_expr_to_ax): Add dwarf2_per_objfile parameter, use text offset from objfile. (locexpr_tracepoint_var_ref): Update. (locexpr_generate_c_location): Update. (loclist_describe_location): Update. (loclist_tracepoint_var_ref): Update. * dwarf2/compile.h (compile_dwarf_bounds_to_c): Add dwarf2_per_objfile parameter. * dwarf2/loc2c.c (do_compile_dwarf_expr_to_c): Likewise, use text offset from objfile. (compile_dwarf_expr_to_c): Add dwarf2_per_objfile parameter. Change-Id: I56b01ba294733362a3562426a96d48ae051a776f
2020-05-27Move int type methods out of dwarf2_per_cu_dataSimon Marchi1-14/+4
These methods rely on the current objfile to create types based on it. Since dwarf2_per_cu_data is to become objfile-independent, these methods need to mvoe. int_type can be in dwarf2_per_objfile, as it only requires knowing about the objfile. addr_sized_int_type and addr_type also need to know about the DWARF address type size, which is CU-specific. The dwarf2_cu objects seems like a good place for it, as it knows both about the current objfile and the current CU. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_cu_data) <addr_type, addr_sized_int_type>: Move to dwarf2_cu. <int_type>: Move to dwarf2_per_objfile. (struct dwarf2_per_objfile) <int_type>: Move here. * dwarf2/read.c (struct dwarf2_cu) <addr_type, addr_sized_int_type>: Move here. (read_func_scope): Update. (read_array_type): Update. (read_tag_string_type): Update. (attr_to_dynamic_prop): Update. (dwarf2_per_cu_data::int_type): Rename to... (dwarf2_per_objfile::int_type): ... this. (dwarf2_per_cu_data::addr_sized_int_type): Rename to... (dwarf2_cu::addr_sized_int_type): ... this. (read_subrange_type): Update. (dwarf2_per_cu_data::addr_type): Rename to... (dwarf2_cu::addr_type): ... this. (set_die_type): Update. Change-Id: Ic4708ef99d43a8d99325ff91dee59b2eb706cb8f
2020-05-27Make dwarf2_get_dwz_file take a dwarf2_per_bfdSimon Marchi1-2/+4
This allows removing a per_bfd->dwarf2_per_objfile reference in get_abbrev_section_for_cu. This requires saving the bfd in dwarf2_per_bfd. The constructor of dwarf2_per_bfd already accepts the bfd, so it's just a matter of saving it in a field. I replaced uses of objfile_name with bfd_get_filename, which should be equivalent in this case. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_bfd) <obfd>: New member. (dwarf2_get_dwz_file): Replace parameter with dwarf2_per_bfd. * dwarf2/read.c (dwarf2_per_bfd::dwarf2_per_bfd): Assign obfd field. (dwarf2_get_dwz_file): Replace parameter with dwarf2_per_bfd. (create_cus_from_index): Update. (dwarf2_read_gdb_index): Update. (create_cus_from_debug_names): Update. (dwarf2_read_debug_names): Update. (get_abbrev_section_for_cu): Update. (create_all_comp_units): Update. (read_attribute_value): Update. (get_debug_line_section): Update. * dwarf2/index-cache.c (index_cache::store): Update. * dwarf2/index-write.c (save_gdb_index_command): Update. * dwarf2/macro.c (dwarf_decode_macro_bytes): Update. Change-Id: Ifb23f55dda93c499aae57b6a9aff9c6ff9d2f45f
2020-05-27Add dwarf2_per_bfd field to dwarf2_per_cu_dataSimon Marchi1-0/+3
Some code using dwarf2_per_cu_data objects accesses the corresponding dwarf2_per_bfd using the following pattern: per_cu->dwarf2_per_objfile->per_bfd Since dwarf2_per_cu_data objects are going to become objfile-independent, the dwarf2_per_objfile link must go. To replace it, add a dwarf2_per_cu_data->per_bfd link. It makes sense to have it there because the dwarf2_per_cu_data objects belong to the dwarf2_per_bfd, so this is essentially just a backlink to their owner. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_cu_data) <per_bfd>: New member. * dwarf2/read.c (dwarf2_per_bfd::allocate_per_cu): Initialize dwarf2_per_cu_data::per_bfd. (dwarf2_per_bfd::allocate_signatured_type): Likewise. (create_type_unit_group): Likewise. (queue_comp_unit): Remove reference to per_cu->dwarf2_per_objfile. (maybe_queue_comp_unit): Likewise. (fill_in_sig_entry_from_dwo_entry): Assign new field. (create_cus_hash_table): Assign new field. Change-Id: I4ba0a393e64a14489ef061261a3dede1509d055b
2020-05-27Move die_type_hash to dwarf2_per_objfileSimon Marchi1-5/+5
The die_type_hash field can't be shared between multiple obfiles, as it holds `struct type` objects, which are objfile-specific. Move it from dwarf2_per_bfd to dwarf2_per_objfile and update all references. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_bfd) <die_type_hash>: Move to struct dwarf2_per_objfile. (struct dwarf2_per_objfile) <die_type_hash>: Move from struct dwarf2_per_bfd. * dwarf2/read.c (set_die_type): Update. (get_die_type_at_offset): Update. Change-Id: I3589777ed3579bcabafd2ba859d27babe4502bfb
2020-05-27Remove symtab links from dwarf2_psymtab and dwarf2_per_cu_quick_dataSimon Marchi1-2/+35
The dwarf2_psymtab and dwarf2_per_cu_quick_data types contain a pointer to a compunit_symtab, which is a pointer to the corresponding full symtab. The dwarf2_psymtab and dwarf2_per_cu_quick_data objects are going to become objfile-independent, and possibly shared by multiple objfiles, whereas compunit_symtab will stay objfile-dependent. This backlink to the compunit_symtab must therefore be removed. This patch replaces them with a vector in the dwarf2_per_objfile type, that serves as a mapping from dwarf2_per_cu_data objects to compunit_symtab objects, for this particular objfile. The vector is indexed using the index assigned to the dwarf2_per_cu_data at its creation. I removed the get_compunit_symtab, as it appears to bring not much value over calling dwarf2_per_objfile::get_symtab directly. gdb/ChangeLog: YYYY-MM-DD Tom Tromey <tom@tromey.com> YYYY-MM-DD Simon Marchi <simon.marchi@efficios.com> * dwarf2/read.h (struct dwarf2_per_bfd) <num_psymtabs>: New method. (struct dwarf2_per_objfile) <resize_symtabs, symtab_set_p, get_symtab, set_symtab>: New methods. <m_symtabs>: New field. (struct dwarf2_psymtab): Derive from partial_symtab. <readin_p, get_compunit_symtab>: Declare methods. * dwarf2/read.c (dwarf2_per_objfile::symtab_set_p, dwarf2_per_objfile::get_symtab, dwarf2_per_objfile::set_symtab): New methods. (struct dwarf2_per_cu_quick_data) <compunit_symtab>: Remove. (dw2_do_instantiate_symtab, dw2_instantiate_symtab) (dw2_map_expand_apply, dw2_map_symtabs_matching_filename) (dw2_symtab_iter_next, dw2_print_stats) (dw2_expand_symtabs_with_fullname) (dw2_expand_symtabs_matching_one) (dw_expand_symtabs_matching_file_matcher) (dw2_find_pc_sect_compunit_symtab, dw2_map_symbol_filenames) (dw2_debug_names_iterator::next) (dw2_debug_names_map_matching_symbols) (fill_in_sig_entry_from_dwo_entry, dwarf2_psymtab::read_symtab) (process_queue, dwarf2_psymtab::expand_psymtab): Update. (dwarf2_psymtab::readin_p, dwarf2_psymtab::get_compunit_symtab): New methods. (get_compunit_symtab, process_full_comp_unit) (process_full_type_unit): Update. (dwarf2_build_psymtabs, dwarf2_initialize_objfile, add_type_unit): Call Change-Id: Iec53d96e0b70a57d8b68408febdac3c6c3d4854b
2020-05-27Split dwarf2_per_objfile into dwarf2_per_objfile and dwarf2_per_bfdSimon Marchi1-25/+44
This is the first step of splitting dwarf2_per_objfile in two, one structure for objfile-independent data (dwarf2_per_bfd) and one for objfile-dependent data (dwarf2_per_objfile). The existing dwarf2_per_objfile is renamed dwarf2_per_bfd, and a new dwarf2_per_objfile type is introduced, which sits "in between" the objfile and dwarf2_per_bfd. So where we had this before: objfile -> dwarf2_per_objfile (*) we now have this: objfile -> dwarf2_per_objfile -> dwarf2_per_bfd (*) (*) Note that the dwarf2_per_objfile in the former corresponds to the dwarf2_per_bfd in the latter. I've done the minimal amount of changes in this patch: following patches will incrementally move things that are not actually shareable between objfiles from dwarf2_per_bfd to dwarf2_per_objfile. Most references to dwarf2_per_objfile objects are changed to dwarf2_per_objfile->per_bfd. To avoid many of these replacements, which would have to be reverted later anyway, I've moved right away the objfile backlink to the new dwarf2_per_objfile structure in this patch. I've also moved the read_line_string method, since it references the objfile backlink, and it's actually not difficult to move. Once the moves are completed, multiple dwarf2_per_objfile sharing the same BFD will point to the same single instance of dwarf2_per_bfd (as long as they don't require relocation). dwarf2_has_info, where we create these objects, is updated to the new architecture. I've had to change the get_gdb_index_contents_ftype typedef and related functions. The parameter type was changed from dwarf2_per_objfile to dwarf2_per_bfd, otherwise the template wouldn't work. Please excuse the terse ChangeLog entry, I have not listed all the functions where dwarf2_per_objfile has been changed to dwarf2_per_objfile->per_bfd. It would take a considerable amount of time and would not really be useful in the end. gdb/ChangeLog: * dwarf2/read.h (dwarf2_per_objfile): Rename to dwarf2_per_bfd, then introduce a new dwarf2_per_objfile type. <read_line_string>: Move to the new dwarf2_per_objfile type. <objfile>: Likewise. (dwarf2_per_bfd): Rename dwarf2_per_objfile to this. * dwarf2/read.c: Replace references to dwarf2_per_objfile with dwarf2_per_objfile->per_bfd. (dwarf2_per_objfile::dwarf2_per_objfile): Rename to... (dwarf2_per_bfd::dwarf2_per_bfd): ... this. (dwarf2_per_objfile::free_cached_comp_units): Rename to... (dwarf2_per_bfd::free_cached_comp_units): ... this. (dwarf2_has_info): Allocate dwarf2_per_bfd. (dwarf2_per_objfile::locate_sections): Rename to... (dwarf2_per_bfd::locate_sections): ... this. (dwarf2_per_objfile::get_cutu): Rename to... (dwarf2_per_bfd::get_cutu): ... this. (dwarf2_per_objfile::get_cu): Rename to... (dwarf2_per_bfd::get_cu): ... this. (dwarf2_per_objfile::get_tu): Rename to... (dwarf2_per_bfd::get_tu): ... this. (dwarf2_per_objfile::allocate_per_cu): Rename to... (dwarf2_per_bfd::allocate_per_cu): ... this. (dwarf2_per_objfile::allocate_signatured_type): Rename to... (dwarf2_per_bfd::allocate_signatured_type): ... this. (get_gdb_index_contents_ftype): Change parameter from dwarf2_per_objfile to dwarf2_per_bfd. * dwarf2/macro.c, dwarf2/index-write.c: Replace references to dwarf2_per_objfile with dwarf2_per_objfile->per_bfd. Change-Id: I7de7b5d1ce7494aa73bfcf15f719d3c5c46e138c
2020-05-27Add dwarf2_per_cu_data::indexTom Tromey1-0/+19
Currently, a dwarf2_per_cu_data can hold a link to the corresponding expanded compunit_symtab. However, the dwarf2_per_cu_data objects are shared across objfiles, a simple pointer won't work: each objfile sharing the dwarf2_per_cu_data instance will have a corresponding compunit_symtab. Instead, this link will be stored in the dwarf2_per_objfile object (which will contain the objfile-specific data). To enable this, we add an index to each dwarf2_per_cu_data and signatured_type. The data structure in the dwarf2_per_objfile will use this new index to map a dwarf2_per_cu_data to its corresponding compunit_symtab, for this objfile. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_objfile) <allocate_per_cu, allocate_signatured_type>: Declare new methods. <m_num_psymtabs>: New member. (struct dwarf2_per_cu_data) <index>: New member. * dwarf2/read.c (dwarf2_per_objfile::allocate_per_cu) (dwarf2_per_objfile::allocate_signatured_type): New methods. (create_cu_from_index_list): Use allocate_per_cu. (create_signatured_type_table_from_index) (create_signatured_type_table_from_debug_names) (create_debug_type_hash_table, add_type_unit) (read_comp_units_from_section): Use allocate_signatured_type. Change-Id: I7733479a38ce82a5015cb184c8acce5f8bbf2e69
2020-05-27Introduce dwarf2_per_objfile::obstackTom Tromey1-0/+5
Currently much of the DWARF-related data is stored on the objfile obstack. This prevents sharing this data across objfiles, so this patch adds a new obstack to dwarf2_per_objfile. Note that the dwarf2_per_objfile type is going to become "dwarf2_per_bfd" in a subsequent patch, which is indeed going to be shared between objfiles. One way to check whether this is correct is to look at the remaining uses of objfile_obstack in the DWARF code and note that they all appear in the "full CU" code paths. The converse -- storing per-objfile data on the shared obstack -- is not good, but it is just a memory leak, not a potential use-after-free. Double-checking this would also be useful, though. gdb/ChangeLog: * dwarf2/read.h (struct dwarf2_per_objfile) <obstack>: New member. * dwarf2/read.c (delete_file_name_entry): Fix comment. (create_cu_from_index_list) (create_signatured_type_table_from_index) (create_signatured_type_table_from_debug_names) (dw2_get_file_names_reader, dwarf2_initialize_objfile) (dwarf2_create_include_psymtab) (create_debug_type_hash_table, add_type_unit) (create_type_unit_group, read_comp_units_from_section) (dwarf2_compute_name, create_cus_hash_table) (create_dwp_hash_table, create_dwo_unit_in_dwp_v1) (create_dwo_unit_in_dwp_v2, open_and_init_dwp_file): Use new obstack. (dw2_get_real_path): Likewise. Change argument to dwarf2_per_objfile. Change-Id: Icdec7be7c4d9f33d1dce4f807284f3077f7d3f03
2020-04-07gdb: small cleanups in dwarf2_psymtab constructorsSimon Marchi1-7/+3
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-03-26Convert read_indirect_line_string to a methodTom Tromey1-0/+8
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-26Introduce dwarf2/dwz.hTom Tromey1-31/+0
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-17[gdb] Skip imports of c++ CUsTom de Vries1-0/+6
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-02-26Move more declarations from dwarf2/loc.h to dwarf2/read.hSimon Marchi1-0/+33
All these functions have their implementations in dwarf2/read.c, so move their declarations to dwarf2/read.h. Move the doc to the header, at the same time. gdb/ChangeLog: * dwarf2/loc.h (dwarf2_fetch_die_loc_sect_off, dwarf2_fetch_die_loc_cu_off, dwarf2_fetch_constant_bytes, dwarf2_fetch_die_type_sect_off): Move to... * dwarf2/read.h (dwarf2_fetch_die_loc_sect_off, dwarf2_fetch_die_loc_cu_off, dwarf2_fetch_constant_bytes, dwarf2_fetch_die_type_sect_off): ... here. * dwarf2/read.c (dwarf2_fetch_die_loc_sect_off, dwarf2_fetch_die_loc_cu_off, dwarf2_fetch_constant_bytes, dwarf2_fetch_die_type_sect_off): Move doc to header file.
2020-02-25Move dwarf2_read_addr_index declaration to dwarf2/read.hSimon Marchi1-0/+8
The implementation is in dwarf2/read.c, so the declaration belongs in dwarf2/read.h. Also, move the documentation there. gdb/ChangeLog: * dwarf2/loc.h (dwarf2_read_addr_index): Move... * dwarf2/read.h (dwarf2_read_addr_index): ... here. * dwarf2/read.c (dwarf2_read_addr_index): Move doc to header.
2020-02-25Move dwarf2_get_die_type declaration to dwarf2/read.hSimon Marchi1-0/+6
Since its implementation is in dwarf2/read.c, its declaration belongs in dwarf2/read.h. Move the documentation to the .h at the same time. gdb/ChangeLog: * loc.h (dwarf2_get_die_type): Move to... * read.h (dwarf2_get_die_type): ... here. * read.c (dwarf2_get_die_type): Move doc to header.
2020-02-24Convert IS_TYPE_UNIT_GROUP to methodTom Tromey1-0/+7
This converts the IS_TYPE_UNIT_GROUP to a method on dwarf2_per_cu_data. gdb/ChangeLog 2020-02-24 Tom Tromey <tom@tromey.com> * dwarf2/read.h (struct dwarf2_per_cu_data) <type_unit_group_p>: New method. * dwarf2/read.c (IS_TYPE_UNIT_GROUP): Remove. (dw2_do_instantiate_symtab, dw2_get_file_names) (build_type_psymtab_dependencies, load_full_type_unit): Update.
2020-02-08Add some methods to dwarf2_per_cu_dataTom Tromey1-0/+43
This changes a few helper functions to be methods on dwarf2_per_cu_data. 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/loc.c (dwarf2_find_location_expression) (dwarf_evaluate_loc_desc::get_tls_address) (dwarf_evaluate_loc_desc::push_dwarf_reg_entry_value) (rw_pieced_value, dwarf2_evaluate_loc_desc_full) (dwarf2_locexpr_baton_eval, dwarf2_evaluate_property) (dwarf2_compile_property_to_c) (dwarf2_loc_desc_get_symbol_read_needs) (dwarf2_compile_expr_to_ax, locexpr_describe_location) (locexpr_tracepoint_var_ref, locexpr_generate_c_location) (loclist_describe_location, loclist_tracepoint_var_ref) (loclist_generate_c_location): Update. * compile/compile-loc2c.c (do_compile_dwarf_expr_to_c): Update. * dwarf2/loc.h (dwarf2_per_cu_objfile, dwarf2_per_cu_addr_size) (dwarf2_per_cu_ref_addr_size, dwarf2_per_cu_offset_size) (dwarf2_per_cu_text_offset, dwarf2_version): Don't declare. * dwarf2/read.c (dwarf2_per_cu_data::objfile) (dwarf2_per_cu_data::addr_size) (dwarf2_per_cu_data::ref_addr_size) (dwarf2_per_cu_data::text_offset) (dwarf2_per_cu_data::addr_type): Now methods. (per_cu_header_read_in): Make per_cu "const". (dwarf2_version): Remove. (dwarf2_per_cu_data::int_type): Now a method. (dwarf2_per_cu_data::_addr_sized_int_type): Likewise. (set_die_type, read_array_type, read_subrange_index_type) (read_tag_string_type, read_subrange_type): Update. * dwarf2/read.h (struct dwarf2_per_cu_data) <addr_size, offset_size, ref_addr_size, text_offset, addr_type, version, objfile, int_type, addr_sized_int_type>: Declare methods. Change-Id: I07a42fa26e00795352389fa7a0cc1c12997d26f7
2020-02-08Move dwarf2_per_cu_data::imported_symtabs earlierTom Tromey1-26/+26
This moves dwarf2_per_cu_data::imported_symtabs earlier, near where the other data members are located. 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.h (struct dwarf2_per_cu_data) <imported_symtabs>: Move earlier. Change-Id: I314ddaa6f67c53a848e513b3f6d42913bd957833
2020-02-08Move DWARF line_header to new fileTom Tromey1-0/+3
This moves the line_header class to a pair of new files, making dwarf2/read.c somewhat smaller. 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.h (dwarf_line_debug): Declare. * Makefile.in (COMMON_SFILES): Add dwarf2/line-header.c. * dwarf2/read.c: Move line_header code to new files. (dwarf_line_debug): No longer static. * dwarf2/line-header.c: New file. * dwarf2/line-header.h: New file. Change-Id: I8d9d8a2398b4e888e20cc5dd68d041c28b5a06e3
2020-02-08Move dwarf_always_disassemble to dwarf2/loc.cTom Tromey1-2/+0
dwarf_always_disassemble is only used in dwarf2/loc.c, so move the definition and the command infrastructure to that file. 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.c (dwarf_always_disassemble) (show_dwarf_always_disassemble): Move to loc.c. (_initialize_dwarf2_read): Move "always-disassemble" registration to loc.c. * dwarf2/read.h (dwarf_always_disassemble): Don't declare. * dwarf2/loc.c (dwarf_always_disassemble): Move from read.c. Now static. (show_dwarf_always_disassemble): Move from read.c. (_initialize_dwarf2loc): Move always-disassemble from read.c. Change-Id: I33fb88112e98e583c3f4919d20e4d100f2ea0124
2020-02-08Change dwarf2_per_objfile::quick_file_names_table to htab_upTom Tromey1-1/+1
This changes dwarf2_per_objfile::quick_file_names_table to be an htab_up. This just removes a bit of manual management. 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.c (~dwarf2_per_objfile): Update. (create_quick_file_names_table): Return htab_up. (dw2_get_file_names_reader, dw2_forget_cached_source_info): Update. * dwarf2/read.h (struct dwarf2_per_objfile) <quick_file_names_table>: Now htab_up. Change-Id: I4ff2fce8b8af27f4bfe01a11b97a889edfd23151
2020-02-08Change dwarf2_per_objfile::die_type_hash to htab_upTom Tromey1-1/+1
This changes dwarf2_per_objfile::die_type_hash to be an htab_up, moving its contents off the objfile obstack. 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.c (set_die_type, get_die_type_at_offset): Update. * dwarf2/read.h (struct dwarf2_per_objfile) <die_type_hash>: Now htab_up. Change-Id: Ic651f99ebf71bf7ad2dc2880192adacf7b60964a
2020-02-08Change dwarf2_per_objfile::line_header_hash to htab_upTom Tromey1-1/+1
This changes dwarf2_per_objfile::line_header_hash to be an htab_up, and changes it to use heap allocation. 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.c (~dwarf2_per_objfile): Don't delete line_header_hash. (handle_DW_AT_stmt_list): Update. Don't allocate on obstack. * dwarf2/read.h (struct dwarf2_per_objfile) <line_header_hash>: Change type to htab_up. Change-Id: Icb148a270838c0f96f38fc4a28b5b77d067927b6
2020-02-08Change dwarf2_per_objfile::type_unit_groups to htab_upTom Tromey1-1/+1
This changes dwarf2_per_objfile::type_unit_groups to be an htab_up, again allowing us to move the memory used by the hash table from the objfile obstack to the heap. 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.c (allocate_type_unit_groups_table): Return htab_up. Don't allocate on obstack. (get_type_unit_group, dwarf2_build_psymtabs_hard): Update. * dwarf2/read.h (struct dwarf2_per_objfile) <type_unit_groups>: Change type to htab_up. Change-Id: Ia045df0ff3ec30aac813da5a9a2314a607ef7ec8
2020-02-08Change dwarf2_per_objfile::signatured_types to be htab_upTom Tromey1-1/+1
This changes dwarf2_per_objfile::signatured_types to be an htab_up. This in turn lets us change it not to use the objfile obstack for allocation; obstack allocation for hash tables is a bad practice because it leads to excess memory use if the table is ever resized. gdb/ChangeLog 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.h (struct dwarf2_per_objfile) <signatured_types>: Change type to htab_up. * dwarf2/read.c (create_signatured_type_table_from_index) (create_signatured_type_table_from_debug_names) (create_all_type_units, add_type_unit) (lookup_dwo_signatured_type, lookup_signatured_type) (process_skeletonless_type_unit): Update. (create_debug_type_hash_table, create_debug_types_hash_table): Change type of types_htab. (allocate_signatured_type_table, allocate_dwo_unit_table): Return htab_up. Don't allocate on obstack. (create_cus_hash_table): Change type of cus_htab parameter. (struct dwo_file) <cus, tus>: Now htab_up. (lookup_dwo_signatured_type, lookup_dwo_cutu) (process_dwo_file_for_skeletonless_type_units, lookup_dwo_cutu) (queue_and_load_all_dwo_tus): Update. * dwarf2/index-write.c (write_gdbindex): Update. (write_debug_names): Update. Change-Id: I290a209b96945fb5f415c82723b62830e9c4b467
2020-02-08Remove DWARF queue-related globalsTom Tromey1-0/+23
This removes some queue-related globals from the DWARF reader, in favor of a new member on dwarf2_per_objfile. Globals must be avoided in this code, because they prevent multi-threading the reader. gdb/ChangeLog 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/read.h (struct dwarf2_queue_item): Move from dwarf2/read.c. Remove "next" member. Add constructor ntad destructor. (struct dwarf2_per_objfile) <queue>: New member. * dwarf2/read.c (struct dwarf2_queue_item): Move to dwarf2/read.h. (dwarf2_queue, dwarf2_queue_tail): Remove. (class dwarf2_queue_guard): Add parameter to constructor. Use DISABLE_COPY_AND_ASSIGN. <m_per_objfile>: New member. <~dwarf2_queue_guard>: Rewrite. (dw2_do_instantiate_symtab, queue_comp_unit, process_queue): Update. (~dwarf2_queue_item): New. Change-Id: Ied1f6ff3691352a66c4709b0b2cba0588f49f79a
2020-02-08Move DWARF code to dwarf2/ subdirectoryTom Tromey1-0/+455
This moves all the remaining DWARF code to the new dwarf2 subdirectory. This is just a simple renaming, with updates to includes as needed. gdb/ChangeLog 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2/expr.c: Rename from dwarf2expr.c. * dwarf2/expr.h: Rename from dwarf2expr.h. * dwarf2/frame-tailcall.c: Rename from dwarf2-frame-tailcall.c. * dwarf2/frame-tailcall.h: Rename from dwarf2-frame-tailcall.h. * dwarf2/frame.c: Rename from dwarf2-frame.c. * dwarf2/frame.h: Rename from dwarf2-frame.h. * dwarf2/index-cache.c: Rename from dwarf-index-cache.c. * dwarf2/index-cache.h: Rename from dwarf-index-cache.h. * dwarf2/index-common.c: Rename from dwarf-index-common.c. * dwarf2/index-common.h: Rename from dwarf-index-common.h. * dwarf2/index-write.c: Rename from dwarf-index-write.c. * dwarf2/index-write.h: Rename from dwarf-index-write.h. * dwarf2/loc.c: Rename from dwarf2loc.c. * dwarf2/loc.h: Rename from dwarf2loc.h. * dwarf2/read.c: Rename from dwarf2read.c. * dwarf2/read.h: Rename from dwarf2read.h. * dwarf2/abbrev.c, aarch64-tdep.c, alpha-tdep.c, amd64-darwin-tdep.c, arc-tdep.c, arm-tdep.c, bfin-tdep.c, compile/compile-c-symbols.c, compile/compile-cplus-symbols.c, compile/compile-loc2c.c, cris-tdep.c, csky-tdep.c, findvar.c, gdbtypes.c, guile/scm-type.c, h8300-tdep.c, hppa-bsd-tdep.c, hppa-linux-tdep.c, i386-darwin-tdep.c, i386-linux-tdep.c, i386-tdep.c, iq2000-tdep.c, m32c-tdep.c, m68hc11-tdep.c, m68k-tdep.c, microblaze-tdep.c, mips-tdep.c, mn10300-tdep.c, msp430-tdep.c, nds32-tdep.c, nios2-tdep.c, or1k-tdep.c, riscv-tdep.c, rl78-tdep.c, rs6000-tdep.c, rx-tdep.c, s12z-tdep.c, s390-tdep.c, score-tdep.c, sh-tdep.c, sparc-linux-tdep.c, sparc-tdep.c, sparc64-linux-tdep.c, sparc64-tdep.c, tic6x-tdep.c, tilegx-tdep.c, v850-tdep.c, xstormy16-tdep.c, xtensa-tdep.c: Update. * Makefile.in (COMMON_SFILES): Update. (HFILES_NO_SRCDIR): Update. Change-Id: Ied9ce1436cd27ac4a4cffef10ec92e396f181928