This currently requires patches to the LLVM codebase to be
 effective (submitted upstream), the GUCs are available without those
 patches however. 
 Author: Andres Freund
 Discussion: https://postgr.es/m/
20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de  
        /* GUCs */
  bool       jit_enabled = true;
  char      *jit_provider = "llvmjit";
 +bool       jit_debugging_support = false;
  bool       jit_dump_bitcode = false;
 +bool       jit_profiling_support = false;
  
  static JitProviderCallbacks provider;
  static bool provider_successfully_loaded = false;
             llvm_opt0_orc = LLVMOrcCreateInstance(llvm_opt0_targetmachine);
     llvm_opt3_orc = LLVMOrcCreateInstance(llvm_opt3_targetmachine);
  
 +#if defined(HAVE_DECL_LLVMORCREGISTERGDB) && HAVE_DECL_LLVMORCREGISTERGDB
 +   if (jit_debugging_support)
 +   {
 +       LLVMOrcRegisterGDB(llvm_opt0_orc);
 +       LLVMOrcRegisterGDB(llvm_opt3_orc);
 +   }
 +#endif
 +#if defined(HAVE_DECL_LLVMORCREGISTERPERF) && HAVE_DECL_LLVMORCREGISTERPERF
 +   if (jit_profiling_support)
 +   {
 +       LLVMOrcRegisterPerf(llvm_opt0_orc);
 +       LLVMOrcRegisterPerf(llvm_opt3_orc);
 +   }
 +#endif
 +
     before_shmem_exit(llvm_shutdown, 0);
  
     llvm_session_initialized = true;
   static void
  llvm_shutdown(int code, Datum arg)
  {
 +   /* unregister profiling support, needs to be flushed to be useful */
 +
 +   if (llvm_opt3_orc)
 +   {
 +#if defined(HAVE_DECL_LLVMORCREGISTERPERF) && HAVE_DECL_LLVMORCREGISTERPERF
 +       if (jit_profiling_support)
 +           LLVMOrcUnregisterPerf(llvm_opt3_orc);
 +#endif
 +       LLVMOrcDisposeInstance(llvm_opt3_orc);
 +       llvm_opt3_orc = NULL;
 +   }
 +
 +   if (llvm_opt0_orc)
 +   {
 +#if defined(HAVE_DECL_LLVMORCREGISTERPERF) && HAVE_DECL_LLVMORCREGISTERPERF
 +       if (jit_profiling_support)
 +           LLVMOrcUnregisterPerf(llvm_opt0_orc);
 +#endif
 +       LLVMOrcDisposeInstance(llvm_opt0_orc);
 +       llvm_opt0_orc = NULL;
 +   }
  }
  
  /* helper for llvm_create_types */
                 NULL, NULL, NULL
     },
  
 +   {
 +       {"jit_debugging_support", PGC_SU_BACKEND, DEVELOPER_OPTIONS,
 +           gettext_noop("Register JIT compiled function with debugger."),
 +           NULL,
 +           GUC_NOT_IN_SAMPLE
 +       },
 +       &jit_debugging_support,
 +       false,
 +       /*
 +        * This is not guaranteed to be available, but given it's a developer
 +        * oriented option, it doesn't seem worth adding code checking
 +        * availability.
 +        */
 +       NULL, NULL, NULL
 +   },
 +
     {
         {"jit_dump_bitcode", PGC_SUSET, DEVELOPER_OPTIONS,
             gettext_noop("Write out LLVM bitcode to facilitate JIT debugging."),
          NULL, NULL, NULL
     },
  
 +   {
 +       {"jit_profiling_support", PGC_SU_BACKEND, DEVELOPER_OPTIONS,
 +           gettext_noop("Register JIT compiled function with perf profiler."),
 +           NULL,
 +           GUC_NOT_IN_SAMPLE
 +       },
 +       &jit_profiling_support,
 +       false,
 +       /*
 +        * This is not guaranteed to be available, but given it's a developer
 +        * oriented option, it doesn't seem worth adding code checking
 +        * availability.
 +        */
 +       NULL, NULL, NULL
 +   },
 +
     /* End-of-list marker */
     {
         {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL, NULL
          /* GUCs */
  extern bool jit_enabled;
  extern char *jit_provider;
 +extern bool jit_debugging_support;
  extern bool jit_dump_bitcode;
 +extern bool jit_profiling_support;
  
  
  extern void jit_reset_after_error(void);