Rename fprintf_symbol_filtered
[binutils-gdb.git] / gdb / jit.h
index 6473d257c30809063fb28f900bb9c32ea0cdd8fe..274ce456f471bb8717fc7e14ed9a454949defdab 100644 (file)
--- a/gdb/jit.h
+++ b/gdb/jit.h
@@ -1,7 +1,6 @@
 /* JIT declarations for GDB, the GNU Debugger.
 
-   Copyright (C) 2009
-   Free Software Foundation, Inc.
+   Copyright (C) 2009-2022 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #ifndef JIT_H
 #define JIT_H
 
-/* When the JIT breakpoint fires, the inferior wants us to take one of these
-   actions.  These values are used by the inferior, so the values of these enums
-   cannot be changed.  */
+struct inferior;
+struct objfile;
+struct minimal_symbol;
+
+/* When the JIT breakpoint fires, the inferior wants us to take one of
+   these actions.  These values are used by the inferior, so the
+   values of these enums cannot be changed.  */
 
 typedef enum
 {
@@ -32,26 +35,28 @@ typedef enum
   JIT_UNREGISTER
 } jit_actions_t;
 
-/* This struct describes a single symbol file in a linked list of symbol files
-   describing generated code.  As the inferior generates code, it adds these
-   entries to the list, and when we attach to the inferior, we read them all.
-   For the first element prev_entry should be NULL, and for the last element
-   next_entry should be NULL.  */
+/* This struct describes a single symbol file in a linked list of
+   symbol files describing generated code.  As the inferior generates
+   code, it adds these entries to the list, and when we attach to the
+   inferior, we read them all.  For the first element prev_entry
+   should be NULL, and for the last element next_entry should be
+   NULL.  */
 
 struct jit_code_entry
 {
   CORE_ADDR next_entry;
   CORE_ADDR prev_entry;
   CORE_ADDR symfile_addr;
-  uint64_t symfile_size;
+  ULONGEST symfile_size;
 };
 
 /* This is the global descriptor that the inferior uses to communicate
-   information to the debugger.  To alert the debugger to take an action, the
-   inferior sets the action_flag to the appropriate enum value, updates
-   relevant_entry to point to the relevant code entry, and calls the function at
-   the well-known symbol with our breakpoint.  We then read this descriptor from
-   another global well-known symbol.  */
+   information to the debugger.  To alert the debugger to take an
+   action, the inferior sets the action_flag to the appropriate enum
+   value, updates relevant_entry to point to the relevant code entry,
+   and calls the function at the well-known symbol with our
+   breakpoint.  We then read this descriptor from another global
+   well-known symbol.  */
 
 struct jit_descriptor
 {
@@ -63,15 +68,58 @@ struct jit_descriptor
   CORE_ADDR first_entry;
 };
 
-/* Looks for the descriptor and registration symbols and breakpoints the
-   registration function.  If it finds both, it registers all the already JITed
-   code.  If it has already found the symbols, then it doesn't try again.  */
+/* An objfile that defines the required symbols of the JIT interface has an
+   instance of this type attached to it.  */
+
+struct jiter_objfile_data
+{
+  ~jiter_objfile_data ();
+
+  /* Symbol for __jit_debug_register_code.  */
+  minimal_symbol *register_code = nullptr;
+
+  /* Symbol for __jit_debug_descriptor.  */
+  minimal_symbol *descriptor = nullptr;
+
+  /* This is the relocated address of the __jit_debug_register_code function
+     provided by this objfile.  This is used to detect relocations changes
+     requiring the breakpoint to be re-created.  */
+  CORE_ADDR cached_code_address = 0;
+
+  /* This is the JIT event breakpoint, or nullptr if it has been deleted.  */
+  breakpoint *jit_breakpoint = nullptr;
+};
+
+/* An objfile that is the product of JIT compilation and was registered
+   using the JIT interface has an instance of this type attached to it.  */
+
+struct jited_objfile_data
+{
+  jited_objfile_data (CORE_ADDR addr, CORE_ADDR symfile_addr,
+                     ULONGEST symfile_size)
+    : addr (addr),
+      symfile_addr (symfile_addr),
+      symfile_size (symfile_size)
+  {}
+
+  /* Address of struct jit_code_entry for this objfile.  */
+  CORE_ADDR addr;
+
+  /* Value of jit_code_entry->symfile_addr for this objfile.  */
+  CORE_ADDR symfile_addr;
+
+  /* Value of jit_code_entry->symfile_size for this objfile.  */
+  ULONGEST symfile_size;
+};
+
+/* Re-establish the jit breakpoint(s).  */
 
-extern void jit_inferior_created_hook (void);
+extern void jit_breakpoint_re_set (void);
 
-/* This function is called by handle_inferior_event when it decides that the JIT
-   event breakpoint has fired.  */
+/* This function is called by handle_inferior_event when it decides
+   that the JIT event breakpoint has fired.  JITER is the objfile
+   whose JIT event breakpoint has been hit.  */
 
-extern void jit_event_handler (void);
+extern void jit_event_handler (gdbarch *gdbarch, objfile *jiter);
 
 #endif /* JIT_H */