From: Andres Freund Date: Tue, 20 Mar 2018 04:01:06 +0000 (-0700) Subject: LLVMJIT: Debugging and profiling support. X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=896ccf0ee9cb84e20e426f46f8b3f5521b11d714;p=users%2Fandresfreund%2Fpostgres.git LLVMJIT: Debugging and profiling support. 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.tazjxwus3k2w3ybh@alap3.anarazel.de --- diff --git a/src/backend/jit/jit.c b/src/backend/jit/jit.c index c1543c4f3c..84fd7522a2 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 aa87a0c833..95279810f2 100644 --- a/src/backend/jit/llvm/llvmjit.c +++ b/src/backend/jit/llvm/llvmjit.c @@ -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 */ diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index c2f6ada0d0..469254956a 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -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 diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h index a7bf446d17..112bbef079 100644 --- a/src/include/jit/jit.h +++ b/src/include/jit/jit.h @@ -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);