// AUTO-GENERATED by autogen.sh; DO NOT EDIT

#include <stddef.h>
#include <errno.h>
#include <stdlib.h>
#include "go-alloc.h"
#include "runtime.h"
#include "arch.h"
#include "malloc.h"
#include "interface.h"
#include "go-type.h"
#define type __type_descriptor
#define kind __code
#define string __reflection
#define KindPtr GO_PTR
#define KindNoPointers GO_NO_POINTERS
#define kindMask GO_CODE_MASK
#ifdef __aarch64__
#define HeapBase(i) ((void*)(uintptr)(0x40ULL<<32))
#define HeapBaseOptions 1
#else
#define HeapBase(i) ((void*)(uintptr)(i<<40|0x00c0ULL<<32))
#define HeapBaseOptions 0x80
#endif

#line 56 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
MHeap runtime_mheap; 
MStats mstats; 
#line 59 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
int32 runtime_checking; 
#line 61 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
extern MStats mstats; 
#line 63 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
extern volatile intgo runtime_MemProfileRate 
__asm__ ( GOSYM_PREFIX "runtime.MemProfileRate" ) ; 
#line 66 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
static MSpan* largealloc ( uint32 , uintptr* ) ; 
static void profilealloc ( void *v , uintptr size ) ; 
static void settype ( MSpan *s , void *v , uintptr typ ) ; 
#line 74 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void* 
runtime_mallocgc ( uintptr size , uintptr typ , uint32 flag ) 
{ 
M *m; 
G *g; 
int32 sizeclass; 
uintptr tinysize , size1; 
intgo rate; 
MCache *c; 
MSpan *s; 
MLink *v , *next; 
byte *tiny; 
bool incallback; 
#line 88 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( size == 0 ) { 
#line 92 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
return &runtime_zerobase; 
} 
#line 95 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
m = runtime_m ( ) ; 
g = runtime_g ( ) ; 
#line 98 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
incallback = false; 
if ( m->mcache == nil && g->ncgo > 0 ) { 
#line 105 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_exitsyscall ( ) ; 
m = runtime_m ( ) ; 
incallback = true; 
flag |= FlagNoInvokeGC; 
} 
#line 111 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( runtime_gcwaiting ( ) && g != m->g0 && m->locks == 0 && ! ( flag & FlagNoInvokeGC ) ) { 
runtime_gosched ( ) ; 
m = runtime_m ( ) ; 
} 
if ( m->mallocing ) 
runtime_throw ( "malloc/free - deadlock" ) ; 
#line 119 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
m->locks++; 
m->mallocing = 1; 
#line 122 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( DebugTypeAtBlockEnd ) 
size += sizeof ( uintptr ) ; 
#line 125 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
c = m->mcache; 
if ( !runtime_debug.efence && size <= MaxSmallSize ) { 
if ( ( flag& ( FlagNoScan|FlagNoGC ) ) == FlagNoScan && size < TinySize ) { 
#line 158 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
tinysize = c->tinysize; 
if ( size <= tinysize ) { 
tiny = c->tiny; 
#line 162 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( ( size&7 ) == 0 ) 
tiny = ( byte* ) ROUND ( ( uintptr ) tiny , 8 ) ; 
else if ( ( size&3 ) == 0 ) 
tiny = ( byte* ) ROUND ( ( uintptr ) tiny , 4 ) ; 
else if ( ( size&1 ) == 0 ) 
tiny = ( byte* ) ROUND ( ( uintptr ) tiny , 2 ) ; 
size1 = size + ( tiny - c->tiny ) ; 
if ( size1 <= tinysize ) { 
#line 171 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
v = ( MLink* ) tiny; 
c->tiny += size1; 
c->tinysize -= size1; 
m->mallocing = 0; 
m->locks--; 
if ( incallback ) 
runtime_entersyscall ( ) ; 
return v; 
} 
} 
#line 182 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
s = c->alloc[TinySizeClass]; 
if ( s->freelist == nil ) 
s = runtime_MCache_Refill ( c , TinySizeClass ) ; 
v = s->freelist; 
next = v->next; 
s->freelist = next; 
s->ref++; 
if ( next != nil ) 
PREFETCH ( next ) ; 
( ( uint64* ) v ) [0] = 0; 
( ( uint64* ) v ) [1] = 0; 
#line 195 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( TinySize-size > tinysize ) { 
c->tiny = ( byte* ) v + size; 
c->tinysize = TinySize - size; 
} 
size = TinySize; 
goto done; 
} 
#line 204 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( size <= 1024-8 ) 
sizeclass = runtime_size_to_class8[ ( size+7 ) >>3]; 
else 
sizeclass = runtime_size_to_class128[ ( size-1024+127 ) >> 7]; 
size = runtime_class_to_size[sizeclass]; 
s = c->alloc[sizeclass]; 
if ( s->freelist == nil ) 
s = runtime_MCache_Refill ( c , sizeclass ) ; 
v = s->freelist; 
next = v->next; 
s->freelist = next; 
s->ref++; 
if ( next != nil ) 
PREFETCH ( next ) ; 
if ( ! ( flag & FlagNoZero ) ) { 
v->next = nil; 
#line 221 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( size > 2*sizeof ( uintptr ) && ( ( uintptr* ) v ) [1] != 0 ) 
runtime_memclr ( ( byte* ) v , size ) ; 
} 
done: 
c->local_cachealloc += size; 
} else { 
#line 228 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
s = largealloc ( flag , &size ) ; 
v = ( void* ) ( s->start << PageShift ) ; 
} 
#line 232 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( flag & FlagNoGC ) 
runtime_marknogc ( v ) ; 
else if ( ! ( flag & FlagNoScan ) ) 
runtime_markscan ( v ) ; 
#line 237 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( DebugTypeAtBlockEnd ) 
* ( uintptr* ) ( ( uintptr ) v+size-sizeof ( uintptr ) ) = typ; 
#line 240 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
m->mallocing = 0; 
#line 243 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( UseSpanType && ! ( flag & FlagNoScan ) && typ != 0 ) 
settype ( s , v , typ ) ; 
#line 246 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( runtime_debug.allocfreetrace ) 
runtime_tracealloc ( v , size , typ ) ; 
#line 249 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( ! ( flag & FlagNoProfiling ) && ( rate = runtime_MemProfileRate ) > 0 ) { 
if ( size < ( uintptr ) rate && size < ( uintptr ) ( uint32 ) c->next_sample ) 
c->next_sample -= size; 
else 
profilealloc ( v , size ) ; 
} 
#line 256 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
m->locks--; 
#line 258 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( ! ( flag & FlagNoInvokeGC ) && mstats.heap_alloc >= mstats.next_gc ) 
runtime_gc ( 0 ) ; 
#line 261 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( incallback ) 
runtime_entersyscall ( ) ; 
#line 264 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
return v; 
} 
#line 267 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
static MSpan* 
largealloc ( uint32 flag , uintptr *sizep ) 
{ 
uintptr npages , size; 
MSpan *s; 
void *v; 
#line 275 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
size = *sizep; 
if ( size + PageSize < size ) 
runtime_throw ( "out of memory" ) ; 
npages = size >> PageShift; 
if ( ( size & PageMask ) != 0 ) 
npages++; 
s = runtime_MHeap_Alloc ( &runtime_mheap , npages , 0 , 1 , ! ( flag & FlagNoZero ) ) ; 
if ( s == nil ) 
runtime_throw ( "out of memory" ) ; 
s->limit = ( byte* ) ( s->start<<PageShift ) + size; 
*sizep = npages<<PageShift; 
v = ( void* ) ( s->start << PageShift ) ; 
#line 288 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_markspan ( v , 0 , 0 , true ) ; 
return s; 
} 
#line 292 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
static void 
profilealloc ( void *v , uintptr size ) 
{ 
uintptr rate; 
int32 next; 
MCache *c; 
#line 299 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
c = runtime_m ( ) ->mcache; 
rate = runtime_MemProfileRate; 
if ( size < rate ) { 
#line 304 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( rate > 0x3fffffff ) 
rate = 0x3fffffff; 
next = runtime_fastrand1 ( ) % ( 2*rate ) ; 
#line 310 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
next -= ( size - c->next_sample ) ; 
if ( next < 0 ) 
next = 0; 
c->next_sample = next; 
} 
runtime_MProf_Malloc ( v , size ) ; 
} 
#line 318 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void* 
__go_alloc ( uintptr size ) 
{ 
return runtime_mallocgc ( size , 0 , FlagNoInvokeGC ) ; 
} 
#line 325 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void 
__go_free ( void *v ) 
{ 
M *m; 
int32 sizeclass; 
MSpan *s; 
MCache *c; 
uintptr size; 
#line 334 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( v == nil ) 
return; 
#line 340 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
m = runtime_m ( ) ; 
if ( m->mallocing ) 
runtime_throw ( "malloc/free - deadlock" ) ; 
m->mallocing = 1; 
#line 345 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( !runtime_mlookup ( v , nil , nil , &s ) ) { 
runtime_printf ( "free %p: not an allocated block\n" , v ) ; 
runtime_throw ( "free runtime_mlookup" ) ; 
} 
size = s->elemsize; 
sizeclass = s->sizeclass; 
#line 353 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( size < TinySize ) 
runtime_throw ( "freeing too small block" ) ; 
#line 356 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( runtime_debug.allocfreetrace ) 
runtime_tracefree ( v , size ) ; 
#line 361 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_MSpan_EnsureSwept ( s ) ; 
#line 363 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( s->specials != nil ) 
runtime_freeallspecials ( s , v , size ) ; 
#line 366 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
c = m->mcache; 
if ( sizeclass == 0 ) { 
#line 369 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
s->needzero = 1; 
#line 372 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_markfreed ( v ) ; 
runtime_unmarkspan ( v , 1<<PageShift ) ; 
#line 388 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( runtime_debug.efence ) 
runtime_SysFault ( ( void* ) ( s->start<<PageShift ) , size ) ; 
else 
runtime_MHeap_Free ( &runtime_mheap , s , 1 ) ; 
c->local_nlargefree++; 
c->local_largefree += size; 
} else { 
#line 396 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( size > 2*sizeof ( uintptr ) ) 
( ( uintptr* ) v ) [1] = ( uintptr ) 0xfeedfeedfeedfeedll; 
else if ( size > sizeof ( uintptr ) ) 
( ( uintptr* ) v ) [1] = 0; 
#line 403 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
c->local_nsmallfree[sizeclass]++; 
c->local_cachealloc -= size; 
if ( c->alloc[sizeclass] == s ) { 
#line 407 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_markfreed ( v ) ; 
( ( MLink* ) v ) ->next = s->freelist; 
s->freelist = v; 
s->ref--; 
} else { 
#line 413 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_MCache_Free ( c , v , sizeclass , size ) ; 
} 
} 
m->mallocing = 0; 
} 
#line 419 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
int32 
runtime_mlookup ( void *v , byte **base , uintptr *size , MSpan **sp ) 
{ 
M *m; 
uintptr n , i; 
byte *p; 
MSpan *s; 
#line 427 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
m = runtime_m ( ) ; 
#line 429 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
m->mcache->local_nlookup++; 
if ( sizeof ( void* ) == 4 && m->mcache->local_nlookup >= ( 1<<30 ) ) { 
#line 432 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_lock ( &runtime_mheap ) ; 
runtime_purgecachedstats ( m->mcache ) ; 
runtime_unlock ( &runtime_mheap ) ; 
} 
#line 437 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
s = runtime_MHeap_LookupMaybe ( &runtime_mheap , v ) ; 
if ( sp ) 
*sp = s; 
if ( s == nil ) { 
runtime_checkfreed ( v , 1 ) ; 
if ( base ) 
*base = nil; 
if ( size ) 
*size = 0; 
return 0; 
} 
#line 449 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p = ( byte* ) ( ( uintptr ) s->start<<PageShift ) ; 
if ( s->sizeclass == 0 ) { 
#line 452 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( base ) 
*base = p; 
if ( size ) 
*size = s->npages<<PageShift; 
return 1; 
} 
#line 459 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
n = s->elemsize; 
if ( base ) { 
i = ( ( byte* ) v - p ) /n; 
*base = p + i*n; 
} 
if ( size ) 
*size = n; 
#line 467 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
return 1; 
} 
#line 470 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void 
runtime_purgecachedstats ( MCache *c ) 
{ 
MHeap *h; 
int32 i; 
#line 477 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
h = &runtime_mheap; 
mstats.heap_alloc += c->local_cachealloc; 
c->local_cachealloc = 0; 
mstats.nlookup += c->local_nlookup; 
c->local_nlookup = 0; 
h->largefree += c->local_largefree; 
c->local_largefree = 0; 
h->nlargefree += c->local_nlargefree; 
c->local_nlargefree = 0; 
for ( i=0; i< ( int32 ) nelem ( c->local_nsmallfree ) ; i++ ) { 
h->nsmallfree[i] += c->local_nsmallfree[i]; 
c->local_nsmallfree[i] = 0; 
} 
} 
#line 492 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
extern uintptr runtime_sizeof_C_MStats 
__asm__ ( GOSYM_PREFIX "runtime.Sizeof_C_MStats" ) ; 
#line 501 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
#define MaxArena32 ( 2U<<30 ) 
#line 503 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void 
runtime_mallocinit ( void ) 
{ 
byte *p , *p1; 
uintptr arena_size , bitmap_size , spans_size , p_size; 
extern byte _end[]; 
uintptr limit; 
uint64 i; 
bool reserved; 
#line 513 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_sizeof_C_MStats = sizeof ( MStats ) - ( NumSizeClasses - 61 ) * sizeof ( mstats.by_size[0] ) ; 
#line 515 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p = nil; 
p_size = 0; 
arena_size = 0; 
bitmap_size = 0; 
spans_size = 0; 
reserved = false; 
#line 523 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
USED ( p ) ; 
USED ( p_size ) ; 
USED ( arena_size ) ; 
USED ( bitmap_size ) ; 
USED ( spans_size ) ; 
#line 529 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_InitSizes ( ) ; 
#line 531 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( runtime_class_to_size[TinySizeClass] != TinySize ) 
runtime_throw ( "bad TinySizeClass" ) ; 
#line 537 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
limit = 0; 
#line 542 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( sizeof ( void* ) == 8 && ( limit == 0 || limit > ( 1<<30 ) ) ) { 
#line 567 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
arena_size = MaxMem; 
bitmap_size = arena_size / ( sizeof ( void* ) *8/4 ) ; 
spans_size = arena_size / PageSize * sizeof ( runtime_mheap.spans[0] ) ; 
spans_size = ROUND ( spans_size , PageSize ) ; 
for ( i = 0; i < HeapBaseOptions; i++ ) { 
p = HeapBase ( i ) ; 
p_size = bitmap_size + spans_size + arena_size + PageSize; 
p = runtime_SysReserve ( p , p_size , &reserved ) ; 
if ( p != nil ) 
break; 
} 
} 
if ( p == nil ) { 
#line 597 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
bitmap_size = MaxArena32 / ( sizeof ( void* ) *8/4 ) ; 
arena_size = 512<<20; 
spans_size = MaxArena32 / PageSize * sizeof ( runtime_mheap.spans[0] ) ; 
if ( limit > 0 && arena_size+bitmap_size+spans_size > limit ) { 
bitmap_size = ( limit / 9 ) & ~ ( ( 1<<PageShift ) - 1 ) ; 
arena_size = bitmap_size * 8; 
spans_size = arena_size / PageSize * sizeof ( runtime_mheap.spans[0] ) ; 
} 
spans_size = ROUND ( spans_size , PageSize ) ; 
#line 616 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p = ( byte* ) ROUND ( ( uintptr ) _end + ( 1<<18 ) , 1<<20 ) ; 
p_size = bitmap_size + spans_size + arena_size + PageSize; 
p = runtime_SysReserve ( p , p_size , &reserved ) ; 
if ( p == nil ) 
runtime_throw ( "runtime: cannot reserve arena virtual address space" ) ; 
} 
#line 626 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p1 = ( byte* ) ROUND ( ( uintptr ) p , PageSize ) ; 
#line 628 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_mheap.spans = ( MSpan** ) p1; 
runtime_mheap.bitmap = p1 + spans_size; 
runtime_mheap.arena_start = p1 + spans_size + bitmap_size; 
runtime_mheap.arena_used = runtime_mheap.arena_start; 
runtime_mheap.arena_end = p + p_size; 
runtime_mheap.arena_reserved = reserved; 
#line 635 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( ( ( uintptr ) runtime_mheap.arena_start & ( PageSize-1 ) ) != 0 ) 
runtime_throw ( "misrounded allocation in mallocinit" ) ; 
#line 639 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_MHeap_Init ( &runtime_mheap ) ; 
runtime_m ( ) ->mcache = runtime_allocmcache ( ) ; 
#line 643 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_free ( runtime_malloc ( TinySize ) ) ; 
} 
#line 646 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void* 
runtime_MHeap_SysAlloc ( MHeap *h , uintptr n ) 
{ 
byte *p , *p_end; 
uintptr p_size; 
bool reserved; 
#line 654 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( n > ( uintptr ) ( h->arena_end - h->arena_used ) ) { 
#line 657 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
byte *new_end; 
#line 659 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p_size = ROUND ( n + PageSize , 256<<20 ) ; 
new_end = h->arena_end + p_size; 
if ( new_end <= h->arena_start + MaxArena32 ) { 
#line 664 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p = runtime_SysReserve ( h->arena_end , p_size , &reserved ) ; 
if ( p == h->arena_end ) { 
h->arena_end = new_end; 
h->arena_reserved = reserved; 
} 
else if ( p+p_size <= h->arena_start + MaxArena32 ) { 
#line 672 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
h->arena_end = p+p_size; 
h->arena_used = p + ( - ( uintptr ) p& ( PageSize-1 ) ) ; 
h->arena_reserved = reserved; 
} else { 
uint64 stat; 
stat = 0; 
runtime_SysFree ( p , p_size , &stat ) ; 
} 
} 
} 
if ( n <= ( uintptr ) ( h->arena_end - h->arena_used ) ) { 
#line 684 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p = h->arena_used; 
runtime_SysMap ( p , n , h->arena_reserved , &mstats.heap_sys ) ; 
h->arena_used += n; 
runtime_MHeap_MapBits ( h ) ; 
runtime_MHeap_MapSpans ( h ) ; 
#line 690 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( ( ( uintptr ) p & ( PageSize-1 ) ) != 0 ) 
runtime_throw ( "misrounded allocation in MHeap_SysAlloc" ) ; 
return p; 
} 
#line 696 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( ( uintptr ) ( h->arena_end - h->arena_start ) >= MaxArena32 ) 
return nil; 
#line 702 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p_size = ROUND ( n , PageSize ) + PageSize; 
p = runtime_SysAlloc ( p_size , &mstats.heap_sys ) ; 
if ( p == nil ) 
return nil; 
#line 707 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( p < h->arena_start || ( uintptr ) ( p+p_size - h->arena_start ) >= MaxArena32 ) { 
runtime_printf ( "runtime: memory allocated by OS (%p) not in usable range [%p,%p)\n" , 
p , h->arena_start , h->arena_start+MaxArena32 ) ; 
runtime_SysFree ( p , p_size , &mstats.heap_sys ) ; 
return nil; 
} 
#line 714 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
p_end = p + p_size; 
p += - ( uintptr ) p & ( PageSize-1 ) ; 
if ( p+n > h->arena_used ) { 
h->arena_used = p+n; 
if ( p_end > h->arena_end ) 
h->arena_end = p_end; 
runtime_MHeap_MapBits ( h ) ; 
runtime_MHeap_MapSpans ( h ) ; 
} 
#line 724 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( ( ( uintptr ) p & ( PageSize-1 ) ) != 0 ) 
runtime_throw ( "misrounded allocation in MHeap_SysAlloc" ) ; 
return p; 
} 
#line 729 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
static struct 
{ 
Lock; 
byte* pos; 
byte* end; 
} persistent; 
#line 736 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
enum 
{ 
PersistentAllocChunk = 256<<10 , 
PersistentAllocMaxBlock = 64<<10 , 
} ; 
#line 746 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void* 
runtime_persistentalloc ( uintptr size , uintptr align , uint64 *stat ) 
{ 
byte *p; 
#line 751 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( align != 0 ) { 
if ( align& ( align-1 ) ) 
runtime_throw ( "persistentalloc: align is not a power of 2" ) ; 
if ( align > PageSize ) 
runtime_throw ( "persistentalloc: align is too large" ) ; 
} else 
align = 8; 
if ( size >= PersistentAllocMaxBlock ) 
return runtime_SysAlloc ( size , stat ) ; 
runtime_lock ( &persistent ) ; 
persistent.pos = ( byte* ) ROUND ( ( uintptr ) persistent.pos , align ) ; 
if ( persistent.pos + size > persistent.end ) { 
persistent.pos = runtime_SysAlloc ( PersistentAllocChunk , &mstats.other_sys ) ; 
if ( persistent.pos == nil ) { 
runtime_unlock ( &persistent ) ; 
runtime_throw ( "runtime: cannot allocate memory" ) ; 
} 
persistent.end = persistent.pos + PersistentAllocChunk; 
} 
p = persistent.pos; 
persistent.pos += size; 
runtime_unlock ( &persistent ) ; 
if ( stat != &mstats.other_sys ) { 
#line 775 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
runtime_xadd64 ( stat , size ) ; 
runtime_xadd64 ( &mstats.other_sys , - ( uint64 ) size ) ; 
} 
return p; 
} 
#line 781 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
static void 
settype ( MSpan *s , void *v , uintptr typ ) 
{ 
uintptr size , ofs , j , t; 
uintptr ntypes , nbytes2 , nbytes3; 
uintptr *data2; 
byte *data3; 
#line 789 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
if ( s->sizeclass == 0 ) { 
s->types.compression = MTypes_Single; 
s->types.data = typ; 
return; 
} 
size = s->elemsize; 
ofs = ( ( uintptr ) v - ( s->start<<PageShift ) ) / size; 
#line 797 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
switch ( s->types.compression ) { 
case MTypes_Empty: 
ntypes = ( s->npages << PageShift ) / size; 
nbytes3 = 8*sizeof ( uintptr ) + 1*ntypes; 
data3 = runtime_mallocgc ( nbytes3 , 0 , FlagNoProfiling|FlagNoScan|FlagNoInvokeGC ) ; 
s->types.compression = MTypes_Bytes; 
s->types.data = ( uintptr ) data3; 
( ( uintptr* ) data3 ) [1] = typ; 
data3[8*sizeof ( uintptr ) + ofs] = 1; 
break; 
#line 808 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
case MTypes_Words: 
( ( uintptr* ) s->types.data ) [ofs] = typ; 
break; 
#line 812 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
case MTypes_Bytes: 
data3 = ( byte* ) s->types.data; 
for ( j=1; j<8; j++ ) { 
if ( ( ( uintptr* ) data3 ) [j] == typ ) { 
break; 
} 
if ( ( ( uintptr* ) data3 ) [j] == 0 ) { 
( ( uintptr* ) data3 ) [j] = typ; 
break; 
} 
} 
if ( j < 8 ) { 
data3[8*sizeof ( uintptr ) + ofs] = j; 
} else { 
ntypes = ( s->npages << PageShift ) / size; 
nbytes2 = ntypes * sizeof ( uintptr ) ; 
data2 = runtime_mallocgc ( nbytes2 , 0 , FlagNoProfiling|FlagNoScan|FlagNoInvokeGC ) ; 
s->types.compression = MTypes_Words; 
s->types.data = ( uintptr ) data2; 
#line 833 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
for ( j=0; j<ntypes; j++ ) { 
t = data3[8*sizeof ( uintptr ) + j]; 
t = ( ( uintptr* ) data3 ) [t]; 
data2[j] = t; 
} 
data2[ofs] = typ; 
} 
break; 
} 
} 
#line 844 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
uintptr 
runtime_gettype ( void *v ) 
{ 
MSpan *s; 
uintptr t , ofs; 
byte *data; 
#line 851 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
s = runtime_MHeap_LookupMaybe ( &runtime_mheap , v ) ; 
if ( s != nil ) { 
t = 0; 
switch ( s->types.compression ) { 
case MTypes_Empty: 
break; 
case MTypes_Single: 
t = s->types.data; 
break; 
case MTypes_Words: 
ofs = ( uintptr ) v - ( s->start<<PageShift ) ; 
t = ( ( uintptr* ) s->types.data ) [ofs/s->elemsize]; 
break; 
case MTypes_Bytes: 
ofs = ( uintptr ) v - ( s->start<<PageShift ) ; 
data = ( byte* ) s->types.data; 
t = data[8*sizeof ( uintptr ) + ofs/s->elemsize]; 
t = ( ( uintptr* ) data ) [t]; 
break; 
default: 
runtime_throw ( "runtime_gettype: invalid compression kind" ) ; 
} 
if ( 0 ) { 
runtime_printf ( "%p -> %d,%X\n" , v , ( int32 ) s->types.compression , ( int64 ) t ) ; 
} 
return t; 
} 
return 0; 
} 
#line 883 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void* 
runtime_mal ( uintptr n ) 
{ 
return runtime_mallocgc ( n , 0 , 0 ) ; 
} 
uint8* runtime_new(Type* typ) __asm__ (GOSYM_PREFIX "runtime.new");
uint8* runtime_new(Type* typ)
{
  uint8* ret;
#line 889 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"

	ret = runtime_mallocgc(typ->__size, (uintptr)typ | TypeInfo_SingleObject, typ->kind&KindNoPointers ? FlagNoScan : 0);
return ret;
}

#line 893 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
static void* 
cnew ( const Type *typ , intgo n , int32 objtyp ) 
{ 
if ( ( objtyp& ( PtrSize-1 ) ) != objtyp ) 
runtime_throw ( "runtime: invalid objtyp" ) ; 
if ( n < 0 || ( typ->__size > 0 && ( uintptr ) n > ( MaxMem/typ->__size ) ) ) 
runtime_panicstring ( "runtime: allocation size out of range" ) ; 
return runtime_mallocgc ( typ->__size*n , ( uintptr ) typ | objtyp , typ->kind&KindNoPointers ? FlagNoScan : 0 ) ; 
} 
#line 904 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void* 
runtime_cnew ( const Type *typ ) 
{ 
return cnew ( typ , 1 , TypeInfo_SingleObject ) ; 
} 
#line 910 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"
void* 
runtime_cnewarray ( const Type *typ , intgo n ) 
{ 
return cnew ( typ , n , TypeInfo_Array ) ; 
} 
void runtime_GC() __asm__ (GOSYM_PREFIX "runtime.GC");
void runtime_GC()
{
#line 916 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"

	runtime_gc(2);  // force GC and do eager sweep
}
void runtime_SetFinalizer(Eface obj, Eface finalizer) __asm__ (GOSYM_PREFIX "runtime.SetFinalizer");
void runtime_SetFinalizer(Eface obj, Eface finalizer)
{
#line 920 "../../../gcc-5.1.0/libgo/runtime/malloc.goc"

	byte *base;
	uintptr size;
	const FuncType *ft;
	const Type *fint;
	const PtrType *ot;

	if(obj.__type_descriptor == nil) {
		runtime_printf("runtime.SetFinalizer: first argument is nil interface\n");
		goto throw;
	}
	if((obj.__type_descriptor->kind&kindMask) != GO_PTR) {
		runtime_printf("runtime.SetFinalizer: first argument is %S, not pointer\n", *obj.__type_descriptor->__reflection);
		goto throw;
	}
	ot = (const PtrType*)obj.type;
	// As an implementation detail we do not run finalizers for zero-sized objects,
	// because we use &runtime_zerobase for all such allocations.
	if(ot->__element_type != nil && ot->__element_type->__size == 0)
		return;
	// The following check is required for cases when a user passes a pointer to composite literal,
	// but compiler makes it a pointer to global. For example:
	//	var Foo = &Object{}
	//	func main() {
	//		runtime.SetFinalizer(Foo, nil)
	//	}
	// See issue 7656.
	if((byte*)obj.__object < runtime_mheap.arena_start || runtime_mheap.arena_used <= (byte*)obj.__object)
		return;
	if(!runtime_mlookup(obj.__object, &base, &size, nil) || obj.__object != base) {
		// As an implementation detail we allow to set finalizers for an inner byte
		// of an object if it could come from tiny alloc (see mallocgc for details).
		if(ot->__element_type == nil || (ot->__element_type->kind&KindNoPointers) == 0 || ot->__element_type->__size >= TinySize) {
			runtime_printf("runtime.SetFinalizer: pointer not at beginning of allocated block (%p)\n", obj.__object);
			goto throw;
		}
	}
	if(finalizer.__type_descriptor != nil) {
		runtime_createfing();
		if((finalizer.__type_descriptor->kind&kindMask) != GO_FUNC)
			goto badfunc;
		ft = (const FuncType*)finalizer.__type_descriptor;
		if(ft->__dotdotdot || ft->__in.__count != 1)
			goto badfunc;
		fint = *(Type**)ft->__in.__values;
		if(__go_type_descriptors_equal(fint, obj.__type_descriptor)) {
			// ok - same type
		} else if((fint->kind&kindMask) == GO_PTR && (fint->__uncommon == nil || fint->__uncommon->__name == nil || obj.type->__uncommon == nil || obj.type->__uncommon->__name == nil) && __go_type_descriptors_equal(((const PtrType*)fint)->__element_type, ((const PtrType*)obj.type)->__element_type)) {
			// ok - not same type, but both pointers,
			// one or the other is unnamed, and same element type, so assignable.
		} else if((fint->kind&kindMask) == GO_INTERFACE && ((const InterfaceType*)fint)->__methods.__count == 0) {
			// ok - satisfies empty interface
		} else if((fint->kind&kindMask) == GO_INTERFACE && __go_convert_interface_2(fint, obj.__type_descriptor, 1) != nil) {
			// ok - satisfies non-empty interface
		} else
			goto badfunc;

		ot = (const PtrType*)obj.__type_descriptor;
		if(!runtime_addfinalizer(obj.__object, *(FuncVal**)finalizer.__object, ft, ot)) {
			runtime_printf("runtime.SetFinalizer: finalizer already set\n");
			goto throw;
		}
	} else {
		// NOTE: asking to remove a finalizer when there currently isn't one set is OK.
		runtime_removefinalizer(obj.__object);
	}
	return;

badfunc:
	runtime_printf("runtime.SetFinalizer: cannot pass %S to finalizer %S\n", *obj.__type_descriptor->__reflection, *finalizer.__type_descriptor->__reflection);
throw:
	runtime_throw("runtime.SetFinalizer");
}
