summaryrefslogtreecommitdiffstats
path: root/src/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/iwasm/fast-jit/jit_codecache.c
blob: 73a034f3497b97c298a8116d3b0d62cc1aec92d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
 * Copyright (C) 2021 Intel Corporation.  All rights reserved.
 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 */

#include "jit_codecache.h"
#include "mem_alloc.h"
#include "jit_compiler.h"

static void *code_cache_pool = NULL;
static uint32 code_cache_pool_size = 0;
static mem_allocator_t code_cache_pool_allocator = NULL;

bool
jit_code_cache_init(uint32 code_cache_size)
{
    int map_prot = MMAP_PROT_READ | MMAP_PROT_WRITE | MMAP_PROT_EXEC;
    int map_flags = MMAP_MAP_NONE;

    if (!(code_cache_pool =
              os_mmap(NULL, code_cache_size, map_prot, map_flags))) {
        return false;
    }

    if (!(code_cache_pool_allocator =
              mem_allocator_create(code_cache_pool, code_cache_size))) {
        os_munmap(code_cache_pool, code_cache_size);
        code_cache_pool = NULL;
        return false;
    }

    code_cache_pool_size = code_cache_size;
    return true;
}

void
jit_code_cache_destroy()
{
    mem_allocator_destroy(code_cache_pool_allocator);
    os_munmap(code_cache_pool, code_cache_pool_size);
}

void *
jit_code_cache_alloc(uint32 size)
{
    return mem_allocator_malloc(code_cache_pool_allocator, size);
}

void
jit_code_cache_free(void *ptr)
{
    if (ptr)
        mem_allocator_free(code_cache_pool_allocator, ptr);
}

bool
jit_pass_register_jitted_code(JitCompContext *cc)
{
    WASMModuleInstance *instance;
    WASMModule *module = cc->cur_wasm_module;
    WASMFunction *func = cc->cur_wasm_func;
    uint32 jit_func_idx = cc->cur_wasm_func_idx - module->import_function_count;

#if WASM_ENABLE_FAST_JIT != 0 && WASM_ENABLE_JIT != 0 \
    && WASM_ENABLE_LAZY_JIT != 0
    os_mutex_lock(&module->instance_list_lock);
#endif

    module->fast_jit_func_ptrs[jit_func_idx] = func->fast_jit_jitted_code =
        cc->jitted_addr_begin;

#if WASM_ENABLE_FAST_JIT != 0 && WASM_ENABLE_JIT != 0 \
    && WASM_ENABLE_LAZY_JIT != 0
    instance = module->instance_list;
    while (instance) {
        if (instance->e->running_mode == Mode_Fast_JIT)
            instance->fast_jit_func_ptrs[jit_func_idx] = cc->jitted_addr_begin;
        instance = instance->e->next;
    }

    os_mutex_unlock(&module->instance_list_lock);
#else
    (void)instance;
#endif
    return true;
}