### 29.1 JIT Declarations

These are the relevant struct declarations that a C program should include to implement the interface:

         typedef enum
         {
           JIT_NOACTION = 0,
           JIT_REGISTER_FN,
           JIT_UNREGISTER_FN
         } jit_actions_t;

         struct jit_code_entry
         {
           struct jit_code_entry *next_entry;
           struct jit_code_entry *prev_entry;
           const char *symfile_addr;
           uint64_t symfile_size;
         };

         struct jit_descriptor
         {
           uint32_t version;
           /* This type should be jit_actions_t, but we use uint32_t
              to be explicit about the bitwidth.  */
           uint32_t action_flag;
           struct jit_code_entry *relevant_entry;
           struct jit_code_entry *first_entry;
         };

         /* GDB puts a breakpoint in this function.  */
         void __attribute__((noinline)) __jit_debug_register_code() { };

         /* Make sure to specify the version statically, because the
            debugger may check the version before we can set it.  */
         struct jit_descriptor __jit_debug_descriptor = { 1, 0, 0, 0 };

If the JIT is multi-threaded, then it is important that the JIT synchronize any modifications to this global data properly, which can easily be done by putting a global mutex around modifications to these structures.