summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund2018-03-22 18:07:55 +0000
committerAndres Freund2018-03-22 18:07:55 +0000
commit250bca7fc145b143d5e9aeeca66f0bb36cf4d5ef (patch)
tree72035cd100df961412a1eb6fed0dbb3345c3e001
parentb96d550eb03cfdb000def70912ec840dbe7f67da (diff)
Debugging and profiling support for LLVM JIT provider.
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/[email protected]
-rw-r--r--src/backend/jit/jit.c2
-rw-r--r--src/backend/jit/llvm/llvmjit.c36
-rw-r--r--src/backend/utils/misc/guc.c32
-rw-r--r--src/include/jit/jit.h2
4 files changed, 72 insertions, 0 deletions
diff --git a/src/backend/jit/jit.c b/src/backend/jit/jit.c
index 300b9ff73a..c17df1c985 100644
--- a/src/backend/jit/jit.c
+++ b/src/backend/jit/jit.c
@@ -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;
diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index 6b07c143b2..8cf8aaaa3a 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -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 */
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 10a0ffda28..8e09e08306 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1735,6 +1735,22 @@ static struct config_bool ConfigureNamesBool[] =
},
{
+ {"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,
@@ -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
diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h
index 35301674c8..2c21c2d27b 100644
--- a/src/include/jit/jit.h
+++ b/src/include/jit/jit.h
@@ -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);