]> granicus.if.org Git - gc/commitdiff
Fix GC_noop6 definition to avoid its calls to be optimized away
authorIvan Maidanski <ivmai@mail.ru>
Mon, 12 Dec 2016 23:34:28 +0000 (02:34 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Mon, 6 Feb 2017 18:51:01 +0000 (21:51 +0300)
(fix commits e3ec4a51586a21)

* include/private/gc_priv.h (GC_ATTR_NOINLINE): New macro (effective
for GCC/Clang and MS VC currently).
* mark.c (GC_noop6): Use GC_ATTR_NOINLINE attribute; call
AO_compiler_barrier if PARALLEL_MARK (or GC_PTHREADS and not
GC_WIN32_THREADS), otherwise call GC_noop1(0); add
comment.

include/private/gc_priv.h
mark.c

index a1a52f7ea2b73ad71e6d2e7a42d68c206230f658..3c6f04334472ab74eccfb3168b30a2338e58076f 100644 (file)
@@ -171,6 +171,16 @@ typedef char * ptr_t;   /* A generic pointer to which we can add        */
 # define GC_INLINE static
 #endif
 
+#ifndef GC_ATTR_NOINLINE
+# if __GNUC__ >= 4
+#   define GC_ATTR_NOINLINE __attribute__((__noinline__))
+# elif _MSC_VER >= 14
+#   define GC_ATTR_NOINLINE __declspec(noinline)
+# else
+#   define GC_ATTR_NOINLINE /* empty */
+# endif
+#endif
+
 #ifndef GC_API_OSCALL
   /* This is used to identify GC routines called by name from OS.       */
 # if defined(__GNUC__)
diff --git a/mark.c b/mark.c
index 2b88cb05eca69c4770dc6d57204b28afdd1072e3..315666661051afb17cc4de92db267a4b0c614bfc 100644 (file)
--- a/mark.c
+++ b/mark.c
 
 /* Make arguments appear live to compiler.  Put here to minimize the    */
 /* risk of inlining.  Used to minimize junk left in registers.          */
+GC_ATTR_NOINLINE
 void GC_noop6(word arg1 GC_ATTR_UNUSED, word arg2 GC_ATTR_UNUSED,
               word arg3 GC_ATTR_UNUSED, word arg4 GC_ATTR_UNUSED,
               word arg5 GC_ATTR_UNUSED, word arg6 GC_ATTR_UNUSED)
 {
-  /* Empty */
+  /* Avoid GC_noop6 calls to be optimized away. */
+# if defined(GC_PTHREADS) && !defined(GC_WIN32_THREADS) \
+     || defined(PARALLEL_MARK)
+    AO_compiler_barrier(); /* to serve as a special side-effect */
+# else
+    GC_noop1(0);
+# endif
 }
 
 /* Single argument version, robust against whole program analysis. */