uintptr_t makemap (const struct __go_map_type *t) { struct __go_map_descriptor *md; unsigned int o; const struct __go_type_descriptor *kt; const struct __go_type_descriptor *vt; struct __go_map* map; void *ret; /* FIXME: Reference count. */ md = (struct __go_map_descriptor *) __go_alloc (sizeof (*md)); md->__map_descriptor = t; o = sizeof (void *); kt = t->__key_type; o = (o + kt->__field_align - 1) & ~ (kt->__field_align - 1); md->__key_offset = o; o += kt->__size; vt = t->__val_type; o = (o + vt->__field_align - 1) & ~ (vt->__field_align - 1); md->__val_offset = o; o += vt->__size; o = (o + sizeof (void *) - 1) & ~ (sizeof (void *) - 1); o = (o + kt->__field_align - 1) & ~ (kt->__field_align - 1); o = (o + vt->__field_align - 1) & ~ (vt->__field_align - 1); md->__entry_size = o; map = __go_new_map (md, 0); ret = __go_alloc (sizeof (void *)); __builtin_memcpy (ret, &map, sizeof (void *)); return (uintptr_t) ret; }
struct __go_map * __go_new_map_big (const struct __go_map_descriptor *descriptor, uint64_t entries) { uintptr_t sentries; sentries = (uintptr_t) entries; if ((uint64_t) sentries != entries) runtime_panicstring ("map size out of range"); return __go_new_map (descriptor, sentries); }
struct __go_map * __go_construct_map (const struct __go_map_descriptor *descriptor, size_t count, size_t entry_size, size_t val_offset, size_t val_size, const void *ventries) { struct __go_map *ret; const unsigned char *entries; size_t i; ret = __go_new_map (descriptor, count); entries = (const unsigned char *) ventries; for (i = 0; i < count; ++i) { void *val = __go_map_index (ret, entries, 1); __builtin_memcpy (val, entries + val_offset, val_size); entries += entry_size; } return ret; }