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--)
