aot_runtime.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #ifndef _AOT_RUNTIME_H_
  6. #define _AOT_RUNTIME_H_
  7. #include "bh_platform.h"
  8. #include "../common/wasm_runtime_common.h"
  9. #include "../interpreter/wasm_runtime.h"
  10. #include "../compilation/aot.h"
  11. #if WASM_ENABLE_GC != 0
  12. #include "gc_export.h"
  13. #endif
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. /* Wasm feature supported, mainly used by AOTTargetInfo now */
  18. #define WASM_FEATURE_SIMD_128BIT (1 << 0)
  19. #define WASM_FEATURE_BULK_MEMORY (1 << 1)
  20. #define WASM_FEATURE_MULTI_THREAD (1 << 2)
  21. #define WASM_FEATURE_REF_TYPES (1 << 3)
  22. #define WASM_FEATURE_GARBAGE_COLLECTION (1 << 4)
  23. #define WASM_FEATURE_EXCEPTION_HANDLING (1 << 5)
  24. #define WASM_FEATURE_TINY_STACK_FRAME (1 << 6)
  25. #define WASM_FEATURE_MULTI_MEMORY (1 << 7)
  26. #define WASM_FEATURE_DYNAMIC_LINKING (1 << 8)
  27. #define WASM_FEATURE_COMPONENT_MODEL (1 << 9)
  28. #define WASM_FEATURE_RELAXED_SIMD (1 << 10)
  29. #define WASM_FEATURE_FLEXIBLE_VECTORS (1 << 11)
  30. /* Stack frame is created at the beginning of the function,
  31. * and not at the beginning of each function call */
  32. #define WASM_FEATURE_FRAME_PER_FUNCTION (1 << 12)
  33. #define WASM_FEATURE_FRAME_NO_FUNC_IDX (1 << 13)
  34. typedef enum AOTSectionType {
  35. AOT_SECTION_TYPE_TARGET_INFO = 0,
  36. AOT_SECTION_TYPE_INIT_DATA = 1,
  37. AOT_SECTION_TYPE_TEXT = 2,
  38. AOT_SECTION_TYPE_FUNCTION = 3,
  39. AOT_SECTION_TYPE_EXPORT = 4,
  40. AOT_SECTION_TYPE_RELOCATION = 5,
  41. /*
  42. * Note: We haven't had anything to use AOT_SECTION_TYPE_SIGNATURE.
  43. * It's just reserved for possible module signing features.
  44. */
  45. AOT_SECTION_TYPE_SIGNATURE = 6,
  46. AOT_SECTION_TYPE_CUSTOM = 100,
  47. } AOTSectionType;
  48. typedef enum AOTCustomSectionType {
  49. AOT_CUSTOM_SECTION_RAW = 0,
  50. AOT_CUSTOM_SECTION_NATIVE_SYMBOL = 1,
  51. AOT_CUSTOM_SECTION_ACCESS_CONTROL = 2,
  52. AOT_CUSTOM_SECTION_NAME = 3,
  53. AOT_CUSTOM_SECTION_STRING_LITERAL = 4,
  54. } AOTCustomSectionType;
  55. typedef struct AOTObjectDataSection {
  56. char *name;
  57. uint8 *data;
  58. uint32 size;
  59. #if WASM_ENABLE_WAMR_COMPILER != 0 || WASM_ENABLE_JIT != 0
  60. bool is_name_allocated;
  61. bool is_data_allocated;
  62. #endif
  63. } AOTObjectDataSection;
  64. /* Relocation info */
  65. typedef struct AOTRelocation {
  66. uint64 relocation_offset;
  67. int64 relocation_addend;
  68. uint32 relocation_type;
  69. char *symbol_name;
  70. /* index in the symbol offset field */
  71. uint32 symbol_index;
  72. #if WASM_ENABLE_WAMR_COMPILER != 0 || WASM_ENABLE_JIT != 0
  73. bool is_symbol_name_allocated;
  74. #endif
  75. } AOTRelocation;
  76. /* Relocation Group */
  77. typedef struct AOTRelocationGroup {
  78. char *section_name;
  79. /* index in the symbol offset field */
  80. uint32 name_index;
  81. uint32 relocation_count;
  82. AOTRelocation *relocations;
  83. #if WASM_ENABLE_WAMR_COMPILER != 0 || WASM_ENABLE_JIT != 0
  84. bool is_section_name_allocated;
  85. #endif
  86. } AOTRelocationGroup;
  87. /* AOT function instance */
  88. typedef struct AOTFunctionInstance {
  89. char *func_name;
  90. uint32 func_index;
  91. bool is_import_func;
  92. union {
  93. struct {
  94. AOTFuncType *func_type;
  95. /* function pointer linked */
  96. void *func_ptr;
  97. } func;
  98. AOTImportFunc *func_import;
  99. } u;
  100. } AOTFunctionInstance;
  101. /* Map of a function index to the element ith in
  102. the export functions array */
  103. typedef struct ExportFuncMap {
  104. uint32 func_idx;
  105. uint32 export_idx;
  106. } ExportFuncMap;
  107. typedef struct AOTModuleInstanceExtra {
  108. DefPointer(const uint32 *, stack_sizes);
  109. /*
  110. * Adjusted shared heap based addr to simple the calculation
  111. * in the aot code. The value is:
  112. * shared_heap->base_addr - shared_heap->start_off
  113. */
  114. DefPointer(uint8 *, shared_heap_base_addr_adj);
  115. MemBound shared_heap_start_off;
  116. MemBound shared_heap_end_off;
  117. DefPointer(WASMSharedHeap *, shared_heap);
  118. WASMModuleInstanceExtraCommon common;
  119. /**
  120. * maps of func indexes to export func indexes, which
  121. * is sorted by func index for a quick lookup and is
  122. * created only when first time used.
  123. */
  124. ExportFuncMap *export_func_maps;
  125. AOTFunctionInstance **functions;
  126. uint32 function_count;
  127. #if WASM_ENABLE_MULTI_MODULE != 0
  128. bh_list sub_module_inst_list_head;
  129. bh_list *sub_module_inst_list;
  130. WASMModuleInstanceCommon **import_func_module_insts;
  131. #endif
  132. } AOTModuleInstanceExtra;
  133. #if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
  134. typedef struct GOTItem {
  135. uint32 func_idx;
  136. struct GOTItem *next;
  137. } GOTItem, *GOTItemList;
  138. #endif
  139. #if WASM_ENABLE_GC != 0
  140. typedef struct LocalRefFlag {
  141. uint32 local_ref_flag_cell_num;
  142. uint8 *local_ref_flags;
  143. } LocalRefFlag;
  144. #endif
  145. typedef struct AOTModule {
  146. uint32 module_type;
  147. /* the package version read from the AOT file */
  148. uint32 package_version;
  149. /* import memories */
  150. uint32 import_memory_count;
  151. AOTImportMemory *import_memories;
  152. /* memory info */
  153. uint32 memory_count;
  154. AOTMemory *memories;
  155. /* init data */
  156. uint32 mem_init_data_count;
  157. AOTMemInitData **mem_init_data_list;
  158. /* native symbol */
  159. void **native_symbol_list;
  160. /* import tables */
  161. uint32 import_table_count;
  162. AOTImportTable *import_tables;
  163. /* tables */
  164. uint32 table_count;
  165. AOTTable *tables;
  166. /* table init data info */
  167. uint32 table_init_data_count;
  168. AOTTableInitData **table_init_data_list;
  169. /* type info */
  170. uint32 type_count;
  171. AOTType **types;
  172. /* import global variable info */
  173. uint32 import_global_count;
  174. AOTImportGlobal *import_globals;
  175. /* global variable info */
  176. uint32 global_count;
  177. AOTGlobal *globals;
  178. /* total global variable size */
  179. uint32 global_data_size;
  180. /* import function info */
  181. uint32 import_func_count;
  182. AOTImportFunc *import_funcs;
  183. /* function info */
  184. uint32 func_count;
  185. /* func pointers of AOTed (un-imported) functions */
  186. void **func_ptrs;
  187. /* func type indexes of AOTed (un-imported) functions */
  188. uint32 *func_type_indexes;
  189. #if WASM_ENABLE_AOT_STACK_FRAME != 0
  190. /* max local cell nums of AOTed (un-imported) functions */
  191. uint32 *max_local_cell_nums;
  192. /* max stack cell nums of AOTed (un-imported) functions */
  193. uint32 *max_stack_cell_nums;
  194. #endif
  195. #if WASM_ENABLE_GC != 0
  196. /* params + locals ref flags of (both import and AOTed) functions */
  197. LocalRefFlag *func_local_ref_flags;
  198. #endif
  199. /* export info */
  200. uint32 export_count;
  201. AOTExport *exports;
  202. /* start function index, -1 denotes no start function */
  203. uint32 start_func_index;
  204. /* start function, point to AOTed function */
  205. void *start_function;
  206. uint32 malloc_func_index;
  207. uint32 free_func_index;
  208. uint32 retain_func_index;
  209. /* AOTed code */
  210. void *code;
  211. uint32 code_size;
  212. /* literal for AOTed code */
  213. uint8 *literal;
  214. uint32 literal_size;
  215. #if defined(BH_PLATFORM_WINDOWS)
  216. /* extra plt data area for __ymm, __xmm and __real constants
  217. in Windows platform */
  218. uint8 *extra_plt_data;
  219. uint32 extra_plt_data_size;
  220. uint32 ymm_plt_count;
  221. uint32 xmm_plt_count;
  222. uint32 real_plt_count;
  223. uint32 float_plt_count;
  224. #endif
  225. #if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
  226. uint32 got_item_count;
  227. GOTItemList got_item_list;
  228. GOTItemList got_item_list_end;
  229. void **got_func_ptrs;
  230. #endif
  231. /* data sections in AOT object file, including .data, .rodata
  232. and .rodata.cstN. */
  233. AOTObjectDataSection *data_sections;
  234. uint32 data_section_count;
  235. /* constant string set */
  236. HashMap *const_str_set;
  237. /* the index of auxiliary __data_end global,
  238. -1 means unexported */
  239. uint32 aux_data_end_global_index;
  240. /* auxiliary __data_end exported by wasm app */
  241. uint64 aux_data_end;
  242. /* the index of auxiliary __heap_base global,
  243. -1 means unexported */
  244. uint32 aux_heap_base_global_index;
  245. /* auxiliary __heap_base exported by wasm app */
  246. uint64 aux_heap_base;
  247. /* the index of auxiliary stack top global,
  248. -1 means unexported */
  249. uint32 aux_stack_top_global_index;
  250. /* auxiliary stack bottom resolved */
  251. uint64 aux_stack_bottom;
  252. /* auxiliary stack size resolved */
  253. uint32 aux_stack_size;
  254. /* is indirect mode or not */
  255. bool is_indirect_mode;
  256. #if WASM_ENABLE_LIBC_WASI != 0
  257. WASIArguments wasi_args;
  258. bool import_wasi_api;
  259. #endif
  260. #if WASM_ENABLE_MULTI_MODULE != 0
  261. /* TODO: add mutex for mutli-thread? */
  262. bh_list import_module_list_head;
  263. bh_list *import_module_list;
  264. #endif
  265. #if WASM_ENABLE_GC != 0
  266. /* Ref types hash set */
  267. HashMap *ref_type_set;
  268. struct WASMRttType **rtt_types;
  269. korp_mutex rtt_type_lock;
  270. #if WASM_ENABLE_STRINGREF != 0
  271. /* special rtts for stringref types
  272. - stringref
  273. - stringview_wtf8
  274. - stringview_wtf16
  275. - stringview_iter
  276. */
  277. struct WASMRttType *stringref_rtts[4];
  278. uint32 string_literal_count;
  279. uint32 *string_literal_lengths;
  280. const uint8 **string_literal_ptrs;
  281. #endif
  282. #endif
  283. #if WASM_ENABLE_DEBUG_AOT != 0
  284. void *elf_hdr;
  285. uint32 elf_size;
  286. #endif
  287. #if WASM_ENABLE_CUSTOM_NAME_SECTION != 0
  288. const char **aux_func_names;
  289. uint32 *aux_func_indexes;
  290. uint32 aux_func_name_count;
  291. #endif
  292. #if WASM_ENABLE_LOAD_CUSTOM_SECTION != 0
  293. WASMCustomSection *custom_section_list;
  294. #endif
  295. /* user defined name */
  296. char *name;
  297. /* Whether the underlying wasm binary buffer can be freed */
  298. bool is_binary_freeable;
  299. /* `.data` sections merged into one mmaped to reduce the tlb cache miss */
  300. uint8 *merged_data_sections;
  301. uint32 merged_data_sections_size;
  302. /* `.data` and `.text` sections merged into one large mmaped section */
  303. uint8 *merged_data_text_sections;
  304. uint32 merged_data_text_sections_size;
  305. #if WASM_ENABLE_AOT_STACK_FRAME != 0
  306. uint32 feature_flags;
  307. #endif
  308. } AOTModule;
  309. #define AOTMemoryInstance WASMMemoryInstance
  310. #define AOTTableInstance WASMTableInstance
  311. #define AOTModuleInstance WASMModuleInstance
  312. #if WASM_ENABLE_MULTI_MODULE != 0
  313. #define AOTSubModInstNode WASMSubModInstNode
  314. #endif
  315. /* Target info, read from ELF header of object file */
  316. typedef struct AOTTargetInfo {
  317. /* Binary type, elf32l/elf32b/elf64l/elf64b */
  318. uint16 bin_type;
  319. /* ABI type */
  320. uint16 abi_type;
  321. /* Object file type */
  322. uint16 e_type;
  323. /* Architecture */
  324. uint16 e_machine;
  325. /* Object file version */
  326. uint32 e_version;
  327. /* Processor-specific flags */
  328. uint32 e_flags;
  329. /* Specify wasm features supported */
  330. uint64 feature_flags;
  331. /* Reserved */
  332. uint64 reserved;
  333. /* Arch name */
  334. char arch[16];
  335. } AOTTargetInfo;
  336. typedef struct AOTFuncPerfProfInfo {
  337. /* total execution time */
  338. uint64 total_exec_time;
  339. /* total execution count */
  340. uint32 total_exec_cnt;
  341. /* children execution time */
  342. uint64 children_exec_time;
  343. } AOTFuncPerfProfInfo;
  344. /* AOT auxiliary call stack */
  345. typedef struct AOTFrame {
  346. /* The frame of the caller which is calling current function */
  347. struct AOTFrame *prev_frame;
  348. /* The non-imported function index of current function */
  349. uintptr_t func_index;
  350. /* Used when performance profiling is enabled */
  351. uintptr_t time_started;
  352. /* Used when performance profiling is enabled */
  353. AOTFuncPerfProfInfo *func_perf_prof_info;
  354. /* Instruction pointer: offset to the bytecode array */
  355. uintptr_t ip_offset;
  356. /* Operand stack top pointer of the current frame */
  357. uint32 *sp;
  358. /* Frame ref flags (GC only) */
  359. uint8 *frame_ref;
  360. /**
  361. * Frame data, the layout is:
  362. * local area: parameters and local variables
  363. * stack area: wasm operand stack
  364. * frame ref flags (GC only):
  365. * whether each cell in local and stack area is a GC obj
  366. * currently local's ref flags are stored in AOTModule,
  367. * here we only reserve the padding bytes
  368. */
  369. uint32 lp[1];
  370. } AOTFrame;
  371. #if WASM_ENABLE_STATIC_PGO != 0
  372. /* The bitmaps fields in LLVMProfileRawHeader, LLVMProfileData,
  373. * LLVMProfileData_64 all dummy fields, it's used in MC/DC code coverage
  374. * instead of PGO. See https://llvm.org/docs/InstrProfileFormat.html#bitmap */
  375. typedef struct LLVMProfileRawHeader {
  376. uint64 magic;
  377. uint64 version;
  378. uint64 binary_ids_size;
  379. uint64 num_prof_data;
  380. uint64 padding_bytes_before_counters;
  381. uint64 num_prof_counters;
  382. uint64 padding_bytes_after_counters;
  383. uint64 num_prof_bitmaps;
  384. uint64 padding_bytes_after_bitmaps;
  385. uint64 names_size;
  386. uint64 counters_delta;
  387. uint64 bitmap_delta;
  388. uint64 names_delta;
  389. uint64 value_kind_last;
  390. } LLVMProfileRawHeader;
  391. typedef struct ValueProfNode {
  392. uint64 value;
  393. uint64 count;
  394. struct ValueProfNode *next;
  395. } ValueProfNode;
  396. /* The profiling data of data sections created by aot compiler and
  397. used when profiling, the width of pointer can be 8 bytes (64-bit)
  398. or 4 bytes (32-bit) */
  399. typedef struct LLVMProfileData {
  400. uint64 func_md5;
  401. uint64 func_hash;
  402. uint64 offset_counters;
  403. uint64 offset_bitmaps;
  404. uintptr_t func_ptr;
  405. ValueProfNode **values;
  406. uint32 num_counters;
  407. uint16 num_value_sites[2];
  408. uint32 num_bitmaps;
  409. } LLVMProfileData;
  410. /* The profiling data for writing to the output file, the width of
  411. pointer is 8 bytes suppose we always use wamrc and llvm-profdata
  412. with 64-bit mode */
  413. typedef struct LLVMProfileData_64 {
  414. uint64 func_md5;
  415. uint64 func_hash;
  416. uint64 offset_counters;
  417. uint64 offset_bitmaps;
  418. uint64 func_ptr;
  419. uint64 values;
  420. uint32 num_counters;
  421. uint16 num_value_sites[2];
  422. uint32 num_bitmaps;
  423. } LLVMProfileData_64;
  424. #endif /* end of WASM_ENABLE_STATIC_PGO != 0 */
  425. /**
  426. * Load a AOT module from aot file buffer
  427. * @param buf the byte buffer which contains the AOT file data
  428. * @param size the size of the buffer
  429. * @param error_buf output of the error info
  430. * @param error_buf_size the size of the error string
  431. *
  432. * @return return AOT module loaded, NULL if failed
  433. */
  434. AOTModule *
  435. aot_load_from_aot_file(const uint8 *buf, uint32 size, const LoadArgs *args,
  436. char *error_buf, uint32 error_buf_size);
  437. /**
  438. * Load a AOT module from a specified AOT section list.
  439. *
  440. * @param section_list the section list which contains each section data
  441. * @param error_buf output of the error info
  442. * @param error_buf_size the size of the error string
  443. *
  444. * @return return AOT module loaded, NULL if failed
  445. */
  446. AOTModule *
  447. aot_load_from_sections(AOTSection *section_list, char *error_buf,
  448. uint32 error_buf_size);
  449. /**
  450. * Unload a AOT module.
  451. *
  452. * @param module the module to be unloaded
  453. */
  454. void
  455. aot_unload(AOTModule *module);
  456. /**
  457. * Resolve symbols for an AOT module
  458. */
  459. bool
  460. aot_resolve_symbols(AOTModule *module);
  461. /**
  462. * Helper function to resolve a single function
  463. */
  464. bool
  465. aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func);
  466. /**
  467. * Instantiate a AOT module.
  468. *
  469. * @param module the AOT module to instantiate
  470. * @param parent the parent module instance
  471. * @param args the instantiation parameters
  472. * @param error_buf buffer to output the error info if failed
  473. * @param error_buf_size the size of the error buffer
  474. *
  475. * @return return the instantiated AOT module instance, NULL if failed
  476. */
  477. AOTModuleInstance *
  478. aot_instantiate(AOTModule *module, AOTModuleInstance *parent,
  479. WASMExecEnv *exec_env_main,
  480. const struct InstantiationArgs2 *args, char *error_buf,
  481. uint32 error_buf_size);
  482. /**
  483. * Deinstantiate a AOT module instance, destroy the resources.
  484. *
  485. * @param module_inst the AOT module instance to destroy
  486. * @param is_sub_inst the flag of sub instance
  487. */
  488. void
  489. aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst);
  490. /**
  491. * Lookup an exported function in the AOT module instance.
  492. *
  493. * @param module_inst the module instance
  494. * @param name the name of the function
  495. *
  496. * @return the function instance found
  497. */
  498. AOTFunctionInstance *
  499. aot_lookup_function(const AOTModuleInstance *module_inst, const char *name);
  500. /**
  501. * Lookup an exported function in the AOT module instance with
  502. * the function index.
  503. */
  504. AOTFunctionInstance *
  505. aot_lookup_function_with_idx(AOTModuleInstance *module_inst, uint32 func_idx);
  506. AOTMemoryInstance *
  507. aot_lookup_memory(AOTModuleInstance *module_inst, char const *name);
  508. AOTMemoryInstance *
  509. aot_get_default_memory(AOTModuleInstance *module_inst);
  510. AOTMemoryInstance *
  511. aot_get_memory_with_idx(AOTModuleInstance *module_inst, uint32 mem_idx);
  512. /**
  513. * Get a function in the AOT module instance.
  514. *
  515. * @param module_inst the module instance
  516. * @param func_idx the index of the function
  517. *
  518. * @return the function instance found
  519. */
  520. AOTFunctionInstance *
  521. aot_get_function_instance(AOTModuleInstance *module_inst, uint32 func_idx);
  522. /**
  523. * Call the given AOT function of a AOT module instance with
  524. * arguments.
  525. *
  526. * @param exec_env the execution environment
  527. * @param function the function to be called
  528. * @param argc the number of arguments
  529. * @param argv the arguments. If the function method has return value,
  530. * the first (or first two in case 64-bit return value) element of
  531. * argv stores the return value of the called AOT function after this
  532. * function returns.
  533. *
  534. * @return true if success, false otherwise and exception will be thrown,
  535. * the caller can call aot_get_exception to get exception info.
  536. */
  537. bool
  538. aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
  539. unsigned argc, uint32 argv[]);
  540. /**
  541. * Set AOT module instance exception with exception string
  542. *
  543. * @param module the AOT module instance
  544. *
  545. * @param exception current exception string
  546. */
  547. void
  548. aot_set_exception(AOTModuleInstance *module_inst, const char *exception);
  549. void
  550. aot_set_exception_with_id(AOTModuleInstance *module_inst, uint32 id);
  551. /**
  552. * Get exception info of the AOT module instance.
  553. *
  554. * @param module_inst the AOT module instance
  555. *
  556. * @return the exception string
  557. */
  558. const char *
  559. aot_get_exception(AOTModuleInstance *module_inst);
  560. /**
  561. * @brief Copy exception in buffer passed as parameter. Thread-safe version of
  562. * `aot_get_exception()`
  563. * @note Buffer size must be no smaller than EXCEPTION_BUF_LEN
  564. * @return true if exception found, false otherwise
  565. */
  566. bool
  567. aot_copy_exception(AOTModuleInstance *module_inst, char *exception_buf);
  568. uint64
  569. aot_module_malloc_internal(AOTModuleInstance *module_inst, WASMExecEnv *env,
  570. uint64 size, void **p_native_addr);
  571. uint64
  572. aot_module_realloc_internal(AOTModuleInstance *module_inst, WASMExecEnv *env,
  573. uint64 ptr, uint64 size, void **p_native_addr);
  574. void
  575. aot_module_free_internal(AOTModuleInstance *module_inst, WASMExecEnv *env,
  576. uint64 ptr);
  577. uint64
  578. aot_module_malloc(AOTModuleInstance *module_inst, uint64 size,
  579. void **p_native_addr);
  580. uint64
  581. aot_module_realloc(AOTModuleInstance *module_inst, uint64 ptr, uint64 size,
  582. void **p_native_addr);
  583. void
  584. aot_module_free(AOTModuleInstance *module_inst, uint64 ptr);
  585. uint64
  586. aot_module_dup_data(AOTModuleInstance *module_inst, const char *src,
  587. uint64 size);
  588. bool
  589. aot_enlarge_memory(AOTModuleInstance *module_inst, uint32 inc_page_count);
  590. bool
  591. aot_enlarge_memory_with_idx(AOTModuleInstance *module_inst,
  592. uint32 inc_page_count, uint32 memidx);
  593. /**
  594. * Invoke native function from aot code
  595. */
  596. bool
  597. aot_invoke_native(WASMExecEnv *exec_env, uint32 func_idx, uint32 argc,
  598. uint32 *argv);
  599. bool
  600. aot_call_indirect(WASMExecEnv *exec_env, uint32 tbl_idx, uint32 table_elem_idx,
  601. uint32 argc, uint32 *argv);
  602. /**
  603. * Check whether the app address and the buf is inside the linear memory,
  604. * and convert the app address into native address
  605. */
  606. bool
  607. aot_check_app_addr_and_convert(AOTModuleInstance *module_inst, bool is_str,
  608. uint64 app_buf_addr, uint64 app_buf_size,
  609. void **p_native_addr);
  610. uint32
  611. aot_get_plt_table_size(void);
  612. void *
  613. aot_memmove(void *dest, const void *src, size_t n);
  614. void *
  615. aot_memset(void *s, int c, size_t n);
  616. double
  617. aot_sqrt(double x);
  618. float
  619. aot_sqrtf(float x);
  620. #if WASM_ENABLE_BULK_MEMORY != 0
  621. bool
  622. aot_memory_init(AOTModuleInstance *module_inst, uint32 seg_index, uint32 offset,
  623. uint32 len, size_t dst);
  624. bool
  625. aot_data_drop(AOTModuleInstance *module_inst, uint32 seg_index);
  626. #endif
  627. #if WASM_ENABLE_THREAD_MGR != 0
  628. bool
  629. aot_set_aux_stack(WASMExecEnv *exec_env, uint64 start_offset, uint32 size);
  630. bool
  631. aot_get_aux_stack(WASMExecEnv *exec_env, uint64 *start_offset, uint32 *size);
  632. #endif
  633. void
  634. aot_get_module_mem_consumption(const AOTModule *module,
  635. WASMModuleMemConsumption *mem_conspn);
  636. void
  637. aot_get_module_inst_mem_consumption(const AOTModuleInstance *module_inst,
  638. WASMModuleInstMemConsumption *mem_conspn);
  639. #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0
  640. void
  641. aot_drop_table_seg(AOTModuleInstance *module_inst, uint32 tbl_seg_idx);
  642. void
  643. aot_table_init(AOTModuleInstance *module_inst, uint32 tbl_idx,
  644. uint32 tbl_seg_idx, uint32 length, uint32 src_offset,
  645. uint32 dst_offset);
  646. void
  647. aot_table_copy(AOTModuleInstance *module_inst, uint32 src_tbl_idx,
  648. uint32 dst_tbl_idx, uint32 length, uint32 src_offset,
  649. uint32 dst_offset);
  650. void
  651. aot_table_fill(AOTModuleInstance *module_inst, uint32 tbl_idx, uint32 length,
  652. table_elem_type_t val, uint32 data_offset);
  653. uint32
  654. aot_table_grow(AOTModuleInstance *module_inst, uint32 tbl_idx,
  655. uint32 inc_entries, table_elem_type_t init_val);
  656. #endif
  657. bool
  658. aot_alloc_frame(WASMExecEnv *exec_env, uint32 func_index);
  659. void
  660. aot_free_frame(WASMExecEnv *exec_env);
  661. void
  662. aot_frame_update_profile_info(WASMExecEnv *exec_env, bool alloc_frame);
  663. bool
  664. aot_create_call_stack(struct WASMExecEnv *exec_env);
  665. #if WASM_ENABLE_COPY_CALL_STACK != 0
  666. uint32
  667. aot_copy_callstack(WASMExecEnv *exec_env, WASMCApiFrame *buffer,
  668. const uint32 length, const uint32 skip_n, char *error_buf,
  669. uint32_t error_buf_size);
  670. #endif // WASM_ENABLE_COPY_CALL_STACK
  671. /**
  672. * @brief Dump wasm call stack or get the size
  673. *
  674. * @param exec_env the execution environment
  675. * @param print whether to print to stdout or not
  676. * @param buf buffer to store the dumped content
  677. * @param len length of the buffer
  678. *
  679. * @return when print is true, return the bytes printed out to stdout; when
  680. * print is false and buf is NULL, return the size required to store the
  681. * callstack content; when print is false and buf is not NULL, return the size
  682. * dumped to the buffer, 0 means error and data in buf may be invalid
  683. */
  684. uint32
  685. aot_dump_call_stack(WASMExecEnv *exec_env, bool print, char *buf, uint32 len);
  686. void
  687. aot_dump_perf_profiling(const AOTModuleInstance *module_inst);
  688. double
  689. aot_summarize_wasm_execute_time(const AOTModuleInstance *inst);
  690. double
  691. aot_get_wasm_func_exec_time(const AOTModuleInstance *inst,
  692. const char *func_name);
  693. const uint8 *
  694. aot_get_custom_section(const AOTModule *module, const char *name, uint32 *len);
  695. const void *
  696. aot_get_data_section_addr(AOTModule *module, const char *section_name,
  697. uint32 *p_data_size);
  698. #if WASM_ENABLE_STATIC_PGO != 0
  699. void
  700. llvm_profile_instrument_target(uint64 target_value, void *data,
  701. uint32 counter_idx);
  702. void
  703. llvm_profile_instrument_memop(uint64 target_value, void *data,
  704. uint32 counter_idx);
  705. uint32
  706. aot_get_pgo_prof_data_size(AOTModuleInstance *module_inst);
  707. uint32
  708. aot_dump_pgo_prof_data_to_buf(AOTModuleInstance *module_inst, char *buf,
  709. uint32 len);
  710. void
  711. aot_exchange_uint16(uint8 *p_data);
  712. void
  713. aot_exchange_uint32(uint8 *p_data);
  714. void
  715. aot_exchange_uint64(uint8 *p_data);
  716. #endif /* end of WASM_ENABLE_STATIC_PGO != 0 */
  717. #if WASM_ENABLE_GC != 0
  718. void *
  719. aot_create_func_obj(AOTModuleInstance *module_inst, uint32 func_idx,
  720. bool throw_exce, char *error_buf, uint32 error_buf_size);
  721. bool
  722. aot_obj_is_instance_of(AOTModuleInstance *module_inst, WASMObjectRef gc_obj,
  723. uint32 type_index);
  724. /* Whether func type1 is one of super types of func type2 */
  725. bool
  726. aot_func_type_is_super_of(AOTModuleInstance *module_inst, uint32 type_idx1,
  727. uint32 type_idx2);
  728. WASMRttTypeRef
  729. aot_rtt_type_new(AOTModuleInstance *module_inst, uint32 type_index);
  730. bool
  731. aot_array_init_with_data(AOTModuleInstance *module_inst, uint32 seg_index,
  732. uint32 data_seg_offset, WASMArrayObjectRef array_obj,
  733. uint32 elem_size, uint32 array_len);
  734. bool
  735. aot_traverse_gc_rootset(WASMExecEnv *exec_env, void *heap);
  736. #endif /* end of WASM_ENABLE_GC != 0 */
  737. char *
  738. aot_const_str_set_insert(const uint8 *str, int32 len, AOTModule *module,
  739. #if (WASM_ENABLE_WORD_ALIGN_READ != 0)
  740. bool is_vram_word_align,
  741. #endif
  742. char *error_buf, uint32 error_buf_size);
  743. bool
  744. aot_set_module_name(AOTModule *module, const char *name, char *error_buf,
  745. uint32_t error_buf_size);
  746. const char *
  747. aot_get_module_name(AOTModule *module);
  748. #ifdef __cplusplus
  749. } /* end of extern "C" */
  750. #endif
  751. #endif /* end of _AOT_RUNTIME_H_ */