LLVMJIT: Debugging and profiling support.
authorAndres Freund <[email protected]>
Tue, 20 Mar 2018 04:01:06 +0000 (21:01 -0700)
committerAndres Freund <[email protected]>
Wed, 21 Mar 2018 02:34:24 +0000 (19:34 -0700)
This currently requires patches to the LLVM codebase to be effective,
the GUCs are available without those patches however.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131[email protected]

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

index c1543c4f3c2156f6837309e019780cc90fc6c3a0..84fd7522a2334f258ca543c1713557d4d2df980b 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 aa87a0c833111aeeda2a5620009f420a51f8308b..95279810f2e57963685da15dd796569773a2a9ca 100644 (file)
@@ -537,6 +537,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;
@@ -547,6 +562,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 c2f6ada0d0c46a84a45a60cdda5a8fb2b84c4c30..469254956adf51e78e11cd606fef646764f29976 100644 (file)
@@ -1725,6 +1725,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."),
@@ -1736,6 +1752,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 a7bf446d175532359eba492368f08352e3b4a88b..112bbef0790eba3e8771e9b60bd3faae00efd7ed 100644 (file)
@@ -57,7 +57,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);