Skip to content

Commit

Permalink
Optimize memory initialization handling in AOT loader
Browse files Browse the repository at this point in the history
Save memory if the file buffer is always exist before exit.

Signed-off-by: Huang Qi <[email protected]>
  • Loading branch information
no1wudi committed Dec 24, 2024
1 parent 8ac0649 commit e81129f
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 9 deletions.
28 changes: 21 additions & 7 deletions core/iwasm/aot/aot_loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -968,12 +968,16 @@ destroy_import_memories(AOTImportMemory *import_memories)
}

static void
destroy_mem_init_data_list(AOTMemInitData **data_list, uint32 count)
destroy_mem_init_data_list(AOTModule *module, AOTMemInitData **data_list,
uint32 count)
{
uint32 i;
for (i = 0; i < count; i++)
if (data_list[i])
if (data_list[i]) {
if (module->is_binary_freeable && data_list[i]->bytes)
wasm_runtime_free(data_list[i]->bytes);
wasm_runtime_free(data_list[i]);
}
wasm_runtime_free(data_list);
}

Expand Down Expand Up @@ -1013,8 +1017,8 @@ load_mem_init_data_list(const uint8 **p_buf, const uint8 *buf_end,
return false;
}
read_uint32(buf, buf_end, byte_count);
size = offsetof(AOTMemInitData, bytes) + (uint64)byte_count;
if (!(data_list[i] = loader_malloc(size, error_buf, error_buf_size))) {
if (!(data_list[i] = loader_malloc(sizeof(AOTMemInitData), error_buf,
error_buf_size))) {
return false;
}

Expand All @@ -1026,8 +1030,18 @@ load_mem_init_data_list(const uint8 **p_buf, const uint8 *buf_end,
data_list[i]->offset.init_expr_type = init_value.init_expr_type;
data_list[i]->offset.u = init_value.u;
data_list[i]->byte_count = byte_count;
read_byte_array(buf, buf_end, data_list[i]->bytes,
data_list[i]->byte_count);
if (module->is_binary_freeable) {
if (!(data_list[i]->bytes =
loader_malloc(byte_count, error_buf, error_buf_size))) {
return false;
}
read_byte_array(buf, buf_end, data_list[i]->bytes,
data_list[i]->byte_count);
}
else {
data_list[i]->bytes = (uint8 *)buf;
buf += byte_count;
}
}

*p_buf = buf;
Expand Down Expand Up @@ -4356,7 +4370,7 @@ aot_unload(AOTModule *module)
wasm_runtime_free(module->memories);

if (module->mem_init_data_list)
destroy_mem_init_data_list(module->mem_init_data_list,
destroy_mem_init_data_list(module, module->mem_init_data_list,
module->mem_init_data_count);

if (module->native_symbol_list)
Expand Down
10 changes: 9 additions & 1 deletion core/iwasm/compilation/aot.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,11 @@ aot_destroy_mem_init_data_list(AOTMemInitData **data_list, uint32 count)
{
uint32 i;
for (i = 0; i < count; i++)
if (data_list[i])
if (data_list[i]) {
if (data_list[i]->bytes)
wasm_runtime_free(data_list[i]->bytes);
wasm_runtime_free(data_list[i]);
}
wasm_runtime_free(data_list);
}

Expand Down Expand Up @@ -74,6 +77,11 @@ aot_create_mem_init_data_list(const WASMModule *module)
#endif
data_list[i]->offset = module->data_segments[i]->base_offset;
data_list[i]->byte_count = module->data_segments[i]->data_length;
data_list[i]->bytes = wasm_runtime_malloc(data_list[i]->byte_count);
if (!data_list[i]->bytes) {
aot_set_last_error("allocate memory failed.");
goto fail;
}
memcpy(data_list[i]->bytes, module->data_segments[i]->data,
module->data_segments[i]->data_length);
}
Expand Down
2 changes: 1 addition & 1 deletion core/iwasm/compilation/aot.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ typedef struct AOTMemInitData {
/* Byte count */
uint32 byte_count;
/* Byte array */
uint8 bytes[1];
uint8 *bytes;
} AOTMemInitData;

/**
Expand Down

0 comments on commit e81129f

Please sign in to comment.