Debugging and profiling support for LLVM JIT provider.
authorAndres Freund <andres@anarazel.de>
Thu, 22 Mar 2018 18:07:55 +0000 (11:07 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 22 Mar 2018 18:07:55 +0000 (11:07 -0700)
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

src/backend/jit/jit.c
src/backend/jit/llvm/llvmjit.c
src/backend/utils/misc/guc.c
src/include/jit/jit.h

index 300b9ff73ad389a04042c6bc2dcb649638af41e3..c17df1c985e1eeafb26ed7f7c2eabfea5854f190 100644 (file)
@@ -33,7 +33,9 @@
 /* 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;
index 6b07c143b2b3f45ffacba68b97014f780835079f..8cf8aaaa3a1dc7ecf6f594c47cd5532f5ccbdf97 100644 (file)
@@ -541,6 +541,21 @@ llvm_session_initialize(void)
    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;
@@ -551,6 +566,27 @@ llvm_session_initialize(void)
 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 */
index 10a0ffda28c0cf5a321fc14a34f25b20eb163392..8e09e083069402d66b73b91ee3edff11e673a7a9 100644 (file)
@@ -1734,6 +1734,22 @@ static struct config_bool ConfigureNamesBool[] =
        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."),
@@ -1745,6 +1761,22 @@ static struct config_bool ConfigureNamesBool[] =
        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
index 35301674c8a0c5fdf472d53af7d3bc37b0920dea..2c21c2d27b7a5fdb8eb870378ece30a73e70ccde 100644 (file)
@@ -58,7 +58,9 @@ struct JitProviderCallbacks
 /* 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);