aboutsummaryrefslogtreecommitdiff
path: root/gdb/extension.c
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2021-09-17 18:11:40 +0100
committerAndrew Burgess <aburgess@redhat.com>2022-06-15 09:44:54 +0100
commite4ae302562aba1bd166919d76341fb631e2d470a (patch)
tree9336fab35e71571a0fdd7e1ebf1a6ee58b56af9a /gdb/extension.c
parentf0c2e3e020d350b410e1bbe4ed636f2ea228d555 (diff)
downloadbinutils-e4ae302562aba1bd166919d76341fb631e2d470a.zip
binutils-e4ae302562aba1bd166919d76341fb631e2d470a.tar.gz
binutils-e4ae302562aba1bd166919d76341fb631e2d470a.tar.bz2
gdb: add extension language print_insn hook
This commit is setup for the next commit. In the next commit I will add a Python API to intercept the print_insn calls within GDB, each print_insn call is responsible for disassembling, and printing one instruction. After the next commit it will be possible for a user to write Python code that either wraps around the existing disassembler, or even, in extreme situations, entirely replaces the existing disassembler. This commit does not add any new Python API. What this commit does is put the extension language framework in place for a print_insn hook. There's a new callback added to 'struct extension_language_ops', which is then filled in with nullptr for Python and Guile. Finally, in the disassembler, the code is restructured so that the new extension language function ext_lang_print_insn is called before we delegate to gdbarch_print_insn. After this, the next commit can focus entirely on providing a Python implementation of the new print_insn callback. There should be no user visible change after this commit.
Diffstat (limited to 'gdb/extension.c')
-rw-r--r--gdb/extension.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gdb/extension.c b/gdb/extension.c
index 8f39b86..5a805be 100644
--- a/gdb/extension.c
+++ b/gdb/extension.c
@@ -924,6 +924,26 @@ ext_lang_colorize_disasm (const std::string &content, gdbarch *gdbarch)
return result;
}
+/* See extension.h. */
+
+gdb::optional<int>
+ext_lang_print_insn (struct gdbarch *gdbarch, CORE_ADDR address,
+ struct disassemble_info *info)
+{
+ for (const struct extension_language_defn *extlang : extension_languages)
+ {
+ if (extlang->ops == nullptr
+ || extlang->ops->print_insn == nullptr)
+ continue;
+ gdb::optional<int> length
+ = extlang->ops->print_insn (gdbarch, address, info);
+ if (length.has_value ())
+ return length;
+ }
+
+ 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,