summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2021-08-12 11:15:06 (GMT)
committerGitHub <noreply@github.com>2021-08-12 11:15:06 (GMT)
commit8ac0886091c27bf4b6bb0a9b571e174b554d31a4 (patch)
tree9e9f3710581381eaa65a4e89eadfbb493228fffc
parenta530a9538f3f444bebd2d2b71fe5f2e747e76d73 (diff)
downloadcpython-8ac0886091c27bf4b6bb0a9b571e174b554d31a4.zip
cpython-8ac0886091c27bf4b6bb0a9b571e174b554d31a4.tar.gz
cpython-8ac0886091c27bf4b6bb0a9b571e174b554d31a4.tar.bz2
bpo-44890: collect specialization stats if Py_DEBUG (GH-27731)
-rw-r--r--Include/internal/pycore_code.h13
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst1
-rw-r--r--Modules/_opcode.c2
-rw-r--r--Python/ceval.c2
-rw-r--r--Python/specialize.c12
5 files changed, 17 insertions, 13 deletions
diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h
index 7ae7aee..85f0954 100644
--- a/Include/internal/pycore_code.h
+++ b/Include/internal/pycore_code.h
@@ -301,13 +301,16 @@ int _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *nam
int _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins, _Py_CODEUNIT *instr, PyObject *name, SpecializedCacheEntry *cache);
int _Py_Specialize_BinarySubscr(PyObject *sub, PyObject *container, _Py_CODEUNIT *instr);
-#define SPECIALIZATION_STATS 0
-#define SPECIALIZATION_STATS_DETAILED 0
-#define SPECIALIZATION_STATS_TO_FILE 0
+#define PRINT_SPECIALIZATION_STATS 0
+#define PRINT_SPECIALIZATION_STATS_DETAILED 0
+#define PRINT_SPECIALIZATION_STATS_TO_FILE 0
+
+#define COLLECT_SPECIALIZATION_STATS (Py_DEBUG || PRINT_SPECIALIZATION_STATS)
+#define COLLECT_SPECIALIZATION_STATS_DETAILED (Py_DEBUG || PRINT_SPECIALIZATION_STATS_DETAILED)
#define SPECIALIZATION_FAILURE_KINDS 20
-#if SPECIALIZATION_STATS
+#if COLLECT_SPECIALIZATION_STATS
typedef struct _stats {
uint64_t specialization_success;
@@ -317,7 +320,7 @@ typedef struct _stats {
uint64_t miss;
uint64_t deopt;
uint64_t unquickened;
-#if SPECIALIZATION_STATS_DETAILED
+#if COLLECT_SPECIALIZATION_STATS_DETAILED
uint64_t specialization_failure_kinds[SPECIALIZATION_FAILURE_KINDS];
#endif
} SpecializationStats;
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst
new file mode 100644
index 0000000..48a1c8b
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst
@@ -0,0 +1 @@
+Specialization stats are always collected in debug builds. \ No newline at end of file
diff --git a/Modules/_opcode.c b/Modules/_opcode.c
index d440b5c..39e3066 100644
--- a/Modules/_opcode.c
+++ b/Modules/_opcode.c
@@ -85,7 +85,7 @@ static PyObject *
_opcode_get_specialization_stats_impl(PyObject *module)
/*[clinic end generated code: output=fcbc32fdfbec5c17 input=e1f60db68d8ce5f6]*/
{
-#if SPECIALIZATION_STATS
+#if COLLECT_SPECIALIZATION_STATS
return _Py_GetSpecializationStats();
#else
Py_RETURN_NONE;
diff --git a/Python/ceval.c b/Python/ceval.c
index f494e84..111689f 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -341,7 +341,7 @@ PyEval_InitThreads(void)
void
_PyEval_Fini(void)
{
-#if SPECIALIZATION_STATS
+#if PRINT_SPECIALIZATION_STATS
_Py_PrintSpecializationStats();
#endif
}
diff --git a/Python/specialize.c b/Python/specialize.c
index f0d68f0..e653ae4 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -37,7 +37,7 @@
*/
Py_ssize_t _Py_QuickenedCount = 0;
-#if SPECIALIZATION_STATS
+#if COLLECT_SPECIALIZATION_STATS
SpecializationStats _specialization_stats[256] = { 0 };
#define ADD_STAT_TO_DICT(res, field) \
@@ -69,7 +69,7 @@ stats_to_dict(SpecializationStats *stats)
ADD_STAT_TO_DICT(res, miss);
ADD_STAT_TO_DICT(res, deopt);
ADD_STAT_TO_DICT(res, unquickened);
-#if SPECIALIZATION_STATS_DETAILED
+#if COLLECT_SPECIALIZATION_STATS_DETAILED
PyObject *failure_kinds = PyTuple_New(SPECIALIZATION_FAILURE_KINDS);
if (failure_kinds == NULL) {
Py_DECREF(res);
@@ -111,7 +111,7 @@ add_stat_dict(
return err;
}
-#if SPECIALIZATION_STATS
+#if COLLECT_SPECIALIZATION_STATS
PyObject*
_Py_GetSpecializationStats(void) {
PyObject *stats = PyDict_New();
@@ -144,7 +144,7 @@ print_stats(FILE *out, SpecializationStats *stats, const char *name)
PRINT_STAT(name, miss);
PRINT_STAT(name, deopt);
PRINT_STAT(name, unquickened);
-#if SPECIALIZATION_STATS_DETAILED
+#if PRINT_SPECIALIZATION_STATS_DETAILED
for (int i = 0; i < SPECIALIZATION_FAILURE_KINDS; i++) {
fprintf(out, " %s.specialization_failure_kinds[%d] : %" PRIu64 "\n",
name, i, stats->specialization_failure_kinds[i]);
@@ -157,7 +157,7 @@ void
_Py_PrintSpecializationStats(void)
{
FILE *out = stderr;
-#if SPECIALIZATION_STATS_TO_FILE
+#if PRINT_SPECIALIZATION_STATS_TO_FILE
/* Write to a file instead of stderr. */
# ifdef MS_WINDOWS
const char *dirname = "c:\\temp\\py_stats\\";
@@ -182,7 +182,7 @@ _Py_PrintSpecializationStats(void)
}
}
-#if SPECIALIZATION_STATS_DETAILED
+#if COLLECT_SPECIALIZATION_STATS_DETAILED
#define SPECIALIZATION_FAIL(opcode, kind) _specialization_stats[opcode].specialization_failure_kinds[kind]++