From patchwork Fri Jul 23 20:45:28 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [gccgo] Register global memory for garbage collector Date: Fri, 23 Jul 2010 10:45:28 -0000 From: Ian Taylor X-Patchwork-Id: 59842 Message-Id: To: gcc-patches@gcc.gnu.org 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 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--)