2012-11-27 06:31:29 +08:00
|
|
|
/* Read MiniDebugInfo data from an objfile.
|
|
|
|
|
2016-01-01 12:33:14 +08:00
|
|
|
Copyright (C) 2012-2016 Free Software Foundation, Inc.
|
2012-11-27 06:31:29 +08:00
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
#include "gdb_bfd.h"
|
|
|
|
#include "symfile.h"
|
|
|
|
#include "objfiles.h"
|
|
|
|
#include "gdbcore.h"
|
|
|
|
|
|
|
|
#ifdef HAVE_LIBLZMA
|
|
|
|
|
|
|
|
#include <lzma.h>
|
|
|
|
|
|
|
|
/* Allocator function for LZMA. */
|
|
|
|
|
|
|
|
static void *
|
|
|
|
alloc_lzma (void *opaque, size_t nmemb, size_t size)
|
|
|
|
{
|
|
|
|
return xmalloc (nmemb * size);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free function for LZMA. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
free_lzma (void *opaque, void *ptr)
|
|
|
|
{
|
|
|
|
xfree (ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The allocator object for LZMA. Note that 'gdb_lzma_allocator'
|
|
|
|
cannot be const due to the lzma library function prototypes. */
|
|
|
|
|
|
|
|
static lzma_allocator gdb_lzma_allocator = { alloc_lzma, free_lzma, NULL };
|
|
|
|
|
|
|
|
/* Custom bfd_openr_iovec implementation to read compressed data from
|
|
|
|
a section. This keeps only the last decompressed block in memory
|
|
|
|
to allow larger data without using to much memory. */
|
|
|
|
|
2014-06-06 04:36:27 +08:00
|
|
|
struct gdb_lzma_stream
|
2012-11-27 06:31:29 +08:00
|
|
|
{
|
|
|
|
/* Section of input BFD from which we are decoding data. */
|
|
|
|
asection *section;
|
|
|
|
|
|
|
|
/* lzma library decompression state. */
|
|
|
|
lzma_index *index;
|
|
|
|
|
|
|
|
/* Currently decoded block. */
|
|
|
|
bfd_size_type data_start;
|
|
|
|
bfd_size_type data_end;
|
|
|
|
gdb_byte *data;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* bfd_openr_iovec OPEN_P implementation for
|
|
|
|
find_separate_debug_file_in_section. OPEN_CLOSURE is 'asection *'
|
|
|
|
of the section to decompress.
|
|
|
|
|
2014-06-06 04:36:27 +08:00
|
|
|
Return 'struct gdb_lzma_stream *' must be freed by caller by xfree,
|
|
|
|
together with its INDEX lzma data. */
|
2012-11-27 06:31:29 +08:00
|
|
|
|
|
|
|
static void *
|
|
|
|
lzma_open (struct bfd *nbfd, void *open_closure)
|
|
|
|
{
|
2015-09-26 02:08:07 +08:00
|
|
|
asection *section = (asection *) open_closure;
|
2012-11-27 06:31:29 +08:00
|
|
|
bfd_size_type size, offset;
|
|
|
|
lzma_stream_flags options;
|
|
|
|
gdb_byte footer[LZMA_STREAM_HEADER_SIZE];
|
|
|
|
gdb_byte *indexdata;
|
|
|
|
lzma_index *index;
|
|
|
|
int ret;
|
|
|
|
uint64_t memlimit = UINT64_MAX;
|
2014-06-06 04:36:27 +08:00
|
|
|
struct gdb_lzma_stream *lstream;
|
2012-11-27 06:31:29 +08:00
|
|
|
size_t pos;
|
|
|
|
|
|
|
|
size = bfd_get_section_size (section);
|
|
|
|
offset = section->filepos + size - LZMA_STREAM_HEADER_SIZE;
|
|
|
|
if (size < LZMA_STREAM_HEADER_SIZE
|
|
|
|
|| bfd_seek (section->owner, offset, SEEK_SET) != 0
|
|
|
|
|| bfd_bread (footer, LZMA_STREAM_HEADER_SIZE, section->owner)
|
|
|
|
!= LZMA_STREAM_HEADER_SIZE
|
|
|
|
|| lzma_stream_footer_decode (&options, footer) != LZMA_OK
|
|
|
|
|| offset < options.backward_size)
|
|
|
|
{
|
|
|
|
bfd_set_error (bfd_error_wrong_format);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
offset -= options.backward_size;
|
2015-09-26 02:08:06 +08:00
|
|
|
indexdata = (gdb_byte *) xmalloc (options.backward_size);
|
2012-11-27 06:31:29 +08:00
|
|
|
index = NULL;
|
|
|
|
pos = 0;
|
|
|
|
if (bfd_seek (section->owner, offset, SEEK_SET) != 0
|
|
|
|
|| bfd_bread (indexdata, options.backward_size, section->owner)
|
|
|
|
!= options.backward_size
|
|
|
|
|| lzma_index_buffer_decode (&index, &memlimit, &gdb_lzma_allocator,
|
|
|
|
indexdata, &pos, options.backward_size)
|
|
|
|
!= LZMA_OK
|
|
|
|
|| lzma_index_size (index) != options.backward_size)
|
|
|
|
{
|
|
|
|
xfree (indexdata);
|
|
|
|
bfd_set_error (bfd_error_wrong_format);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
xfree (indexdata);
|
|
|
|
|
Replace some xmalloc-family functions with XNEW-family ones
This patch is part of the make-gdb-buildable-in-C++ effort. The idea is
to change some calls to the xmalloc family of functions to calls to the
equivalents in the XNEW family. This avoids adding an explicit cast, so
it keeps the code a bit more readable. Some of them also map relatively
well to a C++ equivalent (XNEW (struct foo) -> new foo), so it will be
possible to do scripted replacements if needed.
I only changed calls that were obviously allocating memory for one or
multiple "objects". Allocation of variable sizes (such as strings or
buffer handling) will be for later (and won't use XNEW).
- xmalloc (sizeof (struct foo)) -> XNEW (struct foo)
- xmalloc (num * sizeof (struct foo)) -> XNEWVEC (struct foo, num)
- xcalloc (1, sizeof (struct foo)) -> XCNEW (struct foo)
- xcalloc (num, sizeof (struct foo)) -> XCNEWVEC (struct foo, num)
- xrealloc (p, num * sizeof (struct foo) -> XRESIZEVEC (struct foo, p, num)
- obstack_alloc (ob, sizeof (struct foo)) -> XOBNEW (ob, struct foo)
- obstack_alloc (ob, num * sizeof (struct foo)) -> XOBNEWVEC (ob, struct foo, num)
- alloca (sizeof (struct foo)) -> XALLOCA (struct foo)
- alloca (num * sizeof (struct foo)) -> XALLOCAVEC (struct foo, num)
Some instances of xmalloc followed by memset to zero the buffer were
replaced by XCNEW or XCNEWVEC.
I regtested on x86-64, Ubuntu 14.04, but the patch touches many
architecture-specific files. For those I'll have to rely on the
buildbot or people complaining that I broke their gdb.
gdb/ChangeLog:
* aarch64-linux-nat.c (aarch64_add_process): Likewise.
* aarch64-tdep.c (aarch64_gdbarch_init): Likewise.
* ada-exp.y (write_ambiguous_var): Likewise.
* ada-lang.c (resolve_subexp): Likewise.
(user_select_syms): Likewise.
(assign_aggregate): Likewise.
(ada_evaluate_subexp): Likewise.
(cache_symbol): Likewise.
* addrmap.c (allocate_key): Likewise.
(addrmap_create_mutable): Likewise.
* aix-thread.c (sync_threadlists): Likewise.
* alpha-tdep.c (alpha_push_dummy_call): Likewise.
(alpha_gdbarch_init): Likewise.
* amd64-windows-tdep.c (amd64_windows_push_arguments): Likewise.
* arm-linux-nat.c (arm_linux_add_process): Likewise.
* arm-linux-tdep.c (arm_linux_displaced_step_copy_insn): Likewise.
* arm-tdep.c (push_stack_item): Likewise.
(arm_displaced_step_copy_insn): Likewise.
(arm_gdbarch_init): Likewise.
(_initialize_arm_tdep): Likewise.
* avr-tdep.c (push_stack_item): Likewise.
* ax-general.c (new_agent_expr): Likewise.
* block.c (block_initialize_namespace): Likewise.
* breakpoint.c (alloc_counted_command_line): Likewise.
(update_dprintf_command_list): Likewise.
(parse_breakpoint_sals): Likewise.
(decode_static_tracepoint_spec): Likewise.
(until_break_command): Likewise.
(clear_command): Likewise.
(update_global_location_list): Likewise.
(get_breakpoint_objfile_data) Likewise.
* btrace.c (ftrace_new_function): Likewise.
(btrace_set_insn_history): Likewise.
(btrace_set_call_history): Likewise.
* buildsym.c (add_symbol_to_list): Likewise.
(record_pending_block): Likewise.
(start_subfile): Likewise.
(start_buildsym_compunit): Likewise.
(push_subfile): Likewise.
(end_symtab_get_static_block): Likewise.
(buildsym_init): Likewise.
* cli/cli-cmds.c (source_command): Likewise.
* cli/cli-decode.c (add_cmd): Likewise.
* cli/cli-script.c (build_command_line): Likewise.
(setup_user_args): Likewise.
(realloc_body_list): Likewise.
(process_next_line): Likewise.
(copy_command_lines): Likewise.
* cli/cli-setshow.c (do_set_command): Likewise.
* coff-pe-read.c (read_pe_exported_syms): Likewise.
* coffread.c (coff_locate_sections): Likewise.
(coff_symtab_read): Likewise.
(coff_read_struct_type): Likewise.
* common/cleanups.c (make_my_cleanup2): Likewise.
* common/common-exceptions.c (throw_it): Likewise.
* common/filestuff.c (make_cleanup_close): Likewise.
* common/format.c (parse_format_string): Likewise.
* common/queue.h (DEFINE_QUEUE_P): Likewise.
* compile/compile-object-load.c (munmap_list_add): Likewise.
(compile_object_load): Likewise.
* compile/compile-object-run.c (compile_object_run): Likewise.
* compile/compile.c (append_args): Likewise.
* corefile.c (specify_exec_file_hook): Likewise.
* cp-support.c (make_symbol_overload_list): Likewise.
* cris-tdep.c (push_stack_item): Likewise.
(cris_gdbarch_init): Likewise.
* ctf.c (ctf_trace_file_writer_new): Likewise.
* dbxread.c (init_header_files): Likewise.
(add_new_header_file): Likewise.
(init_bincl_list): Likewise.
(dbx_end_psymtab): Likewise.
(start_psymtab): Likewise.
(dbx_end_psymtab): Likewise.
* dcache.c (dcache_init): Likewise.
* dictionary.c (dict_create_hashed): Likewise.
(dict_create_hashed_expandable): Likewise.
(dict_create_linear): Likewise.
(dict_create_linear_expandable): Likewise.
* dtrace-probe.c (dtrace_process_dof_probe): Likewise.
* dummy-frame.c (register_dummy_frame_dtor): Likewise.
* dwarf2-frame-tailcall.c (cache_new_ref1): Likewise.
* dwarf2-frame.c (dwarf2_build_frame_info): Likewise.
(decode_frame_entry_1): Likewise.
* dwarf2expr.c (new_dwarf_expr_context): Likewise.
* dwarf2loc.c (dwarf2_compile_expr_to_ax): Likewise.
* dwarf2read.c (dwarf2_has_info): Likewise.
(create_signatured_type_table_from_index): Likewise.
(dwarf2_read_index): Likewise.
(dw2_get_file_names_reader): Likewise.
(create_all_type_units): Likewise.
(read_cutu_die_from_dwo): Likewise.
(init_tu_and_read_dwo_dies): Likewise.
(init_cutu_and_read_dies): Likewise.
(create_all_comp_units): Likewise.
(queue_comp_unit): Likewise.
(inherit_abstract_dies): Likewise.
(read_call_site_scope): Likewise.
(dwarf2_add_field): Likewise.
(dwarf2_add_typedef): Likewise.
(dwarf2_add_member_fn): Likewise.
(attr_to_dynamic_prop): Likewise.
(abbrev_table_alloc_abbrev): Likewise.
(abbrev_table_read_table): Likewise.
(add_include_dir): Likewise.
(add_file_name): Likewise.
(dwarf_decode_line_header): Likewise.
(dwarf2_const_value_attr): Likewise.
(dwarf_alloc_block): Likewise.
(parse_macro_definition): Likewise.
(set_die_type): Likewise.
(write_psymtabs_to_index): Likewise.
(create_cus_from_index): Likewise.
(dwarf2_create_include_psymtab): Likewise.
(process_psymtab_comp_unit_reader): Likewise.
(build_type_psymtab_dependencies): Likewise.
(read_comp_units_from_section): Likewise.
(compute_compunit_symtab_includes): Likewise.
(create_dwo_unit_in_dwp_v1): Likewise.
(create_dwo_unit_in_dwp_v2): Likewise.
(read_func_scope): Likewise.
(process_structure_scope): Likewise.
(mark_common_block_symbol_computed): Likewise.
(load_partial_dies): Likewise.
(dwarf2_symbol_mark_computed): Likewise.
* elfread.c (elf_symfile_segments): Likewise.
(elf_read_minimal_symbols): Likewise.
* environ.c (make_environ): Likewise.
* eval.c (evaluate_subexp_standard): Likewise.
* event-loop.c (create_file_handler): Likewise.
(create_async_signal_handler): Likewise.
(create_async_event_handler): Likewise.
(create_timer): Likewise.
* exec.c (build_section_table): Likewise.
* fbsd-nat.c (fbsd_remember_child): Likewise.
* fork-child.c (fork_inferior): Likewise.
* frv-tdep.c (new_variant): Likewise.
* gdbarch.sh (gdbarch_alloc): Likewise.
(append_name): Likewise.
* gdbtypes.c (rank_function): Likewise.
(copy_type_recursive): Likewise.
(add_dyn_prop): Likewise.
* gnu-nat.c (make_proc): Likewise.
(make_inf): Likewise.
(gnu_write_inferior): Likewise.
* gnu-v3-abi.c (build_gdb_vtable_type): Likewise.
(build_std_type_info_type): Likewise.
* guile/scm-param.c (compute_enum_list): Likewise.
* guile/scm-utils.c (gdbscm_parse_function_args): Likewise.
* guile/scm-value.c (gdbscm_value_call): Likewise.
* h8300-tdep.c (h8300_gdbarch_init): Likewise.
* hppa-tdep.c (hppa_init_objfile_priv_data): Likewise.
(read_unwind_info): Likewise.
* ia64-tdep.c (ia64_gdbarch_init): Likewise.
* infcall.c (dummy_frame_context_saver_setup): Likewise.
(call_function_by_hand_dummy): Likewise.
* infcmd.c (step_once): Likewise.
(finish_forward): Likewise.
(attach_command): Likewise.
(notice_new_inferior): Likewise.
* inferior.c (add_inferior_silent): Likewise.
* infrun.c (add_displaced_stepping_state): Likewise.
(save_infcall_control_state): Likewise.
(save_inferior_ptid): Likewise.
(_initialize_infrun): Likewise.
* jit.c (bfd_open_from_target_memory): Likewise.
(jit_gdbarch_data_init): Likewise.
* language.c (add_language): Likewise.
* linespec.c (decode_line_2): Likewise.
* linux-nat.c (add_to_pid_list): Likewise.
(add_initial_lwp): Likewise.
* linux-thread-db.c (add_thread_db_info): Likewise.
(record_thread): Likewise.
(info_auto_load_libthread_db): Likewise.
* m32c-tdep.c (m32c_gdbarch_init): Likewise.
* m68hc11-tdep.c (m68hc11_gdbarch_init): Likewise.
* m68k-tdep.c (m68k_gdbarch_init): Likewise.
* m88k-tdep.c (m88k_analyze_prologue): Likewise.
* macrocmd.c (macro_define_command): Likewise.
* macroexp.c (gather_arguments): Likewise.
* macroscope.c (sal_macro_scope): Likewise.
* macrotab.c (new_macro_table): Likewise.
* mdebugread.c (push_parse_stack): Likewise.
(parse_partial_symbols): Likewise.
(parse_symbol): Likewise.
(psymtab_to_symtab_1): Likewise.
(new_block): Likewise.
(new_psymtab): Likewise.
(mdebug_build_psymtabs): Likewise.
(add_pending): Likewise.
(elfmdebug_build_psymtabs): Likewise.
* mep-tdep.c (mep_gdbarch_init): Likewise.
* mi/mi-main.c (mi_execute_command): Likewise.
* mi/mi-parse.c (mi_parse_argv): Likewise.
* minidebug.c (lzma_open): Likewise.
* minsyms.c (terminate_minimal_symbol_table): Likewise.
* mips-linux-nat.c (mips_linux_insert_watchpoint): Likewise.
* mips-tdep.c (mips_gdbarch_init): Likewise.
* mn10300-tdep.c (mn10300_gdbarch_init): Likewise.
* msp430-tdep.c (msp430_gdbarch_init): Likewise.
* mt-tdep.c (mt_registers_info): Likewise.
* nat/aarch64-linux.c (aarch64_linux_new_thread): Likewise.
* nat/linux-btrace.c (linux_enable_bts): Likewise.
(linux_enable_pt): Likewise.
* nat/linux-osdata.c (linux_xfer_osdata_processes): Likewise.
(linux_xfer_osdata_processgroups): Likewise.
* nios2-tdep.c (nios2_gdbarch_init): Likewise.
* nto-procfs.c (procfs_meminfo): Likewise.
* objc-lang.c (start_msglist): Likewise.
(selectors_info): Likewise.
(classes_info): Likewise.
(find_methods): Likewise.
* objfiles.c (allocate_objfile): Likewise.
(update_section_map): Likewise.
* osabi.c (gdbarch_register_osabi): Likewise.
(gdbarch_register_osabi_sniffer): Likewise.
* parse.c (start_arglist): Likewise.
* ppc-linux-nat.c (hwdebug_find_thread_points_by_tid): Likewise.
(hwdebug_insert_point): Likewise.
* printcmd.c (display_command): Likewise.
(ui_printf): Likewise.
* procfs.c (create_procinfo): Likewise.
(load_syscalls): Likewise.
(proc_get_LDT_entry): Likewise.
(proc_update_threads): Likewise.
* prologue-value.c (make_pv_area): Likewise.
(pv_area_store): Likewise.
* psymtab.c (extend_psymbol_list): Likewise.
(init_psymbol_list): Likewise.
(allocate_psymtab): Likewise.
* python/py-inferior.c (add_thread_object): Likewise.
* python/py-param.c (compute_enum_values): Likewise.
* python/py-value.c (valpy_call): Likewise.
* python/py-varobj.c (py_varobj_iter_next): Likewise.
* python/python.c (ensure_python_env): Likewise.
* record-btrace.c (record_btrace_start_replaying): Likewise.
* record-full.c (record_full_reg_alloc): Likewise.
(record_full_mem_alloc): Likewise.
(record_full_end_alloc): Likewise.
(record_full_core_xfer_partial): Likewise.
* regcache.c (get_thread_arch_aspace_regcache): Likewise.
* remote-fileio.c (remote_fileio_init_fd_map): Likewise.
* remote-notif.c (remote_notif_state_allocate): Likewise.
* remote.c (demand_private_info): Likewise.
(remote_notif_stop_alloc_reply): Likewise.
(remote_enable_btrace): Likewise.
* reverse.c (save_bookmark_command): Likewise.
* rl78-tdep.c (rl78_gdbarch_init): Likewise.
* rx-tdep.c (rx_gdbarch_init): Likewise.
* s390-linux-nat.c (s390_insert_watchpoint): Likewise.
* ser-go32.c (dos_get_tty_state): Likewise.
(dos_copy_tty_state): Likewise.
* ser-mingw.c (ser_windows_open): Likewise.
(ser_console_wait_handle): Likewise.
(ser_console_get_tty_state): Likewise.
(make_pipe_state): Likewise.
(net_windows_open): Likewise.
* ser-unix.c (hardwire_get_tty_state): Likewise.
(hardwire_copy_tty_state): Likewise.
* solib-aix.c (solib_aix_new_lm_info): Likewise.
* solib-dsbt.c (dsbt_current_sos): Likewise.
(dsbt_relocate_main_executable): Likewise.
* solib-frv.c (frv_current_sos): Likewise.
(frv_relocate_main_executable): Likewise.
* solib-spu.c (spu_bfd_fopen): Likewise.
* solib-svr4.c (lm_info_read): Likewise.
(svr4_copy_library_list): Likewise.
(svr4_default_sos): Likewise.
* source.c (find_source_lines): Likewise.
(line_info): Likewise.
(add_substitute_path_rule): Likewise.
* spu-linux-nat.c (spu_bfd_open): Likewise.
* spu-tdep.c (info_spu_dma_cmdlist): Likewise.
* stabsread.c (dbx_lookup_type): Likewise.
(read_type): Likewise.
(read_member_functions): Likewise.
(read_struct_fields): Likewise.
(read_baseclasses): Likewise.
(read_args): Likewise.
(_initialize_stabsread): Likewise.
* stack.c (func_command): Likewise.
* stap-probe.c (handle_stap_probe): Likewise.
* symfile.c (addrs_section_sort): Likewise.
(addr_info_make_relative): Likewise.
(load_section_callback): Likewise.
(add_symbol_file_command): Likewise.
(init_filename_language_table): Likewise.
* symtab.c (create_filename_seen_cache): Likewise.
(sort_search_symbols_remove_dups): Likewise.
(search_symbols): Likewise.
* target.c (make_cleanup_restore_target_terminal): Likewise.
* thread.c (new_thread): Likewise.
(enable_thread_stack_temporaries): Likewise.
(make_cleanup_restore_current_thread): Likewise.
(thread_apply_all_command): Likewise.
* tic6x-tdep.c (tic6x_gdbarch_init): Likewise.
* top.c (gdb_readline_wrapper): Likewise.
* tracefile-tfile.c (tfile_trace_file_writer_new): Likewise.
* tracepoint.c (trace_find_line_command): Likewise.
(all_tracepoint_actions_and_cleanup): Likewise.
(make_cleanup_restore_current_traceframe): Likewise.
(get_uploaded_tp): Likewise.
(get_uploaded_tsv): Likewise.
* tui/tui-data.c (tui_alloc_generic_win_info): Likewise.
(tui_alloc_win_info): Likewise.
(tui_alloc_content): Likewise.
(tui_add_content_elements): Likewise.
* tui/tui-disasm.c (tui_find_disassembly_address): Likewise.
(tui_set_disassem_content): Likewise.
* ui-file.c (ui_file_new): Likewise.
(stdio_file_new): Likewise.
(tee_file_new): Likewise.
* utils.c (make_cleanup_restore_integer): Likewise.
(add_internal_problem_command): Likewise.
* v850-tdep.c (v850_gdbarch_init): Likewise.
* valops.c (find_oload_champ): Likewise.
* value.c (allocate_value_lazy): Likewise.
(record_latest_value): Likewise.
(create_internalvar): Likewise.
* varobj.c (install_variable): Likewise.
(new_variable): Likewise.
(new_root_variable): Likewise.
(cppush): Likewise.
(_initialize_varobj): Likewise.
* windows-nat.c (windows_make_so): Likewise.
* x86-nat.c (x86_add_process): Likewise.
* xcoffread.c (arrange_linetable): Likewise.
(allocate_include_entry): Likewise.
(process_linenos): Likewise.
(SYMBOL_DUP): Likewise.
(xcoff_start_psymtab): Likewise.
(xcoff_end_psymtab): Likewise.
* xml-support.c (gdb_xml_parse_attr_ulongest): Likewise.
* xtensa-tdep.c (xtensa_register_type): Likewise.
* gdbarch.c: Regenerate.
* gdbarch.h: Regenerate.
gdb/gdbserver/ChangeLog:
* ax.c (gdb_parse_agent_expr): Likewise.
(compile_bytecodes): Likewise.
* dll.c (loaded_dll): Likewise.
* event-loop.c (append_callback_event): Likewise.
(create_file_handler): Likewise.
(create_file_event): Likewise.
* hostio.c (handle_open): Likewise.
* inferiors.c (add_thread): Likewise.
(add_process): Likewise.
* linux-aarch64-low.c (aarch64_linux_new_process): Likewise.
* linux-arm-low.c (arm_new_process): Likewise.
(arm_new_thread): Likewise.
* linux-low.c (add_to_pid_list): Likewise.
(linux_add_process): Likewise.
(handle_extended_wait): Likewise.
(add_lwp): Likewise.
(enqueue_one_deferred_signal): Likewise.
(enqueue_pending_signal): Likewise.
(linux_resume_one_lwp_throw): Likewise.
(linux_resume_one_thread): Likewise.
(linux_read_memory): Likewise.
(linux_write_memory): Likewise.
* linux-mips-low.c (mips_linux_new_process): Likewise.
(mips_linux_new_thread): Likewise.
(mips_add_watchpoint): Likewise.
* linux-x86-low.c (initialize_low_arch): Likewise.
* lynx-low.c (lynx_add_process): Likewise.
* mem-break.c (set_raw_breakpoint_at): Likewise.
(set_breakpoint): Likewise.
(add_condition_to_breakpoint): Likewise.
(add_commands_to_breakpoint): Likewise.
(clone_agent_expr): Likewise.
(clone_one_breakpoint): Likewise.
* regcache.c (new_register_cache): Likewise.
* remote-utils.c (look_up_one_symbol): Likewise.
* server.c (queue_stop_reply): Likewise.
(start_inferior): Likewise.
(queue_stop_reply_callback): Likewise.
(handle_target_event): Likewise.
* spu-low.c (fetch_ppc_memory): Likewise.
(store_ppc_memory): Likewise.
* target.c (set_target_ops): Likewise.
* thread-db.c (thread_db_load_search): Likewise.
(try_thread_db_load_1): Likewise.
* tracepoint.c (add_tracepoint): Likewise.
(add_tracepoint_action): Likewise.
(create_trace_state_variable): Likewise.
(cmd_qtdpsrc): Likewise.
(cmd_qtro): Likewise.
(add_while_stepping_state): Likewise.
* win32-low.c (child_add_thread): Likewise.
(get_image_name): Likewise.
2015-08-27 05:16:07 +08:00
|
|
|
lstream = XCNEW (struct gdb_lzma_stream);
|
2012-11-27 06:31:29 +08:00
|
|
|
lstream->section = section;
|
|
|
|
lstream->index = index;
|
|
|
|
|
|
|
|
return lstream;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* bfd_openr_iovec PREAD_P implementation for
|
|
|
|
find_separate_debug_file_in_section. Passed STREAM
|
2014-06-06 04:36:27 +08:00
|
|
|
is 'struct gdb_lzma_stream *'. */
|
2012-11-27 06:31:29 +08:00
|
|
|
|
|
|
|
static file_ptr
|
|
|
|
lzma_pread (struct bfd *nbfd, void *stream, void *buf, file_ptr nbytes,
|
|
|
|
file_ptr offset)
|
|
|
|
{
|
2015-09-26 02:08:07 +08:00
|
|
|
struct gdb_lzma_stream *lstream = (struct gdb_lzma_stream *) stream;
|
2012-11-27 06:31:29 +08:00
|
|
|
bfd_size_type chunk_size;
|
|
|
|
lzma_index_iter iter;
|
|
|
|
gdb_byte *compressed, *uncompressed;
|
|
|
|
file_ptr block_offset;
|
|
|
|
lzma_filter filters[LZMA_FILTERS_MAX + 1];
|
|
|
|
lzma_block block;
|
|
|
|
size_t compressed_pos, uncompressed_pos;
|
|
|
|
file_ptr res;
|
|
|
|
|
|
|
|
res = 0;
|
|
|
|
while (nbytes > 0)
|
|
|
|
{
|
|
|
|
if (lstream->data == NULL
|
|
|
|
|| lstream->data_start > offset || offset >= lstream->data_end)
|
|
|
|
{
|
|
|
|
asection *section = lstream->section;
|
|
|
|
|
|
|
|
lzma_index_iter_init (&iter, lstream->index);
|
|
|
|
if (lzma_index_iter_locate (&iter, offset))
|
|
|
|
break;
|
|
|
|
|
2015-09-26 02:08:06 +08:00
|
|
|
compressed = (gdb_byte *) xmalloc (iter.block.total_size);
|
2012-11-27 06:31:29 +08:00
|
|
|
block_offset = section->filepos + iter.block.compressed_file_offset;
|
|
|
|
if (bfd_seek (section->owner, block_offset, SEEK_SET) != 0
|
|
|
|
|| bfd_bread (compressed, iter.block.total_size, section->owner)
|
|
|
|
!= iter.block.total_size)
|
|
|
|
{
|
|
|
|
xfree (compressed);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2015-09-26 02:08:06 +08:00
|
|
|
uncompressed = (gdb_byte *) xmalloc (iter.block.uncompressed_size);
|
2012-11-27 06:31:29 +08:00
|
|
|
|
|
|
|
memset (&block, 0, sizeof (block));
|
|
|
|
block.filters = filters;
|
|
|
|
block.header_size = lzma_block_header_size_decode (compressed[0]);
|
|
|
|
if (lzma_block_header_decode (&block, &gdb_lzma_allocator, compressed)
|
|
|
|
!= LZMA_OK)
|
|
|
|
{
|
|
|
|
xfree (compressed);
|
|
|
|
xfree (uncompressed);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
compressed_pos = block.header_size;
|
|
|
|
uncompressed_pos = 0;
|
|
|
|
if (lzma_block_buffer_decode (&block, &gdb_lzma_allocator,
|
|
|
|
compressed, &compressed_pos,
|
|
|
|
iter.block.total_size,
|
|
|
|
uncompressed, &uncompressed_pos,
|
|
|
|
iter.block.uncompressed_size)
|
|
|
|
!= LZMA_OK)
|
|
|
|
{
|
|
|
|
xfree (compressed);
|
|
|
|
xfree (uncompressed);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
xfree (compressed);
|
|
|
|
|
|
|
|
xfree (lstream->data);
|
|
|
|
lstream->data = uncompressed;
|
|
|
|
lstream->data_start = iter.block.uncompressed_file_offset;
|
|
|
|
lstream->data_end = (iter.block.uncompressed_file_offset
|
|
|
|
+ iter.block.uncompressed_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
chunk_size = min (nbytes, lstream->data_end - offset);
|
|
|
|
memcpy (buf, lstream->data + offset - lstream->data_start, chunk_size);
|
|
|
|
buf = (gdb_byte *) buf + chunk_size;
|
|
|
|
offset += chunk_size;
|
|
|
|
nbytes -= chunk_size;
|
|
|
|
res += chunk_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* bfd_openr_iovec CLOSE_P implementation for
|
|
|
|
find_separate_debug_file_in_section. Passed STREAM
|
2014-06-06 04:36:27 +08:00
|
|
|
is 'struct gdb_lzma_stream *'. */
|
2012-11-27 06:31:29 +08:00
|
|
|
|
|
|
|
static int
|
|
|
|
lzma_close (struct bfd *nbfd,
|
|
|
|
void *stream)
|
|
|
|
{
|
2015-09-26 02:08:07 +08:00
|
|
|
struct gdb_lzma_stream *lstream = (struct gdb_lzma_stream *) stream;
|
2012-11-27 06:31:29 +08:00
|
|
|
|
|
|
|
lzma_index_end (lstream->index, &gdb_lzma_allocator);
|
|
|
|
xfree (lstream->data);
|
|
|
|
xfree (lstream);
|
2013-04-13 00:04:07 +08:00
|
|
|
|
|
|
|
/* Zero means success. */
|
2012-11-27 06:31:29 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* bfd_openr_iovec STAT_P implementation for
|
|
|
|
find_separate_debug_file_in_section. Passed STREAM
|
2014-06-06 04:36:27 +08:00
|
|
|
is 'struct gdb_lzma_stream *'. */
|
2012-11-27 06:31:29 +08:00
|
|
|
|
|
|
|
static int
|
|
|
|
lzma_stat (struct bfd *abfd,
|
|
|
|
void *stream,
|
|
|
|
struct stat *sb)
|
|
|
|
{
|
2015-09-26 02:08:07 +08:00
|
|
|
struct gdb_lzma_stream *lstream = (struct gdb_lzma_stream *) stream;
|
2012-11-27 06:31:29 +08:00
|
|
|
|
2015-04-14 19:35:30 +08:00
|
|
|
memset (sb, 0, sizeof (struct stat));
|
2012-11-27 06:31:29 +08:00
|
|
|
sb->st_size = lzma_index_uncompressed_size (lstream->index);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* HAVE_LIBLZMA */
|
|
|
|
|
|
|
|
/* This looks for a xz compressed separate debug info object file embedded
|
|
|
|
in a section called .gnu_debugdata. See
|
|
|
|
http://fedoraproject.org/wiki/Features/MiniDebugInfo
|
|
|
|
or the "Separate Debug Sections" of the manual for details.
|
|
|
|
If we find one we create a iovec based bfd that decompresses the
|
|
|
|
object data on demand. If we don't find one, return NULL. */
|
|
|
|
|
|
|
|
bfd *
|
|
|
|
find_separate_debug_file_in_section (struct objfile *objfile)
|
|
|
|
{
|
|
|
|
asection *section;
|
|
|
|
bfd *abfd;
|
|
|
|
|
|
|
|
if (objfile->obfd == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
section = bfd_get_section_by_name (objfile->obfd, ".gnu_debugdata");
|
|
|
|
if (section == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
#ifdef HAVE_LIBLZMA
|
Code cleanup: Add objfile_name accessor
gdb/
2013-09-24 Jan Kratochvil <jan.kratochvil@redhat.com>
Code cleanup: Add objfile_name accessor function.
* ada-lang.c (is_known_support_routine): Use objfile_name.
* auto-load.c (source_gdb_script_for_objfile)
(auto_load_objfile_script): Likewise.
* coffread.c (coff_symtab_read, read_one_sym): Likewise.
* dbxread.c (dbx_symfile_read): Likewise.
* dwarf2-frame.c (dwarf2_build_frame_info): Likewise.
* dwarf2loc.c (locexpr_describe_location_piece): Likewise.
* dwarf2read.c (dwarf2_get_dwz_file, dwarf2_read_index)
(dw2_symtab_iter_next, dw2_expand_symtabs_matching)
(lookup_dwp_signatured_type, lookup_dwo_unit)
(dwarf2_build_psymtabs_hard, scan_partial_symbols, process_queue)
(fixup_go_packaging, process_imported_unit_die, dwarf2_physname)
(read_import_statement, create_dwo_cu, open_and_init_dwp_file)
(lookup_dwo_cutu, read_call_site_scope, dwarf2_ranges_read)
(dwarf2_record_block_ranges, read_common_block, read_typedef)
(read_subrange_type, load_partial_dies, read_partial_die)
(read_addr_index_1, read_str_index, dwarf_decode_lines_1)
(die_containing_type, build_error_marker_type, lookup_die_type)
(follow_die_ref_or_sig, follow_die_ref, dwarf2_fetch_die_loc_sect_off)
(dwarf2_fetch_constant_bytes, follow_die_sig, get_signatured_type)
(get_DW_AT_signature_type, write_psymtabs_to_index)
(save_gdb_index_command): Likewise.
* elfread.c (find_separate_debug_file_by_buildid, elf_symfile_read):
Likewise.
* expprint.c (dump_subexp_body_standard): Likewise.
* gdbtypes.c (type_name_no_tag_or_error): Likewise.
* jit.c (jit_object_close_impl): Use the objfile field name renamed to
original_name.
* linux-thread-db.c (try_thread_db_load_from_pdir_1): New variable
obj_name, use objfile_name for it, use the variable.
(try_thread_db_load_from_pdir, has_libpthread, thread_db_new_objfile):
Use objfile_name.
* machoread.c (macho_symtab_read, macho_check_dsym)
(macho_symfile_relocate): Likewise.
* maint.c (maintenance_translate_address): Likewise.
* minidebug.c (find_separate_debug_file_in_section): Likewise.
* minsyms.c (install_minimal_symbols): Likewise.
* objfiles.c (allocate_objfile): Use the objfile field name renamed to
original_name.
(filter_overlapping_sections): Use objfile_name.
(objfile_name): New function.
* objfiles.h (struct objfile): Rename field name to original_name.
(objfile_name): New prototype.
* printcmd.c (sym_info, address_info): Use objfile_name.
* probe.c (parse_probes, collect_probes, compare_probes)
(info_probes_for_ops): Likewise.
* progspace.c (clone_program_space): Likewise.
* psymtab.c (require_partial_symbols, dump_psymtab, allocate_psymtab)
(maintenance_info_psymtabs): Likewise.
* python/py-auto-load.c (gdbpy_load_auto_script_for_objfile)
(source_section_scripts): Likewise.
* python/py-objfile.c (objfpy_get_filename): Likewise.
* python/py-progspace.c (pspy_get_filename): Likewise.
* solib-aix.c (solib_aix_get_toc_value): Likewise.
* solib-som.c (match_main, som_solib_section_offsets): Likewise.
* solib.c (solib_read_symbols): Likewise.
* stabsread.c (scan_file_globals): Likewise.
* stap-probe.c (handle_stap_probe): Likewise.
* symfile.c (symbol_file_clear, separate_debug_file_exists)
(find_separate_debug_file_by_debuglink): Likewise.
(reread_symbols): Likewise. Use the objfile field name renamed to
original_name.
(allocate_symtab): Use objfile_name.
* symmisc.c (print_symbol_bcache_statistics, print_objfile_statistics)
(dump_objfile, dump_msymbols, dump_symtab_1)
(maintenance_print_msymbols, maintenance_print_objfiles)
(maintenance_info_symtabs, maintenance_check_symtabs): Likewise.
* target.c (target_translate_tls_address, target_info): Likewise.
* xcoffread.c (xcoff_initial_scan): Make variable name const. Use
objfile_name.
2013-09-24 21:57:38 +08:00
|
|
|
abfd = gdb_bfd_openr_iovec (objfile_name (objfile), gnutarget, lzma_open,
|
|
|
|
section, lzma_pread, lzma_close, lzma_stat);
|
2012-11-27 06:31:29 +08:00
|
|
|
if (abfd == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!bfd_check_format (abfd, bfd_object))
|
|
|
|
{
|
|
|
|
warning (_("Cannot parse .gnu_debugdata section; not a BFD object"));
|
|
|
|
gdb_bfd_unref (abfd);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
warning (_("Cannot parse .gnu_debugdata section; LZMA support was "
|
|
|
|
"disabled at compile time"));
|
|
|
|
abfd = NULL;
|
|
|
|
#endif /* !HAVE_LIBLZMA */
|
|
|
|
|
|
|
|
return abfd;
|
|
|
|
}
|