Patchwork [gccgo] Register global memory for garbage collector

login
register
mail settings
Submitter Ian Taylor
Date July 23, 2010, 8:45 p.m.
Message ID <mcrhbjqx6zb.fsf@google.com>
Download mbox | patch
Permalink /patch/59842/
State New
Headers show

Comments

Ian Taylor - July 23, 2010, 8:45 p.m.
This patch to the startup code arranges to register global memory for
Go's garbage collector.  This is how the garbage collector finds global
variables.  This will likely be replaced with code to register specific
global variables which may contain pointers into the heap, rather than
scanning all of global memory.  Committed to gccgo branch.

Ian

Patch

Index: gcc/crtstuff.c
===================================================================
--- gcc/crtstuff.c	(revision 155628)
+++ gcc/crtstuff.c	(working copy)
@@ -116,6 +116,10 @@  call_ ## FUNC (void)					\
 # define HIDDEN_DTOR_LIST_END
 #endif
 
+/* If the Go runtime is present, we currently always register memory
+   with it.  */
+#define GO_REGISTER_MEM
+
 /* We do not want to add the weak attribute to the declarations of these
    routines in unwind-dw2-fde.h because that will cause the definition of
    these symbols to be weak as well.
@@ -152,6 +156,12 @@  extern void __do_global_ctors_1 (void);
 /* Likewise for _Jv_RegisterClasses.  */
 extern void _Jv_RegisterClasses (void *) TARGET_ATTRIBUTE_WEAK;
 
+/* And for __go_register_mem.  */
+extern char _end[] TARGET_ATTRIBUTE_WEAK
+  __attribute__ ((__visibility__ ("hidden")));
+extern void __go_register_mem (void *, void *) TARGET_ATTRIBUTE_WEAK;
+extern void __go_deregister_mem (void *, void *) TARGET_ATTRIBUTE_WEAK;
+
 #ifdef OBJECT_FORMAT_ELF
 
 /*  Declare a pointer to void function type.  */
@@ -328,6 +338,11 @@  __do_global_dtors_aux (void)
 #endif
 #endif
 
+#ifdef GO_REGISTER_MEM
+  if (__go_deregister_mem)
+    __go_deregister_mem (__CTOR_LIST__, _end);
+#endif
+
   completed = 1;
 }
 
@@ -347,7 +362,7 @@  __do_global_dtors_aux_1 (void)
 CRT_CALL_STATIC_FUNCTION (INIT_SECTION_ASM_OP, __do_global_dtors_aux_1)
 #endif
 
-#if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
+#if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME) || defined(GO_REGISTER_MEM)
 /* Stick a call to __register_frame_info into the .init section.  For some
    reason calls with no arguments work more reliably in .init, so stick the
    call in another function.  */
@@ -377,6 +392,10 @@  frame_dummy (void)
 	register_classes (__JCR_LIST__);
     }
 #endif /* JCR_SECTION_NAME */
+#ifdef GO_REGISTER_MEM
+  if (__go_register_mem)
+    __go_register_mem (__CTOR_LIST__, _end);
+#endif
 }
 
 #ifdef INIT_SECTION_ASM_OP
@@ -447,9 +466,14 @@  __do_global_dtors (void)
   if (__deregister_frame_info)
     __deregister_frame_info (__EH_FRAME_BEGIN__);
 #endif
+
+#ifdef GO_REGISTER_MEM
+  if (__go_deregister_mem)
+    __go_deregister_mem (__CTOR_LIST__, _end);
+#endif
 }
 
-#if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
+#if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME) || defined(GO_REGISTER_MEM)
 /* A helper function for __do_global_ctors, which is in crtend.o.  Here
    in crtbegin.o, we can reference a couple of symbols not visible there.
    Plus, since we're before libgcc.a, we have no problems referencing
@@ -471,6 +495,10 @@  __do_global_ctors_1(void)
 	register_classes (__JCR_LIST__);
     }
 #endif
+#ifdef GO_REGISTER_MEM
+  if (__go_register_mem)
+    __go_register_mem (__CTOR_LIST__, _end);
+#endif
 }
 #endif /* USE_EH_FRAME_REGISTRY || JCR_SECTION_NAME */
 
@@ -616,7 +644,7 @@  void
 __do_global_ctors (void)
 {
   func_ptr *p;
-#if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
+#if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME) || defined(GO_REGISTER_MEM)
   __do_global_ctors_1();
 #endif
   for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)