X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fauto-load.c;h=3d560146af4785181699ec951329ee1cd19be744;hb=eb4c3f4aaae2ee1b27c210e951260a7e699133b4;hp=292f2ae88e9b46b8a230daeabcbf10b71a9cc04d;hpb=d419f42dd3f3635fc036413258ed530676998191;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/auto-load.c b/gdb/auto-load.c index 292f2ae88e..3d560146af 100644 --- a/gdb/auto-load.c +++ b/gdb/auto-load.c @@ -32,7 +32,6 @@ #include "cli/cli-cmds.h" #include "cli/cli-decode.h" #include "cli/cli-setshow.h" -#include "gdb_vecs.h" #include "readline/tilde.h" #include "completer.h" #include "fnmatch.h" @@ -40,6 +39,7 @@ #include "filestuff.h" #include "extension.h" #include "gdb/section-scripts.h" +#include /* The section to look in for auto-loaded scripts (in file formats that support sections). @@ -139,7 +139,7 @@ static char *auto_load_dir; /* "set" command for the auto_load_dir configuration variable. */ static void -set_auto_load_dir (char *args, int from_tty, struct cmd_list_element *c) +set_auto_load_dir (const char *args, int from_tty, struct cmd_list_element *c) { /* Setting the variable to "" resets it to the compile time defaults. */ if (auto_load_dir[0] == '\0') @@ -218,7 +218,7 @@ auto_load_safe_path_vec_update (void) { char *dir = VEC_index (char_ptr, auto_load_safe_path_vec, ix); char *expanded = tilde_expand (dir); - char *real_path = gdb_realpath (expanded); + gdb::unique_xmalloc_ptr real_path = gdb_realpath (expanded); /* Ensure the current entry is at least tilde_expand-ed. */ VEC_replace (char_ptr, auto_load_safe_path_vec, ix, expanded); @@ -238,16 +238,15 @@ auto_load_safe_path_vec_update (void) xfree (dir); /* If gdb_realpath returns a different content, append it. */ - if (strcmp (real_path, expanded) == 0) - xfree (real_path); - else + if (strcmp (real_path.get (), expanded) != 0) { - VEC_safe_push (char_ptr, auto_load_safe_path_vec, real_path); - if (debug_auto_load) fprintf_unfiltered (gdb_stdlog, _("auto-load: And canonicalized as \"%s\".\n"), - real_path); + real_path.get ()); + + VEC_safe_push (char_ptr, auto_load_safe_path_vec, + real_path.release ()); } } } @@ -263,7 +262,8 @@ auto_load_gdb_datadir_changed (void) /* "set" command for the auto_load_safe_path configuration variable. */ static void -set_auto_load_safe_path (char *args, int from_tty, struct cmd_list_element *c) +set_auto_load_safe_path (const char *args, + int from_tty, struct cmd_list_element *c) { /* Setting the variable to "" resets it to the compile time defaults. */ if (auto_load_safe_path[0] == '\0') @@ -302,7 +302,7 @@ show_auto_load_safe_path (struct ui_file *file, int from_tty, variable. */ static void -add_auto_load_safe_path (char *args, int from_tty) +add_auto_load_safe_path (const char *args, int from_tty) { char *s; @@ -323,7 +323,7 @@ Use 'set auto-load safe-path /' for disabling the auto-load safe-path security.\ variable. */ static void -add_auto_load_dir (char *args, int from_tty) +add_auto_load_dir (const char *args, int from_tty) { char *s; @@ -419,12 +419,11 @@ filename_is_in_pattern (const char *filename, const char *pattern) /* Return 1 if FILENAME belongs to one of directory components of AUTO_LOAD_SAFE_PATH_VEC. Return 0 otherwise. auto_load_safe_path_vec_update is never called. - *FILENAME_REALP may be updated by gdb_realpath of FILENAME - it has to be - freed by the caller. */ + *FILENAME_REALP may be updated by gdb_realpath of FILENAME. */ static int filename_is_in_auto_load_safe_path_vec (const char *filename, - char **filename_realp) + gdb::unique_xmalloc_ptr *filename_realp) { char *pattern; int ix; @@ -439,17 +438,17 @@ filename_is_in_auto_load_safe_path_vec (const char *filename, if (*filename_realp == NULL) { *filename_realp = gdb_realpath (filename); - if (debug_auto_load && strcmp (*filename_realp, filename) != 0) + if (debug_auto_load && strcmp (filename_realp->get (), filename) != 0) fprintf_unfiltered (gdb_stdlog, _("auto-load: Resolved " "file \"%s\" as \"%s\".\n"), - filename, *filename_realp); + filename, filename_realp->get ()); } - if (strcmp (*filename_realp, filename) != 0) + if (strcmp (filename_realp->get (), filename) != 0) for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, pattern); ++ix) - if (filename_is_in_pattern (*filename_realp, pattern)) + if (filename_is_in_pattern (filename_realp->get (), pattern)) break; } @@ -476,8 +475,7 @@ filename_is_in_auto_load_safe_path_vec (const char *filename, int file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...) { - char *filename_real = NULL; - struct cleanup *back_to; + gdb::unique_xmalloc_ptr filename_real; static int advice_printed = 0; if (debug_auto_load) @@ -489,34 +487,24 @@ file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...) va_end (debug_args); } - back_to = make_cleanup (free_current_contents, &filename_real); - if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real)) - { - do_cleanups (back_to); - return 1; - } + return 1; auto_load_safe_path_vec_update (); if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real)) - { - do_cleanups (back_to); - return 1; - } + return 1; warning (_("File \"%s\" auto-loading has been declined by your " "`auto-load safe-path' set to \"%s\"."), - filename_real, auto_load_safe_path); + filename_real.get (), auto_load_safe_path); if (!advice_printed) { const char *homedir = getenv ("HOME"); - char *homeinit; if (homedir == NULL) homedir = "$HOME"; - homeinit = xstrprintf ("%s/%s", homedir, gdbinit); - make_cleanup (xfree, homeinit); + std::string homeinit = string_printf ("%s/%s", homedir, gdbinit); printf_filtered (_("\ To enable execution of this file add\n\ @@ -528,11 +516,11 @@ line to your configuration file \"%s\".\n\ For more information about this security protection see the\n\ \"Auto-loading safe path\" section in the GDB manual. E.g., run from the shell:\n\ \tinfo \"(gdb)Auto-loading safe path\"\n"), - filename_real, homeinit, homeinit); + filename_real.get (), + homeinit.c_str (), homeinit.c_str ()); advice_printed = 1; } - do_cleanups (back_to); return 0; } @@ -891,30 +879,28 @@ void auto_load_objfile_script (struct objfile *objfile, const struct extension_language_defn *language) { - char *realname = gdb_realpath (objfile_name (objfile)); - struct cleanup *cleanups = make_cleanup (xfree, realname); + gdb::unique_xmalloc_ptr realname + = gdb_realpath (objfile_name (objfile)); - if (!auto_load_objfile_script_1 (objfile, realname, language)) + if (!auto_load_objfile_script_1 (objfile, realname.get (), language)) { /* For Windows/DOS .exe executables, strip the .exe suffix, so that FOO-gdb.gdb could be used for FOO.exe, and try again. */ - size_t len = strlen (realname); + size_t len = strlen (realname.get ()); const size_t lexe = sizeof (".exe") - 1; - if (len > lexe && strcasecmp (realname + len - lexe, ".exe") == 0) + if (len > lexe && strcasecmp (realname.get () + len - lexe, ".exe") == 0) { len -= lexe; - realname[len] = '\0'; + realname.get ()[len] = '\0'; if (debug_auto_load) fprintf_unfiltered (gdb_stdlog, _("auto-load: Stripped .exe suffix, " "retrying with \"%s\".\n"), - realname); - auto_load_objfile_script_1 (objfile, realname, language); + realname.get ()); + auto_load_objfile_script_1 (objfile, realname.get (), language); } } - - do_cleanups (cleanups); } /* Subroutine of source_section_scripts to simplify it. @@ -928,10 +914,7 @@ source_script_file (struct auto_load_pspace_info *pspace_info, const char *section_name, unsigned int offset, const char *file) { - FILE *stream; - char *full_path; - int opened, in_hash_table; - struct cleanup *cleanups; + int in_hash_table; objfile_script_sourcer_func *sourcer; /* Skip this script if support is not compiled in. */ @@ -953,27 +936,22 @@ source_script_file (struct auto_load_pspace_info *pspace_info, return; } - opened = find_and_open_script (file, 1 /*search_path*/, - &stream, &full_path); + gdb::optional opened = find_and_open_script (file, + 1 /*search_path*/); - cleanups = make_cleanup (null_cleanup, NULL); if (opened) { - make_cleanup_fclose (stream); - make_cleanup (xfree, full_path); - - if (!file_is_auto_load_safe (full_path, + if (!file_is_auto_load_safe (opened->full_path.get (), _("auto-load: Loading %s script " "\"%s\" from section \"%s\" of " "objfile \"%s\".\n"), - ext_lang_name (language), full_path, + ext_lang_name (language), + opened->full_path.get (), section_name, objfile_name (objfile))) - opened = 0; + opened.reset (); } else { - full_path = NULL; - /* If one script isn't found it's not uncommon for more to not be found either. We don't want to print a message for each script, too much noise. Instead, we print the warning once and tell the @@ -986,14 +964,16 @@ source_script_file (struct auto_load_pspace_info *pspace_info, section_name, offset); } - in_hash_table = maybe_add_script_file (pspace_info, opened, file, full_path, + in_hash_table = maybe_add_script_file (pspace_info, bool (opened), file, + (opened + ? opened->full_path.get () + : NULL), language); /* If this file is not currently loaded, load it. */ if (opened && !in_hash_table) - sourcer (language, objfile, stream, full_path); - - do_cleanups (cleanups); + sourcer (language, objfile, opened->stream.get (), + opened->full_path.get ()); } /* Subroutine of source_section_scripts to simplify it. @@ -1233,13 +1213,14 @@ auto_load_new_objfile (struct objfile *objfile) /* Collect scripts to be printed in a vec. */ -typedef struct loaded_script *loaded_script_ptr; -DEF_VEC_P (loaded_script_ptr); - struct collect_matching_scripts_data { - VEC (loaded_script_ptr) **scripts_p; + collect_matching_scripts_data (std::vector *scripts_p_, + const extension_language_defn *language_) + : scripts_p (scripts_p_), language (language_) + {} + std::vector *scripts_p; const struct extension_language_defn *language; }; @@ -1254,7 +1235,7 @@ collect_matching_scripts (void **slot, void *info) = (struct collect_matching_scripts_data *) info; if (script->language == data->language && re_exec (script->name)) - VEC_safe_push (loaded_script_ptr, *data->scripts_p, script); + data->scripts_p->push_back (script); return 1; } @@ -1284,13 +1265,10 @@ print_script (struct loaded_script *script) /* Helper for info_auto_load_scripts to sort the scripts by name. */ -static int -sort_scripts_by_name (const void *ap, const void *bp) +static bool +sort_scripts_by_name (loaded_script *a, loaded_script *b) { - const struct loaded_script *a = *(const struct loaded_script **) ap; - const struct loaded_script *b = *(const struct loaded_script **) bp; - - return FILENAME_CMP (a->name, b->name); + return FILENAME_CMP (a->name, b->name) < 0; } /* Special internal GDB value of auto_load_info_scripts's PATTERN identify @@ -1302,15 +1280,9 @@ char auto_load_info_scripts_pattern_nl[] = ""; Print SCRIPTS. */ static void -print_scripts (VEC (loaded_script_ptr) *scripts) +print_scripts (const std::vector &scripts) { - int i; - loaded_script_ptr script; - - qsort (VEC_address (loaded_script_ptr, scripts), - VEC_length (loaded_script_ptr, scripts), - sizeof (loaded_script_ptr), sort_scripts_by_name); - for (i = 0; VEC_iterate (loaded_script_ptr, scripts, i, script); ++i) + for (loaded_script *script : scripts) print_script (script); } @@ -1319,14 +1291,11 @@ print_scripts (VEC (loaded_script_ptr) *scripts) PATTERN. FROM_TTY is the usual GDB boolean for user interactivity. */ void -auto_load_info_scripts (char *pattern, int from_tty, +auto_load_info_scripts (const char *pattern, int from_tty, const struct extension_language_defn *language) { struct ui_out *uiout = current_uiout; struct auto_load_pspace_info *pspace_info; - struct cleanup *script_chain; - VEC (loaded_script_ptr) *script_files, *script_texts; - int nr_scripts; dont_repeat (); @@ -1348,31 +1317,33 @@ auto_load_info_scripts (char *pattern, int from_tty, Plus we want to sort the scripts by name. So first traverse the hash table collecting the matching scripts. */ - script_files = VEC_alloc (loaded_script_ptr, 10); - script_texts = VEC_alloc (loaded_script_ptr, 10); - script_chain = make_cleanup (VEC_cleanup (loaded_script_ptr), &script_files); - make_cleanup (VEC_cleanup (loaded_script_ptr), &script_texts); + std::vector script_files, script_texts; if (pspace_info != NULL && pspace_info->loaded_script_files != NULL) { - struct collect_matching_scripts_data data = { &script_files, language }; + collect_matching_scripts_data data (&script_files, language); /* Pass a pointer to scripts as VEC_safe_push can realloc space. */ htab_traverse_noresize (pspace_info->loaded_script_files, collect_matching_scripts, &data); + + std::sort (script_files.begin (), script_files.end (), + sort_scripts_by_name); } if (pspace_info != NULL && pspace_info->loaded_script_texts != NULL) { - struct collect_matching_scripts_data data = { &script_texts, language }; + collect_matching_scripts_data data (&script_texts, language); /* Pass a pointer to scripts as VEC_safe_push can realloc space. */ htab_traverse_noresize (pspace_info->loaded_script_texts, collect_matching_scripts, &data); + + std::sort (script_texts.begin (), script_texts.end (), + sort_scripts_by_name); } - nr_scripts = (VEC_length (loaded_script_ptr, script_files) - + VEC_length (loaded_script_ptr, script_texts)); + int nr_scripts = script_files.size () + script_texts.size (); /* Table header shifted right by preceding "gdb-scripts: " would not match its columns. */ @@ -1391,8 +1362,6 @@ auto_load_info_scripts (char *pattern, int from_tty, print_scripts (script_texts); } - do_cleanups (script_chain); - if (nr_scripts == 0) { if (pattern && *pattern) @@ -1405,7 +1374,7 @@ auto_load_info_scripts (char *pattern, int from_tty, /* Wrapper for "info auto-load gdb-scripts". */ static void -info_auto_load_gdb_scripts (char *pattern, int from_tty) +info_auto_load_gdb_scripts (const char *pattern, int from_tty) { auto_load_info_scripts (pattern, from_tty, &extension_language_gdb); } @@ -1413,7 +1382,7 @@ info_auto_load_gdb_scripts (char *pattern, int from_tty) /* Implement 'info auto-load local-gdbinit'. */ static void -info_auto_load_local_gdbinit (char *args, int from_tty) +info_auto_load_local_gdbinit (const char *args, int from_tty) { if (auto_load_local_gdbinit_pathname == NULL) printf_filtered (_("Local .gdbinit file was not found.\n")); @@ -1472,7 +1441,7 @@ Use `info auto-load %s-scripts [REGEXP]' to list them."), /* The only valid "set auto-load" argument is off|0|no|disable. */ static void -set_auto_load_cmd (char *args, int from_tty) +set_auto_load_cmd (const char *args, int from_tty) { struct cmd_list_element *list; size_t length; @@ -1521,7 +1490,7 @@ automatic loading of Python scripts."), "show auto-load " settings. */ static void -show_auto_load_cmd (char *args, int from_tty) +show_auto_load_cmd (const char *args, int from_tty) { cmd_show_list (*auto_load_show_cmdlist_get (), from_tty, ""); } @@ -1549,7 +1518,7 @@ automatic loading of Python scripts."), newlines at proper places. */ static void -info_auto_load_cmd (char *args, int from_tty) +info_auto_load_cmd (const char *args, int from_tty) { struct cmd_list_element *list; struct cleanup *infolist_chain; @@ -1588,8 +1557,6 @@ found and/or loaded."), return &retval; } -void _initialize_auto_load (void); - void _initialize_auto_load (void) {