From dace8d1372b791e5d8e00df9e3fb5a7ba074c28a Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Fri, 2 Aug 2019 21:21:59 +0300 Subject: [PATCH] Fix 'wrong finalization data' gctest failure on Windows (fix of commit aefc738c1) Issue #289 (bdwgc). This commit workarounds some bug in MS compiler for x86 (v19.10.25017, as of now) which causes generation of an incorrect code for GC_normal_finalize_mark_proc() if code optimizations are on. * finalize.c [_MSC_VER && I386] (GC_normal_finalize_mark_proc): Inline GC_push_obj() manually; add comment. --- finalize.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/finalize.c b/finalize.c index 5c23b4c..0dde1a6 100644 --- a/finalize.c +++ b/finalize.c @@ -636,8 +636,27 @@ GC_API GC_await_finalize_proc GC_CALL GC_get_await_finalize_proc(void) /* overflow is handled by the caller, and is not a disaster. */ STATIC void GC_normal_finalize_mark_proc(ptr_t p) { +# if defined(_MSC_VER) && defined(I386) + hdr * hhdr = HDR(p); + /* This is a manually inlined variant of GC_push_obj(). Otherwise */ + /* some optimizer bug is tickled in VC for X86 (v19, at least). */ +# define mark_stack_top GC_mark_stack_top + mse * mark_stack_limit = GC_mark_stack + GC_mark_stack_size; + word descr = hhdr -> hb_descr; + + if (descr != 0) { + mark_stack_top++; + if ((word)mark_stack_top >= (word)mark_stack_limit) { + mark_stack_top = GC_signal_mark_stack_overflow(mark_stack_top); + } + mark_stack_top -> mse_start = p; + mark_stack_top -> mse_descr.w = descr; + } +# undef mark_stack_top +# else GC_mark_stack_top = GC_push_obj(p, HDR(p), GC_mark_stack_top, GC_mark_stack + GC_mark_stack_size); +# endif } /* This only pays very partial attention to the mark descriptor. */ -- 2.7.4