Skip to content

Commit 02d1f60

Browse files
committed
Add sys._jit_enabled
1 parent 1dec18a commit 02d1f60

File tree

5 files changed

+115
-41
lines changed

5 files changed

+115
-41
lines changed

Include/internal/pycore_sysmodule.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ extern int _PySys_ClearAttrString(PyInterpreterState *interp,
2222
extern int _PySys_SetFlagObj(Py_ssize_t pos, PyObject *new_value);
2323
extern int _PySys_SetIntMaxStrDigits(int maxdigits);
2424

25+
#if defined(_Py_TIER2) && (_Py_TIER2 % 2 != 0)
26+
extern int _PySys_JITEnabled(void);
27+
#endif
28+
2529
#ifdef __cplusplus
2630
}
2731
#endif

Lib/test/test_embed.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,10 +1782,8 @@ def test_initconfig_api(self):
17821782
'perf_profiling': 2,
17831783
}
17841784
config_dev_mode(preconfig, config)
1785-
# Temporarily enable ignore_stderr=True to ignore warnings on JIT builds
1786-
# See gh-126255 for more information
17871785
self.check_all_configs("test_initconfig_api", config, preconfig,
1788-
api=API_ISOLATED, ignore_stderr=True)
1786+
api=API_ISOLATED, env={'PYTHON_JIT': '0'})
17891787

17901788
def test_initconfig_get_api(self):
17911789
self.run_embedded_interpreter("test_initconfig_get_api")

Python/clinic/sysmodule.c.h

Lines changed: 37 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/pylifecycle.c

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,43 +1296,34 @@ init_interp_main(PyThreadState *tstate)
12961296
#endif
12971297
}
12981298

1299-
// Turn on experimental tier 2 (uops-based) optimizer
1300-
// This is also needed when the JIT is enabled
1299+
// Turn on experimental tier 2 (uops-based) optimizer
1300+
// This is also needed when the JIT is enabled
13011301
#ifdef _Py_TIER2
13021302
if (is_main_interp) {
1303-
int enabled = 1;
1304-
#if _Py_TIER2 & 2
1305-
enabled = 0;
1303+
// perf profiler works fine with tier 2 interpreter, so
1304+
// only checking for a "real JIT".
1305+
#if _Py_TIER % 2 != 0
1306+
int enabled = _PySys_JITEnabled();
1307+
printf("enabled = %d\n", enabled);
1308+
if (enabled && config->perf_profiling > 0) {
1309+
(void)PyErr_WarnEx(
1310+
PyExc_RuntimeWarning,
1311+
"JIT deactivated as perf profiling support is active",
1312+
0);
1313+
} else
13061314
#endif
1307-
char *env = Py_GETENV("PYTHON_JIT");
1308-
if (env && *env != '\0') {
1309-
// PYTHON_JIT=0|1 overrides the default
1310-
enabled = *env != '0';
1315+
{
1316+
PyObject *opt = _PyOptimizer_NewUOpOptimizer();
1317+
if (opt == NULL) {
1318+
return _PyStatus_ERR("can't initialize optimizer");
13111319
}
1312-
if (enabled) {
1313-
#ifdef _Py_JIT
1314-
// perf profiler works fine with tier 2 interpreter, so
1315-
// only checking for a "real JIT".
1316-
if (config->perf_profiling > 0) {
1317-
(void)PyErr_WarnEx(
1318-
PyExc_RuntimeWarning,
1319-
"JIT deactivated as perf profiling support is active",
1320-
0);
1321-
} else
1322-
#endif
1323-
{
1324-
PyObject *opt = _PyOptimizer_NewUOpOptimizer();
1325-
if (opt == NULL) {
1326-
return _PyStatus_ERR("can't initialize optimizer");
1327-
}
1328-
if (_Py_SetTier2Optimizer((_PyOptimizerObject *)opt)) {
1329-
return _PyStatus_ERR("can't install optimizer");
1330-
}
1331-
Py_DECREF(opt);
1332-
}
1320+
if (_Py_SetTier2Optimizer((_PyOptimizerObject *)opt)) {
1321+
return _PyStatus_ERR("can't install optimizer");
13331322
}
1323+
Py_DECREF(opt);
13341324
}
1335-
#endif
1325+
}
1326+
#endif // Py_TIER2
13361327

13371328
if (!is_main_interp) {
13381329
// The main interpreter is handled in Py_Main(), for now.

Python/sysmodule.c

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2264,12 +2264,14 @@ sys_activate_stack_trampoline_impl(PyObject *module, const char *backend)
22642264
/*[clinic end generated code: output=5783cdeb51874b43 input=a12df928758a82b4]*/
22652265
{
22662266
#ifdef PY_HAVE_PERF_TRAMPOLINE
2267-
#ifdef _Py_JIT
2268-
_PyOptimizerObject* optimizer = _Py_GetOptimizer();
2269-
if (optimizer != NULL) {
2270-
Py_DECREF(optimizer);
2271-
PyErr_SetString(PyExc_ValueError, "Cannot activate the perf trampoline if the JIT is active");
2272-
return NULL;
2267+
#if defined(_Py_TIER2) && (_Py_TIER2 % 2 != 0)
2268+
if (_PySys_JITEnabled()) {
2269+
_PyOptimizerObject* optimizer = _Py_GetOptimizer();
2270+
if (optimizer != NULL) {
2271+
Py_DECREF(optimizer);
2272+
PyErr_SetString(PyExc_ValueError, "Cannot activate the perf trampoline if the JIT is active");
2273+
return NULL;
2274+
}
22732275
}
22742276
#endif
22752277

@@ -2533,6 +2535,46 @@ PyAPI_FUNC(int) PyUnstable_CopyPerfMapFile(const char* parent_filename) {
25332535
}
25342536

25352537

2538+
#ifdef _Py_TIER2
2539+
// _Py_TIER2 is set to 4 or 6 in tier 2 builds.
2540+
#if _Py_TIER2 % 2 != 0
2541+
int
2542+
_PySys_JITEnabled(void)
2543+
{
2544+
char *env = Py_GETENV("PYTHON_JIT");
2545+
if (_Py_TIER2 == 1) {
2546+
// Interpreter was built with enabled jit, but it can be disabled via PYTHON_JIT=0
2547+
if (env && *env != '\0') {
2548+
return *env != '0';
2549+
}
2550+
return 1;
2551+
}
2552+
else if (_Py_TIER2 == 3) {
2553+
// Interpreter was built with disabled jit, but it can be enabled via PYTHON_JIT=1
2554+
if (env && *env != '\0') {
2555+
return *env == '1';
2556+
}
2557+
return 0;
2558+
}
2559+
Py_UNREACHABLE();
2560+
}
2561+
2562+
/*[clinic input]
2563+
sys._jit_enabled -> bool
2564+
2565+
Returns True if JIT is enabled, False otherwise.
2566+
[clinic start generated code]*/
2567+
2568+
static int
2569+
sys__jit_enabled_impl(PyObject *module)
2570+
/*[clinic end generated code: output=e8adca3fa5011880 input=f2bdfa820c11f65b]*/
2571+
{
2572+
return _PySys_JITEnabled();
2573+
}
2574+
#endif
2575+
#endif // _Py_TIER2
2576+
2577+
25362578
static PyMethodDef sys_methods[] = {
25372579
/* Might as well keep this in alphabetic order */
25382580
SYS_ADDAUDITHOOK_METHODDEF
@@ -2603,6 +2645,9 @@ static PyMethodDef sys_methods[] = {
26032645
#endif
26042646
SYS__GET_CPU_COUNT_CONFIG_METHODDEF
26052647
SYS__IS_GIL_ENABLED_METHODDEF
2648+
#ifdef _Py_TIER2
2649+
SYS__JIT_ENABLED_METHODDEF
2650+
#endif
26062651
{NULL, NULL} // sentinel
26072652
};
26082653

0 commit comments

Comments
 (0)