aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 300b9ff73ad..c17df1c985e 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 6b07c143b2b..8cf8aaaa3a1 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 10a0ffda28c..8e09e083069 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 35301674c8a..2c21c2d27b7 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);