]> granicus.if.org Git - gc/commitdiff
Fix 'wrong finalization data' gctest failure on Windows
authorIvan Maidanski <ivmai@mail.ru>
Fri, 2 Aug 2019 18:21:59 +0000 (21:21 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Fri, 2 Aug 2019 18:32:53 +0000 (21:32 +0300)
(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

index 5c23b4c436d3f7af569fd086395f4d36a8ded3af..0dde1a69cd4d606276d684ce5d1882e66e59bfd3 100644 (file)
@@ -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.        */