static s4 dseg_add_double_intern(codegendata *cd, double value, u4 flags) { dsegentry *de; /* Increase data segment size, which is also the displacement into the data segment. */ cd->dseglen = MEMORY_ALIGN(cd->dseglen + 8, 8); /* allocate new entry */ de = DNEW(dsegentry); de->type = TYPE_DBL; de->flags = flags; de->disp = -(cd->dseglen); de->val.d = value; de->next = cd->dseg; /* insert into the chain */ cd->dseg = de; return de->disp; }
static s4 dseg_add_address_intern(codegendata *cd, void *value, u4 flags) { dsegentry *de; /* Increase data segment size, which is also the displacement into the data segment. */ #if SIZEOF_VOID_P == 8 cd->dseglen = MEMORY_ALIGN(cd->dseglen + 8, 8); #else cd->dseglen += 4; #endif /* allocate new entry */ de = DNEW(dsegentry); de->type = TYPE_ADR; de->flags = flags; de->disp = -(cd->dseglen); de->val.a = value; de->next = cd->dseg; /* insert into the chain */ cd->dseg = de; return de->disp; }
void gc_init(u4 heapmaxsize, u4 heapstartsize) { heapmaxsize = MEMORY_ALIGN(heapmaxsize, ALIGNSIZE); #if defined(HAVE_MMAP) mmapptr = mmap((void *) MMAP_HEAPADDRESS, (size_t) heapmaxsize, PROT_READ | PROT_WRITE, MAP_PRIVATE | # if defined(MAP_ANONYMOUS) MAP_ANONYMOUS, # elif defined(MAP_ANON) MAP_ANON, # else 0, # endif -1, (off_t) 0); if (mmapptr == MAP_FAILED) vm_abort("gc_init: out of memory"); #else mmapptr = malloc(heapmaxsize); if (!mmapptr) vm_abort("heap_allocate: out of memory"); #endif mmapsize = heapmaxsize; mmaptop = (void *) ((ptrint) mmapptr + mmapsize); }
static size_t aligned_datasize(size_t objsize) { if (objsize < MEMORY_POOL_DATA_MIN_SIZE) { objsize = MEMORY_POOL_DATA_MIN_SIZE; } return MEMORY_ALIGN(objsize); }
static void jcode_align_bytecode_index(jcode_t *jc, s4 align) { s4 idx, aidx; idx = jc->offset + (jc->pos - jc->start); aidx = MEMORY_ALIGN(idx, align); jc->pos += (aidx - idx); }
static void addoutputsize (int len) { u4 newsize,i; if (!dopadding) return; newsize = MEMORY_ALIGN(outputsize, len); for (i = outputsize; i < newsize; i++) fprintf(file, " u1 pad%d\n", (int) i); outputsize = newsize; }
void *heap_allocate(u4 size, bool references, methodinfo *finalizer) { void *m; mmapptr = (void *) MEMORY_ALIGN((ptrint) mmapptr, ALIGNSIZE); m = mmapptr; mmapptr = (void *) ((ptrint) mmapptr + size); if (mmapptr > mmaptop) vm_abort("heap_allocate: out of memory"); MSET(m, 0, u1, size); return m; }
static size_t aligned_pagesize(size_t objsize, int page_n_obj) { size_t pagesize = MEMORY_POOL_DATA_MIN_SIZE + objsize * page_n_obj; return MEMORY_ALIGN(pagesize); }