#include "source-cache.h"
#include "cli/cli-style.h"
#include "observable.h"
+#include "build-id.h"
+#include "debuginfod-support.h"
#define OPEN_MODE (O_RDONLY | O_BINARY)
#define FDOPEN_MODE FOPEN_RB
void
forget_cached_source_info (void)
{
- struct program_space *pspace;
-
- ALL_PSPACES (pspace)
+ for (struct program_space *pspace : program_spaces)
for (objfile *objfile : pspace->objfiles ())
{
forget_cached_source_info_for_objfile (objfile);
s->fullname = NULL;
scoped_fd fd = find_and_open_source (s->filename, SYMTAB_DIRNAME (s),
&fullname);
+
+ if (fd.get () < 0)
+ {
+ if (SYMTAB_COMPUNIT (s) != nullptr)
+ {
+ const objfile *ofp = COMPUNIT_OBJFILE (SYMTAB_COMPUNIT (s));
+
+ std::string srcpath;
+ if (IS_ABSOLUTE_PATH (s->filename))
+ srcpath = s->filename;
+ else if (SYMTAB_DIRNAME (s) != nullptr)
+ {
+ srcpath = SYMTAB_DIRNAME (s);
+ srcpath += SLASH_STRING;
+ srcpath += s->filename;
+ }
+
+ const struct bfd_build_id *build_id = build_id_bfd_get (ofp->obfd);
+
+ /* Query debuginfod for the source file. */
+ if (build_id != nullptr && !srcpath.empty ())
+ fd = debuginfod_source_query (build_id->data,
+ build_id->size,
+ srcpath.c_str (),
+ &fullname);
+ }
+ }
+
s->fullname = fullname.release ();
return fd;
}
else if (sal.line > 0
&& find_line_pc_range (sal, &start_pc, &end_pc))
{
- struct gdbarch *gdbarch
- = get_objfile_arch (SYMTAB_OBJFILE (sal.symtab));
+ struct gdbarch *gdbarch = SYMTAB_OBJFILE (sal.symtab)->arch ();
if (start_pc == end_pc)
{
/* If this is the only line, show the source code. If it could
not find the file, don't do anything special. */
- if (sals.size () == 1)
+ if (annotation_level > 0 && sals.size () == 1)
annotate_source_line (sal.symtab, sal.line, 0, start_pc);
}
else