Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r90636:fcd776f8ec36 Date: 2017-03-11 22:26 +0100 http://bitbucket.org/pypy/pypy/changeset/fcd776f8ec36/
Log: The hack to prevent function inlining no longer works with "clang -flto". Fix it by using the proper way. Even if it is compiler- dependent, we should be fine with two versions: MSVC and GCC/clang. This is an attempted fix for the OS/X tests of _continuation/greenlet/stackless. diff --git a/rpython/translator/c/src/stacklet/stacklet.c b/rpython/translator/c/src/stacklet/stacklet.c --- a/rpython/translator/c/src/stacklet/stacklet.c +++ b/rpython/translator/c/src/stacklet/stacklet.c @@ -16,6 +16,7 @@ * can redefine it to upwards growing, 1. */ #define STACK_DIRECTION 0 +#define STATIC_NOINLINE __attribute__((noinline)) static #include "src/stacklet/slp_platformselect.h" @@ -56,11 +57,6 @@ stacklet_thread_handle stack_thrd; /* the thread where the stacklet is */ }; -void *(*_stacklet_switchstack)(void*(*)(void*, void*), - void*(*)(void*, void*), void*) = NULL; -void (*_stacklet_initialstub)(struct stacklet_thread_s *, - stacklet_run_fn, void *) = NULL; - struct stacklet_thread_s { struct stacklet_s *g_stack_chain_head; /* NULL <=> running main */ char *g_current_stack_stop; @@ -252,8 +248,17 @@ return EMPTY_STACKLET_HANDLE; } -static void g_initialstub(struct stacklet_thread_s *thrd, - stacklet_run_fn run, void *run_arg) +STATIC_NOINLINE +void *_stacklet_switchstack(void *(*save_state)(void*, void*), + void *(*restore_state)(void*, void*), + void *extra) +{ + return slp_switch(save_state, restore_state, extra); +} + +STATIC_NOINLINE +void g_initialstub(struct stacklet_thread_s *thrd, + stacklet_run_fn run, void *run_arg) { struct stacklet_s *result; @@ -284,13 +289,6 @@ { struct stacklet_thread_s *thrd; - if (_stacklet_switchstack == NULL) { - /* set up the following global with an indirection, which is needed - to prevent any inlining */ - _stacklet_initialstub = g_initialstub; - _stacklet_switchstack = slp_switch; - } - thrd = malloc(sizeof(struct stacklet_thread_s)); if (thrd != NULL) memset(thrd, 0, sizeof(struct stacklet_thread_s)); @@ -311,7 +309,7 @@ thrd->g_current_stack_stop = ((char *)&stackmarker) + 1; thrd->g_current_stack_marker = (char *)&stackmarker; - _stacklet_initialstub(thrd, run, run_arg); + g_initialstub(thrd, run, run_arg); return thrd->g_source; } diff --git a/rpython/translator/c/src/stacklet/switch_x64_msvc.h b/rpython/translator/c/src/stacklet/switch_x64_msvc.h --- a/rpython/translator/c/src/stacklet/switch_x64_msvc.h +++ b/rpython/translator/c/src/stacklet/switch_x64_msvc.h @@ -5,3 +5,5 @@ void *(*restore_state)(void*, void*), void *extra); +#undef STATIC_NOINLINE +#define STATIC_NOINLINE static __declspec(noinline) diff --git a/rpython/translator/c/src/stacklet/switch_x86_msvc.h b/rpython/translator/c/src/stacklet/switch_x86_msvc.h --- a/rpython/translator/c/src/stacklet/switch_x86_msvc.h +++ b/rpython/translator/c/src/stacklet/switch_x86_msvc.h @@ -5,6 +5,9 @@ void *(*restore_state)(void*, void*), void *extra); +#undef STATIC_NOINLINE +#define STATIC_NOINLINE static __declspec(noinline) + #define WIN32_LEAN_AND_MEAN #include <windows.h> _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit