From c4e92a183852c8c4d6808ed441eb3097c118607e Mon Sep 17 00:00:00 2001 From: Milo Mirate Date: Wed, 21 Aug 2019 10:01:05 -0400 Subject: [PATCH 1/2] [2.7] Protect climb_stack_and_eval_frame from trivialization gcc >= 4.7 trivializes not only climb_stack_and_transfer, but also climb_stack_and_eval_frame. Thus the same global-write trick must be used both there and here. --- Stackless/core/stacklesseval.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Stackless/core/stacklesseval.c b/Stackless/core/stacklesseval.c index 562c99faf5eded8..4399ed24f4c5db9 100644 --- a/Stackless/core/stacklesseval.c +++ b/Stackless/core/stacklesseval.c @@ -267,6 +267,8 @@ make_initial_stub(void) return result; } +/* a write only variable used to prevent overly optimisation */ +intptr_t *global_goobledigoobs; static PyObject * climb_stack_and_eval_frame(PyFrameObject *f) { @@ -286,6 +288,10 @@ climb_stack_and_eval_frame(PyFrameObject *f) goobledigoobs = alloca(needed * sizeof(intptr_t)); if (goobledigoobs == NULL) return NULL; + /* hinder the compiler to optimise away + goobledigoobs and the alloca call. + This happens with gcc 4.7.x and -O2 */ + global_goobledigoobs = goobledigoobs; } return slp_eval_frame(f); } From 8b87d2bed0ff0f77343f894a6f7d139c974ee554 Mon Sep 17 00:00:00 2001 From: Anselm Kruis Date: Fri, 23 Aug 2019 12:28:11 +0200 Subject: [PATCH 2/2] Update changelog.txt --- Stackless/changelog.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Stackless/changelog.txt b/Stackless/changelog.txt index 91eb51f361cfdaa..108a330da9ac0cf 100644 --- a/Stackless/changelog.txt +++ b/Stackless/changelog.txt @@ -10,6 +10,11 @@ What's New in Stackless 2.7.XX? *Release date: XXXX-XX-XX* +- https://github.com/stackless-dev/stackless/issues/227 + Protect climb_stack_and_eval_frame from trivialization. + gcc-4.8.5 (and possibly other versions between 4.7 and 5.4) trivializes a + side-effect-only alloca. Patch by Milo Mirate. + - https://github.com/stackless-dev/stackless/issues/220 Improve the error handling in case of failed stack transfers / hard tasklet switches. Call Py_FatalError, if a clean recovery is impossible.