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/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de
This commit is contained in:
Andres Freund 2018-03-22 11:07:55 -07:00
parent b96d550eb0
commit 250bca7fc1
4 changed files with 72 additions and 0 deletions

View 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;

View 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 */

View 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

View 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);