aboutsummaryrefslogtreecommitdiff
path: root/gdb/extension.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/extension.c')
-rw-r--r--gdb/extension.c82
1 files changed, 48 insertions, 34 deletions
diff --git a/gdb/extension.c b/gdb/extension.c
index 99e7190..d34dbcd 100644
--- a/gdb/extension.c
+++ b/gdb/extension.c
@@ -1,6 +1,6 @@
/* Interface between gdb and its extension languages.
- Copyright (C) 2014-2024 Free Software Foundation, Inc.
+ Copyright (C) 2014-2025 Free Software Foundation, Inc.
This file is part of GDB.
@@ -33,6 +33,7 @@
#include "guile/guile.h"
#include <array>
#include "inferior.h"
+#include "gdbsupport/scoped_signal_handler.h"
static script_sourcer_func source_gdb_script;
static objfile_script_sourcer_func source_gdb_objfile_script;
@@ -84,7 +85,7 @@ const struct extension_language_defn extension_language_gdb =
static const std::array<const extension_language_defn *, 2> extension_languages
{
- /* To preserve existing behaviour, python should always appear first. */
+ /* To preserve existing behavior, python should always appear first. */
&extension_language_python,
&extension_language_guile,
};
@@ -297,28 +298,6 @@ ext_lang_auto_load_enabled (const struct extension_language_defn *extlang)
}
-/* RAII class used to temporarily return SIG to its default handler. */
-
-template<int SIG>
-struct scoped_default_signal
-{
- scoped_default_signal ()
- { m_old_sig_handler = signal (SIG, SIG_DFL); }
-
- ~scoped_default_signal ()
- { signal (SIG, m_old_sig_handler); }
-
- DISABLE_COPY_AND_ASSIGN (scoped_default_signal);
-
-private:
- /* The previous signal handler that needs to be restored. */
- sighandler_t m_old_sig_handler;
-};
-
-/* Class to temporarily return SIGINT to its default handler. */
-
-using scoped_default_sigint = scoped_default_signal<SIGINT>;
-
/* Functions that iterate over all extension languages.
These only iterate over external extension languages, not including
GDB's own extension/scripting language, unless otherwise indicated. */
@@ -334,7 +313,7 @@ ext_lang_initialization (void)
if (extlang->ops != nullptr
&& extlang->ops->initialize != NULL)
{
- scoped_default_sigint set_sigint_to_default_handler;
+ scoped_signal_handler<SIGINT> set_sigint_to_default_handler (SIG_DFL);
extlang->ops->initialize (extlang);
}
}
@@ -562,6 +541,19 @@ apply_ext_lang_frame_filter (const frame_info_ptr &frame,
return EXT_LANG_BT_NO_FILTERS;
}
+/* Used for registering the ptwrite filter to the current thread. */
+
+void
+apply_ext_lang_ptwrite_filter (btrace_thread_info *btinfo)
+{
+ for (const struct extension_language_defn *extlang : extension_languages)
+ {
+ if (extlang->ops != nullptr
+ && extlang->ops->apply_ptwrite_filter != nullptr)
+ extlang->ops->apply_ptwrite_filter (extlang, btinfo);
+ }
+}
+
/* Update values held by the extension language when OBJFILE is discarded.
New global types must be created for every such value, which must then be
updated to use the new types.
@@ -571,7 +563,8 @@ apply_ext_lang_frame_filter (const frame_info_ptr &frame,
preserve_one_value. */
void
-preserve_ext_lang_values (struct objfile *objfile, htab_t copied_types)
+preserve_ext_lang_values (struct objfile *objfile,
+ copied_types_hash_t &copied_types)
{
for (const struct extension_language_defn *extlang : extension_languages)
{
@@ -667,7 +660,7 @@ static bool quit_flag;
/* The current extension language we've called out to, or
extension_language_gdb if there isn't one.
- This must be set everytime we call out to an extension language, and reset
+ This must be set every time we call out to an extension language, and reset
to the previous value when it returns. Note that the previous value may
be a different (or the same) extension language. */
static const struct extension_language_defn *active_ext_lang
@@ -981,7 +974,8 @@ xmethod_worker::get_result_type (value *object, gdb::array_view<value *> args)
/* See extension.h. */
std::optional<std::string>
-ext_lang_colorize (const std::string &filename, const std::string &contents)
+ext_lang_colorize (const std::string &filename, const std::string &contents,
+ enum language lang)
{
std::optional<std::string> result;
@@ -990,7 +984,7 @@ ext_lang_colorize (const std::string &filename, const std::string &contents)
if (extlang->ops == nullptr
|| extlang->ops->colorize == nullptr)
continue;
- result = extlang->ops->colorize (filename, contents);
+ result = extlang->ops->colorize (filename, contents, lang);
if (result.has_value ())
return result;
}
@@ -1040,7 +1034,7 @@ ext_lang_print_insn (struct gdbarch *gdbarch, CORE_ADDR address,
/* See extension.h. */
-ext_lang_missing_debuginfo_result
+ext_lang_missing_file_result
ext_lang_handle_missing_debuginfo (struct objfile *objfile)
{
for (const struct extension_language_defn *extlang : extension_languages)
@@ -1048,7 +1042,7 @@ ext_lang_handle_missing_debuginfo (struct objfile *objfile)
if (extlang->ops == nullptr
|| extlang->ops->handle_missing_debuginfo == nullptr)
continue;
- ext_lang_missing_debuginfo_result result
+ ext_lang_missing_file_result result
= extlang->ops->handle_missing_debuginfo (extlang, objfile);
if (!result.filename ().empty () || result.try_again ())
return result;
@@ -1057,6 +1051,28 @@ ext_lang_handle_missing_debuginfo (struct objfile *objfile)
return {};
}
+/* See extension.h. */
+
+ext_lang_missing_file_result
+ext_lang_find_objfile_from_buildid (program_space *pspace,
+ const struct bfd_build_id *build_id,
+ const char *filename)
+{
+ for (const struct extension_language_defn *extlang : extension_languages)
+ {
+ if (extlang->ops == nullptr
+ || extlang->ops->find_objfile_from_buildid == nullptr)
+ continue;
+ ext_lang_missing_file_result result
+ = extlang->ops->find_objfile_from_buildid (extlang, pspace, build_id,
+ filename);
+ if (!result.filename ().empty () || result.try_again ())
+ return result;
+ }
+
+ return {};
+}
+
/* Called via an observer before gdb prints its prompt.
Iterate over the extension languages giving them a chance to
change the prompt. The first one to change the prompt wins,
@@ -1086,9 +1102,7 @@ ext_lang_before_prompt (const char *current_gdb_prompt)
}
}
-void _initialize_extension ();
-void
-_initialize_extension ()
+INIT_GDB_FILE (extension)
{
gdb::observers::before_prompt.attach (ext_lang_before_prompt, "extension");
}