
This patch removes some unused variables, found with -Wunused. I have not removed everything reported by -Wunused, because some expressions such as struct type *arg_type = check_typedef (value_type); in bfin-tdep.c could have an unexpected but important side-effect. I removed others that I considered more low-risk, such as: struct gdbarch *gdbarch = get_objfile_arch (objfile); I tested building with Python 2/Python 3/no Python, with/without expat, with/without libipt and with/without babeltrace. gdb/ChangeLog: * ada-lang.c (ada_collect_symbol_completion_matches): Remove unused variables. (ada_is_redundant_range_encoding): Likewise. * ada-varobj.c (ada_varobj_get_value_of_array_variable): Likewise. * alpha-tdep.c (alpha_software_single_step): Likewise. * arm-tdep.c (_initialize_arm_tdep): Likewise. * auto-load.c (info_auto_load_cmd): Likewise. * break-catch-syscall.c (insert_catch_syscall): Likewise. (remove_catch_syscall): Likewise. * breakpoint.c (condition_completer): Likewise. (clear_command): Likewise. (update_breakpoint_locations): Likewise. * btrace.c (btrace_disable): Likewise. (btrace_teardown): Likewise. (btrace_maint_update_pt_packets): Likewise. (maint_btrace_clear_cmd): Likewise. * cli/cli-decode.c (lookup_cmd_1): Likewise. (lookup_cmd_composition): Likewise. * cli/cli-dump.c (scan_filename): Likewise. (restore_command): Likewise. * compile/compile-loc2c.c (compute_stack_depth): Likewise. * compile/compile-object-load.c (compile_object_load): Likewise. * compile/compile-object-run.c (compile_object_run): Likewise. * compile/compile.c (compile_to_object): Likewise. * completer.c (filename_completer): Likewise. (complete_files_symbols): Likewise. (complete_expression): Likewise. * corelow.c (core_open): Likewise. * ctf.c (ctf_start): Likewise. (ctf_write_status): Likewise. (ctf_write_uploaded_tsv): Likewise. (ctf_write_definition_end): Likewise. (ctf_open_dir): Likewise. (ctf_xfer_partial): Likewise. (ctf_trace_find): Likewise. * disasm.c (gdb_pretty_print_disassembler::pretty_print_insn): Likewise. * dwarf2loc.c (allocate_piece_closure): Likewise. (indirect_pieced_value): Likewise. (dwarf2_evaluate_loc_desc_full): Likewise. * dwarf2read.c (dw2_expand_marked_cus): Likewise. (dw2_expand_symtabs_matching): Likewise. (dw2_map_symbol_filenames): Likewise. (read_and_check_comp_unit_head): Likewise. (read_cutu_die_from_dwo): Likewise. (lookup_dwo_unit): Likewise. (read_comp_units_from_section): Likewise. (dwarf2_compute_name): Likewise. (handle_DW_AT_stmt_list): Likewise. (create_cus_hash_table): Likewise. (create_dwp_v2_section): Likewise. (dwarf2_rnglists_process): Likewise. (dwarf2_ranges_process): Likewise. (dwarf2_record_block_ranges): Likewise. (is_vtable_name): Likewise. (read_formatted_entries): Likewise. (skip_form_bytes): Likewise. * elfread.c (elf_symtab_read): Likewise. * exec.c (exec_file_command): Likewise. * f-valprint.c (f_val_print): Likewise. (info_common_command_for_block): Likewise. * guile/guile.c (initialize_scheme_side): Likewise. * guile/scm-breakpoint.c (gdbscm_breakpoint_commands): Likewise. * guile/scm-cmd.c (cmdscm_completer): Likewise. (gdbscm_register_command_x): Likewise. * guile/scm-frame.c (gdbscm_frame_read_var): Likewise. * guile/scm-param.c (gdbscm_parameter_value): Likewise. * guile/scm-ports.c (file_port_magic): Likewise. * guile/scm-pretty-print.c (ppscm_search_pp_list): Likewise. (ppscm_pretty_print_one_value): Likewise. (ppscm_print_children): Likewise. * guile/scm-string.c (gdbscm_string_to_argv): Likewise. * guile/scm-symtab.c (gdbscm_sal_symtab): Likewise. * guile/scm-type.c (gdbscm_type_next_field_x): Likewise. * guile/scm-utils.c (gdbscm_parse_function_args): Likewise. * i386-tdep.c (i386_register_reggroup_p): Likewise. * infcmd.c (run_command_1): Likewise. (until_next_fsm_clean_up): Likewise. * linespec.c (linespec_complete): Likewise. (find_label_symbols): Likewise. * m2-valprint.c (m2_val_print): Likewise. * memattr.c (require_user_regions): Likewise. (lookup_mem_region): Likewise. (disable_mem_command): Likewise. (mem_delete): Likewise. * mep-tdep.c (mep_register_name): Likewise. (mep_analyze_prologue): Likewise. * mi/mi-cmd-file.c (mi_cmd_file_list_shared_libraries): Likewise. * mi/mi-interp.c (mi_on_sync_execution_done): Likewise. * mi/mi-main.c (mi_cmd_trace_frame_collected): Likewise. * microblaze-linux-tdep.c (microblaze_linux_init_abi): Likewise. * minidebug.c (lzma_open): Likewise. * minsyms.c (lookup_minimal_symbol): Likewise. * mips-linux-tdep.c (mips64_fill_fpregset): Likewise. * mips-tdep.c (mips_stub_frame_sniffer): Likewise. (mips_o64_return_value): Likewise. (mips_single_step_through_delay): Likewise. (_initialize_mips_tdep): Likewise. * nios2-tdep.c (nios2_push_dummy_call): Likewise. (nios2_software_single_step): Likewise. * parse.c (find_minsym_type_and_address): Likewise. * psymtab.c (psym_relocate): Likewise. * python/py-breakpoint.c (bppy_get_commands): Likewise. (gdbpy_breakpoint_modified): Likewise. * python/py-infevents.c (create_inferior_call_event_object): Likewise. * python/py-record-btrace.c (btpy_list_item): Likewise. * python/py-type.c (typy_str): Likewise. * python/py-value.c (valpy_call): Likewise. * python/python.c (do_start_initialization): Likewise. * record-btrace.c (record_btrace_insn_history_range): Likewise. (record_btrace_call_history_range): Likewise. (record_btrace_record_method): Likewise. (record_btrace_xfer_partial): Likewise. (btrace_get_frame_function): Likewise. * record-full.c (record_full_open): Likewise. * record.c (get_context_size): Likewise. * registry.h (DEFINE_REGISTRY): Likewise. * remote-fileio.c (remote_fileio_request): Likewise. * remote.c (remote_update_thread_list): Likewise. (remote_check_symbols): Likewise. (remote_commit_resume): Likewise. (remote_interrupt): Likewise. (remote_insert_breakpoint): Likewise. (compare_sections_command): Likewise. * rust-exp.y (super_name): Likewise. (lex_string): Likewise. (convert_ast_to_type): Likewise. (convert_ast_to_expression): Likewise. * rust-lang.c (rust_print_struct_def): Likewise. (rust_print_type): Likewise. (rust_evaluate_subexp): Likewise. * rx-tdep.c (rx_register_type): Likewise. * ser-event.c (serial_event_clear): Likewise. * serial.c (serial_open): Likewise. * spu-tdep.c (spu_overlay_new_objfile): Likewise. * symfile.c (section_is_overlay): Likewise. (overlay_unmapped_address): Likewise. (overlay_mapped_address): Likewise. (simple_overlay_update_1): Likewise. (simple_overlay_update): Likewise. * symtab.c (symbol_find_demangled_name): Likewise. (search_symbols): Likewise. * target-descriptions.c (tdesc_predefined_type): Likewise. * target.c (target_commit_resume): Likewise. * thread.c (print_selected_thread_frame): Likewise. * top.c (new_ui_command): Likewise. (gdb_readline_no_editing): Likewise. * tracefile-tfile.c (tfile_open): Likewise. * tracepoint.c (create_tsv_from_upload): Likewise. * utils.c (quit): Likewise. (defaulted_query): Likewise. * valarith.c (value_concat): Likewise. * xml-syscall.c (xml_list_syscalls_by_group): Likewise. * xml-tdesc.c (target_fetch_description_xml): Likewise. * xtensa-tdep.c (xtensa_pseudo_register_read): Likewise. (xtensa_pseudo_register_write): Likewise. gdb/gdbserver/ChangeLog: * regcache.c (registers_to_string): Remove unused variable.
280 lines
7.8 KiB
C
280 lines
7.8 KiB
C
/* GDB/Scheme charset interface.
|
||
|
||
Copyright (C) 2014-2017 Free Software Foundation, Inc.
|
||
|
||
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/>. */
|
||
|
||
/* See README file in this directory for implementation notes, coding
|
||
conventions, et.al. */
|
||
|
||
#include "defs.h"
|
||
#include "charset.h"
|
||
#include "guile-internal.h"
|
||
|
||
/* Convert STRING to an int.
|
||
STRING must be a valid integer. */
|
||
|
||
int
|
||
gdbscm_scm_string_to_int (SCM string)
|
||
{
|
||
char *s = scm_to_latin1_string (string);
|
||
int r = atoi (s);
|
||
|
||
free (s);
|
||
return r;
|
||
}
|
||
|
||
/* Convert a C (latin1) string to an SCM string.
|
||
"latin1" is chosen because Guile won't throw an exception. */
|
||
|
||
SCM
|
||
gdbscm_scm_from_c_string (const char *string)
|
||
{
|
||
return scm_from_latin1_string (string);
|
||
}
|
||
|
||
/* Convert an SCM string to a C (latin1) string.
|
||
"latin1" is chosen because Guile won't throw an exception.
|
||
Space for the result is allocated with malloc, caller must free.
|
||
It is an error to call this if STRING is not a string. */
|
||
|
||
char *
|
||
gdbscm_scm_to_c_string (SCM string)
|
||
{
|
||
return scm_to_latin1_string (string);
|
||
}
|
||
|
||
/* Use printf to construct a Scheme string. */
|
||
|
||
SCM
|
||
gdbscm_scm_from_printf (const char *format, ...)
|
||
{
|
||
va_list args;
|
||
char *string;
|
||
SCM result;
|
||
|
||
va_start (args, format);
|
||
string = xstrvprintf (format, args);
|
||
va_end (args);
|
||
result = scm_from_latin1_string (string);
|
||
xfree (string);
|
||
|
||
return result;
|
||
}
|
||
|
||
/* Struct to pass data from gdbscm_scm_to_string to
|
||
gdbscm_call_scm_to_stringn. */
|
||
|
||
struct scm_to_stringn_data
|
||
{
|
||
SCM string;
|
||
size_t *lenp;
|
||
const char *charset;
|
||
scm_t_string_failed_conversion_handler conversion_kind;
|
||
char *result;
|
||
};
|
||
|
||
/* Helper for gdbscm_scm_to_string to call scm_to_stringn
|
||
from within scm_c_catch. */
|
||
|
||
static SCM
|
||
gdbscm_call_scm_to_stringn (void *datap)
|
||
{
|
||
struct scm_to_stringn_data *data = (struct scm_to_stringn_data *) datap;
|
||
|
||
data->result = scm_to_stringn (data->string, data->lenp, data->charset,
|
||
data->conversion_kind);
|
||
return SCM_BOOL_F;
|
||
}
|
||
|
||
/* Convert an SCM string to a string in charset CHARSET.
|
||
This function is guaranteed to not throw an exception.
|
||
|
||
If LENP is NULL then the returned string is NUL-terminated,
|
||
and an exception is thrown if the string contains embedded NULs.
|
||
Otherwise the string is not guaranteed to be NUL-terminated, but worse
|
||
there's no space to put a NUL if we wanted to (scm_to_stringn limitation).
|
||
|
||
If STRICT is non-zero, and there's a conversion error, then a
|
||
<gdb:exception> object is stored in *EXCEPT_SCMP, and NULL is returned.
|
||
If STRICT is zero, then escape sequences are used for characters that
|
||
can't be converted, and EXCEPT_SCMP may be passed as NULL.
|
||
|
||
Space for the result is allocated with malloc, caller must free.
|
||
It is an error to call this if STRING is not a string. */
|
||
|
||
char *
|
||
gdbscm_scm_to_string (SCM string, size_t *lenp,
|
||
const char *charset, int strict, SCM *except_scmp)
|
||
{
|
||
struct scm_to_stringn_data data;
|
||
SCM scm_result;
|
||
|
||
data.string = string;
|
||
data.lenp = lenp;
|
||
data.charset = charset;
|
||
data.conversion_kind = (strict
|
||
? SCM_FAILED_CONVERSION_ERROR
|
||
: SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE);
|
||
data.result = NULL;
|
||
|
||
scm_result = gdbscm_call_guile (gdbscm_call_scm_to_stringn, &data, NULL);
|
||
|
||
if (gdbscm_is_false (scm_result))
|
||
{
|
||
gdb_assert (data.result != NULL);
|
||
return data.result;
|
||
}
|
||
gdb_assert (gdbscm_is_exception (scm_result));
|
||
*except_scmp = scm_result;
|
||
return NULL;
|
||
}
|
||
|
||
/* Struct to pass data from gdbscm_scm_from_string to
|
||
gdbscm_call_scm_from_stringn. */
|
||
|
||
struct scm_from_stringn_data
|
||
{
|
||
const char *string;
|
||
size_t len;
|
||
const char *charset;
|
||
scm_t_string_failed_conversion_handler conversion_kind;
|
||
SCM result;
|
||
};
|
||
|
||
/* Helper for gdbscm_scm_from_string to call scm_from_stringn
|
||
from within scm_c_catch. */
|
||
|
||
static SCM
|
||
gdbscm_call_scm_from_stringn (void *datap)
|
||
{
|
||
struct scm_from_stringn_data *data = (struct scm_from_stringn_data *) datap;
|
||
|
||
data->result = scm_from_stringn (data->string, data->len, data->charset,
|
||
data->conversion_kind);
|
||
return SCM_BOOL_F;
|
||
}
|
||
|
||
/* Convert STRING to a Scheme string in charset CHARSET.
|
||
This function is guaranteed to not throw an exception.
|
||
|
||
If STRICT is non-zero, and there's a conversion error, then a
|
||
<gdb:exception> object is returned.
|
||
If STRICT is zero, then question marks are used for characters that
|
||
can't be converted (limitation of underlying Guile conversion support). */
|
||
|
||
SCM
|
||
gdbscm_scm_from_string (const char *string, size_t len,
|
||
const char *charset, int strict)
|
||
{
|
||
struct scm_from_stringn_data data;
|
||
SCM scm_result;
|
||
|
||
data.string = string;
|
||
data.len = len;
|
||
data.charset = charset;
|
||
/* The use of SCM_FAILED_CONVERSION_QUESTION_MARK is specified by Guile. */
|
||
data.conversion_kind = (strict
|
||
? SCM_FAILED_CONVERSION_ERROR
|
||
: SCM_FAILED_CONVERSION_QUESTION_MARK);
|
||
data.result = SCM_UNDEFINED;
|
||
|
||
scm_result = gdbscm_call_guile (gdbscm_call_scm_from_stringn, &data, NULL);
|
||
|
||
if (gdbscm_is_false (scm_result))
|
||
{
|
||
gdb_assert (!SCM_UNBNDP (data.result));
|
||
return data.result;
|
||
}
|
||
gdb_assert (gdbscm_is_exception (scm_result));
|
||
return scm_result;
|
||
}
|
||
|
||
/* Convert an SCM string to a host string.
|
||
This function is guaranteed to not throw an exception.
|
||
|
||
If LENP is NULL then the returned string is NUL-terminated,
|
||
and if the string contains embedded NULs then NULL is returned with
|
||
an exception object stored in *EXCEPT_SCMP.
|
||
Otherwise the string is not guaranteed to be NUL-terminated, but worse
|
||
there's no space to put a NUL if we wanted to (scm_to_stringn limitation).
|
||
|
||
Returns NULL if there is a conversion error, with the exception object
|
||
stored in *EXCEPT_SCMP.
|
||
Space for the result is allocated with malloc, caller must free.
|
||
It is an error to call this if STRING is not a string. */
|
||
|
||
char *
|
||
gdbscm_scm_to_host_string (SCM string, size_t *lenp, SCM *except_scmp)
|
||
{
|
||
return gdbscm_scm_to_string (string, lenp, host_charset (), 1, except_scmp);
|
||
}
|
||
|
||
/* Convert a host string to an SCM string.
|
||
This function is guaranteed to not throw an exception.
|
||
Returns a <gdb:exception> object if there's a conversion error. */
|
||
|
||
SCM
|
||
gdbscm_scm_from_host_string (const char *string, size_t len)
|
||
{
|
||
return gdbscm_scm_from_string (string, len, host_charset (), 1);
|
||
}
|
||
|
||
/* (string->argv string) -> list
|
||
Return list of strings split up according to GDB's argv parsing rules.
|
||
This is useful when writing GDB commands in Scheme. */
|
||
|
||
static SCM
|
||
gdbscm_string_to_argv (SCM string_scm)
|
||
{
|
||
char *string;
|
||
SCM result = SCM_EOL;
|
||
|
||
gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "s",
|
||
string_scm, &string);
|
||
|
||
if (string == NULL || *string == '\0')
|
||
{
|
||
xfree (string);
|
||
return SCM_EOL;
|
||
}
|
||
|
||
gdb_argv c_argv (string);
|
||
for (char *arg : c_argv)
|
||
result = scm_cons (gdbscm_scm_from_c_string (arg), result);
|
||
|
||
xfree (string);
|
||
|
||
return scm_reverse_x (result, SCM_EOL);
|
||
}
|
||
|
||
/* Initialize the Scheme charset interface to GDB. */
|
||
|
||
static const scheme_function string_functions[] =
|
||
{
|
||
{ "string->argv", 1, 0, 0, as_a_scm_t_subr (gdbscm_string_to_argv),
|
||
"\
|
||
Convert a string to a list of strings split up according to\n\
|
||
gdb's argv parsing rules." },
|
||
|
||
END_FUNCTIONS
|
||
};
|
||
|
||
void
|
||
gdbscm_initialize_strings (void)
|
||
{
|
||
gdbscm_define_functions (string_functions, 1);
|
||
}
|