X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/6cb06a8cdaaf30f5d879f24d37100cf1d25c6a3a..HEAD:/gdb/source.c diff --git a/gdb/source.c b/gdb/source.c index 954f479e35..d0f2d1c763 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -115,7 +115,8 @@ private: int m_line = 0; }; -static program_space_key current_source_key; +static const registry::key + current_source_key; /* Default number of lines to print with commands like "list". This is based on guessing how many long (i.e. more than chars_per_line @@ -311,7 +312,7 @@ select_source_symtab (struct symtab *s) if (s) { current_source_location *loc - = get_source_location (s->pspace ()); + = get_source_location (s->compunit ()->objfile ()->pspace); loc->set (s, 1); return; } @@ -329,7 +330,7 @@ select_source_symtab (struct symtab *s) if (sal.symtab == NULL) /* We couldn't find the location of `main', possibly due to missing line number info, fall back to line 1 in the corresponding file. */ - loc->set (symbol_symtab (bsym.symbol), 1); + loc->set (bsym.symbol->symtab (), 1); else loc->set (sal.symtab, std::max (sal.line - (lines_to_list - 1), 1)); return; @@ -537,15 +538,15 @@ add_path (const char *dirname, char **which_path, int parse_separators) for (const gdb::unique_xmalloc_ptr &name_up : dir_vec) { - char *name = name_up.get (); + const char *name = name_up.get (); char *p; struct stat st; - gdb::unique_xmalloc_ptr new_name_holder; + std::string new_name_holder; /* Spaces and tabs will have been removed by buildargv(). NAME is the start of the directory. P is the '\0' following the end. */ - p = name + strlen (name); + p = name_up.get () + strlen (name); while (!(IS_DIR_SEPARATOR (*name) && p <= name + 1) /* "/" */ #ifdef HAVE_DOS_BASED_FILE_SYSTEM @@ -589,16 +590,18 @@ add_path (const char *dirname, char **which_path, int parse_separators) if (name[0] == '\0') goto skip_dup; if (name[0] == '~') - new_name_holder.reset (tilde_expand (name)); + new_name_holder + = gdb::unique_xmalloc_ptr (tilde_expand (name)).get (); #ifdef HAVE_DOS_BASED_FILE_SYSTEM else if (IS_ABSOLUTE_PATH (name) && p == name + 2) /* "d:" => "d:." */ - new_name_holder.reset (concat (name, ".", (char *) NULL)); + new_name_holder = std::string (name) + "."; #endif else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$') new_name_holder = gdb_abspath (name); else - new_name_holder.reset (savestring (name, p - name)); - name = new_name_holder.get (); + new_name_holder = std::string (name, p - name); + + name = new_name_holder.c_str (); /* Unless it's a variable, check existence. */ if (name[0] != '$') @@ -713,8 +716,8 @@ info_source_command (const char *ignore, int from_tty) cust = s->compunit (); gdb_printf (_("Current source file is %s\n"), s->filename); - if (s->dirname () != NULL) - gdb_printf (_("Compilation directory is %s\n"), s->dirname ()); + if (s->compunit ()->dirname () != NULL) + gdb_printf (_("Compilation directory is %s\n"), s->compunit ()->dirname ()); if (s->fullname) gdb_printf (_("Located in %s\n"), s->fullname); const std::vector *offsets; @@ -950,7 +953,8 @@ done: else if ((opts & OPF_RETURN_REALPATH) != 0) *filename_opened = gdb_realpath (filename); else - *filename_opened = gdb_abspath (filename); + *filename_opened + = make_unique_xstrdup (gdb_abspath (filename).c_str ()); } errno = last_errno; @@ -1142,15 +1146,7 @@ find_and_open_source (const char *filename, helpful if part of the compilation directory was removed, e.g. using gcc's -fdebug-prefix-map, and we have added the missing prefix to source_path. */ - std::string cdir_filename (dirname); - - /* Remove any trailing directory separators. */ - while (IS_DIR_SEPARATOR (cdir_filename.back ())) - cdir_filename.pop_back (); - - /* Add our own directory separator. */ - cdir_filename.append (SLASH_STRING); - cdir_filename.append (filename_start); + std::string cdir_filename = path_join (dirname, filename_start); result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, cdir_filename.c_str (), OPEN_MODE, fullname); @@ -1180,7 +1176,7 @@ open_source_file (struct symtab *s) gdb::unique_xmalloc_ptr fullname (s->fullname); s->fullname = NULL; - scoped_fd fd = find_and_open_source (s->filename, s->dirname (), + scoped_fd fd = find_and_open_source (s->filename, s->compunit ()->dirname (), &fullname); if (fd.get () < 0) @@ -1192,14 +1188,15 @@ open_source_file (struct symtab *s) std::string srcpath; if (IS_ABSOLUTE_PATH (s->filename)) srcpath = s->filename; - else if (s->dirname () != nullptr) + else if (s->compunit ()->dirname () != nullptr) { - srcpath = s->dirname (); + srcpath = s->compunit ()->dirname (); srcpath += SLASH_STRING; srcpath += s->filename; } - const struct bfd_build_id *build_id = build_id_bfd_get (ofp->obfd); + const struct bfd_build_id *build_id + = build_id_bfd_get (ofp->obfd.get ()); /* Query debuginfod for the source file. */ if (build_id != nullptr && !srcpath.empty ()) @@ -1268,10 +1265,11 @@ symtab_to_fullname (struct symtab *s) /* rewrite_source_path would be applied by find_and_open_source, we should report the pathname where GDB tried to find the file. */ - if (s->dirname () == NULL || IS_ABSOLUTE_PATH (s->filename)) + if (s->compunit ()->dirname () == nullptr + || IS_ABSOLUTE_PATH (s->filename)) fullname.reset (xstrdup (s->filename)); else - fullname.reset (concat (s->dirname (), SLASH_STRING, + fullname.reset (concat (s->compunit ()->dirname (), SLASH_STRING, s->filename, (char *) NULL)); s->fullname = rewrite_source_path (fullname.get ()).release (); @@ -1295,7 +1293,7 @@ symtab_to_filename_for_display (struct symtab *symtab) else if (filename_display_string == filename_display_relative) return symtab->filename; else - internal_error (__FILE__, __LINE__, _("invalid filename_display_string")); + internal_error (_("invalid filename_display_string")); } @@ -1559,7 +1557,7 @@ info_line_command (const char *arg, int from_tty) else if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc)) { - struct gdbarch *gdbarch = sal.symtab->objfile ()->arch (); + gdbarch *gdbarch = sal.symtab->compunit ()->objfile ()->arch (); if (start_pc == end_pc) { @@ -1926,9 +1924,6 @@ directory in which the source file was compiled into object code.\n\ With no argument, reset the search path to $cdir:$cwd, the default."), &cmdlist); - if (dbx_commands) - add_com_alias ("use", directory_cmd, class_files, 0); - set_cmd_completer (directory_cmd, filename_completer); add_setshow_optional_filename_cmd ("directories",