+void sgen_report_internal_mem_usage (void) MONO_INTERNAL;
+void sgen_report_pinned_mem_usage (SgenPinnedAllocator *alc) MONO_INTERNAL;
+void sgen_dump_internal_mem_usage (FILE *heap_dump_file) MONO_INTERNAL;
+void sgen_dump_section (GCMemSection *section, const char *type) MONO_INTERNAL;
+void sgen_dump_occupied (char *start, char *end, char *section_start) MONO_INTERNAL;
+
+void sgen_register_moved_object (void *obj, void *destination) MONO_INTERNAL;
+
+void sgen_register_fixed_internal_mem_type (int type, size_t size) MONO_INTERNAL;
+
+void* sgen_alloc_internal (int type) MONO_INTERNAL;
+void sgen_free_internal (void *addr, int type) MONO_INTERNAL;
+
+void* sgen_alloc_internal_dynamic (size_t size, int type, gboolean assert_on_failure) MONO_INTERNAL;
+void sgen_free_internal_dynamic (void *addr, size_t size, int type) MONO_INTERNAL;
+
+void* sgen_alloc_pinned (SgenPinnedAllocator *allocator, size_t size) MONO_INTERNAL;
+void sgen_free_pinned (SgenPinnedAllocator *allocator, void *addr, size_t size) MONO_INTERNAL;
+
+gboolean sgen_parse_environment_string_extract_number (const char *str, glong *out) MONO_INTERNAL;
+
+void sgen_pinned_scan_objects (SgenPinnedAllocator *alc, IterateObjectCallbackFunc callback, void *callback_data) MONO_INTERNAL;
+void sgen_pinned_scan_pinned_objects (SgenPinnedAllocator *alc, IterateObjectCallbackFunc callback, void *callback_data) MONO_INTERNAL;
+
+void sgen_pinned_update_heap_boundaries (SgenPinnedAllocator *alc) MONO_INTERNAL;
+
+void** sgen_find_optimized_pin_queue_area (void *start, void *end, int *num) MONO_INTERNAL;
+void sgen_find_section_pin_queue_start_end (GCMemSection *section) MONO_INTERNAL;
+void sgen_pin_objects_in_section (GCMemSection *section, SgenGrayQueue *queue, gboolean only_enqueue) MONO_INTERNAL;
+
+void sgen_pin_stats_register_object (char *obj, size_t size);
+void sgen_pin_stats_register_global_remset (char *obj);
+void sgen_pin_stats_print_class_stats (void);
+
+void sgen_sort_addresses (void **array, int size) MONO_INTERNAL;
+void sgen_add_to_global_remset (gpointer ptr) MONO_INTERNAL;
+
+typedef void (*CopyOrMarkObjectFunc) (void**, SgenGrayQueue*);
+typedef void (*ScanObjectFunc) (char*, SgenGrayQueue*);
+typedef void (*ScanVTypeFunc) (char*, mword desc, SgenGrayQueue*);
+
+int sgen_get_current_collection_generation (void) MONO_INTERNAL;
+gboolean sgen_collection_is_parallel (void) MONO_INTERNAL;
+gboolean sgen_collection_is_concurrent (void) MONO_INTERNAL;
+
+typedef struct {
+ CopyOrMarkObjectFunc copy_or_mark_object;
+ ScanObjectFunc scan_object;
+ ScanVTypeFunc scan_vtype;
+ /*FIXME add allocation function? */
+} SgenObjectOperations;
+
+SgenObjectOperations *sgen_get_current_object_ops (void) MONO_INTERNAL;
+
+typedef struct _SgenFragment SgenFragment;
+
+struct _SgenFragment {
+ SgenFragment *next;
+ char *fragment_start;
+ char *fragment_next; /* the current soft limit for allocation */
+ char *fragment_end;
+ SgenFragment *next_in_order; /* We use a different entry for all active fragments so we can avoid SMR. */
+};
+
+typedef struct {
+ SgenFragment *alloc_head; /* List head to be used when allocating memory. Walk with fragment_next. */
+ SgenFragment *region_head; /* List head of the region used by this allocator. Walk with next_in_order. */
+} SgenFragmentAllocator;
+
+void sgen_fragment_allocator_add (SgenFragmentAllocator *allocator, char *start, char *end) MONO_INTERNAL;
+void sgen_fragment_allocator_release (SgenFragmentAllocator *allocator) MONO_INTERNAL;
+void* sgen_fragment_allocator_serial_alloc (SgenFragmentAllocator *allocator, size_t size) MONO_INTERNAL;
+void* sgen_fragment_allocator_par_alloc (SgenFragmentAllocator *allocator, size_t size) MONO_INTERNAL;
+void* sgen_fragment_allocator_serial_range_alloc (SgenFragmentAllocator *allocator, size_t desired_size, size_t minimum_size, size_t *out_alloc_size) MONO_INTERNAL;
+void* sgen_fragment_allocator_par_range_alloc (SgenFragmentAllocator *allocator, size_t desired_size, size_t minimum_size, size_t *out_alloc_size) MONO_INTERNAL;
+SgenFragment* sgen_fragment_allocator_alloc (void) MONO_INTERNAL;
+void sgen_clear_allocator_fragments (SgenFragmentAllocator *allocator) MONO_INTERNAL;
+void sgen_clear_range (char *start, char *end) MONO_INTERNAL;