From b4380fb3b10e5c5b59a3f10a6df4c5e78fbc4065 Mon Sep 17 00:00:00 2001 From: Marcin Kolny Date: Thu, 5 Sep 2024 09:18:47 +0100 Subject: [PATCH] refactoring: Re-use commit IP functionality between exception handling and other cases (#3768) --- core/iwasm/compilation/aot_compiler.c | 66 +++++++++++++-------- core/iwasm/compilation/aot_compiler.h | 9 +++ core/iwasm/compilation/aot_emit_exception.c | 45 +------------- 3 files changed, 54 insertions(+), 66 deletions(-) diff --git a/core/iwasm/compilation/aot_compiler.c b/core/iwasm/compilation/aot_compiler.c index 96ed8facf..bb6cf100a 100644 --- a/core/iwasm/compilation/aot_compiler.c +++ b/core/iwasm/compilation/aot_compiler.c @@ -569,6 +569,46 @@ aot_gen_commit_values(AOTCompFrame *frame) return true; } +bool +aot_gen_commit_ip(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, + LLVMValueRef ip_value, bool is_64bit) +{ + LLVMValueRef cur_frame = func_ctx->cur_frame; + LLVMValueRef value_offset, value_addr, value_ptr; + uint32 offset_ip; + + if (!comp_ctx->is_jit_mode) + offset_ip = comp_ctx->pointer_size * 4; + else + offset_ip = offsetof(WASMInterpFrame, ip); + + if (!(value_offset = I32_CONST(offset_ip))) { + aot_set_last_error("llvm build const failed"); + return false; + } + + if (!(value_addr = + LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, cur_frame, + &value_offset, 1, "ip_addr"))) { + aot_set_last_error("llvm build in bounds gep failed"); + return false; + } + + if (!(value_ptr = LLVMBuildBitCast( + comp_ctx->builder, value_addr, + is_64bit ? INT64_PTR_TYPE : INT32_PTR_TYPE, "ip_ptr"))) { + aot_set_last_error("llvm build bit cast failed"); + return false; + } + + if (!LLVMBuildStore(comp_ctx->builder, ip_value, value_ptr)) { + aot_set_last_error("llvm build store failed"); + return false; + } + + return true; +} + bool aot_gen_commit_sp_ip(AOTCompFrame *frame, bool commit_sp, bool commit_ip) { @@ -577,40 +617,19 @@ aot_gen_commit_sp_ip(AOTCompFrame *frame, bool commit_sp, bool commit_ip) LLVMValueRef cur_frame = func_ctx->cur_frame; LLVMValueRef value_offset, value_addr, value_ptr, value; LLVMTypeRef int8_ptr_ptr_type; - uint32 offset_ip, offset_sp, n; + uint32 offset_sp, n; bool is_64bit = (comp_ctx->pointer_size == sizeof(uint64)) ? true : false; const AOTValueSlot *sp = frame->sp; const uint8 *ip = frame->frame_ip; if (!comp_ctx->is_jit_mode) { - offset_ip = frame->comp_ctx->pointer_size * 4; offset_sp = frame->comp_ctx->pointer_size * 5; } else { - offset_ip = offsetof(WASMInterpFrame, ip); offset_sp = offsetof(WASMInterpFrame, sp); } if (commit_ip) { - if (!(value_offset = I32_CONST(offset_ip))) { - aot_set_last_error("llvm build const failed"); - return false; - } - - if (!(value_addr = - LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, cur_frame, - &value_offset, 1, "ip_addr"))) { - aot_set_last_error("llvm build in bounds gep failed"); - return false; - } - - if (!(value_ptr = LLVMBuildBitCast( - comp_ctx->builder, value_addr, - is_64bit ? INT64_PTR_TYPE : INT32_PTR_TYPE, "ip_ptr"))) { - aot_set_last_error("llvm build bit cast failed"); - return false; - } - if (!comp_ctx->is_jit_mode) { WASMModule *module = comp_ctx->comp_data->wasm_module; if (is_64bit) @@ -630,8 +649,7 @@ aot_gen_commit_sp_ip(AOTCompFrame *frame, bool commit_sp, bool commit_ip) return false; } - if (!LLVMBuildStore(comp_ctx->builder, value, value_ptr)) { - aot_set_last_error("llvm build store failed"); + if (!aot_gen_commit_ip(comp_ctx, func_ctx, value, is_64bit)) { return false; } } diff --git a/core/iwasm/compilation/aot_compiler.h b/core/iwasm/compilation/aot_compiler.h index ab74b7cb6..d3d55b02b 100644 --- a/core/iwasm/compilation/aot_compiler.h +++ b/core/iwasm/compilation/aot_compiler.h @@ -195,6 +195,15 @@ aot_gen_commit_values(AOTCompFrame *frame); bool aot_gen_commit_sp_ip(AOTCompFrame *frame, bool commit_sp, bool commit_ip); +/** + * Generate instructions to commit IP pointer to the frame. + * + * @param frame the frame information + */ +bool +aot_gen_commit_ip(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, + LLVMValueRef ip_value, bool is_64bit); + bool aot_frame_store_value(AOTCompContext *comp_ctx, LLVMValueRef value, uint8 value_type, LLVMValueRef cur_frame, uint32 offset); diff --git a/core/iwasm/compilation/aot_emit_exception.c b/core/iwasm/compilation/aot_emit_exception.c index d3dcf719d..968ee78b6 100644 --- a/core/iwasm/compilation/aot_emit_exception.c +++ b/core/iwasm/compilation/aot_emit_exception.c @@ -4,49 +4,10 @@ */ #include "aot_emit_exception.h" +#include "aot_compiler.h" #include "../interpreter/wasm_runtime.h" #include "../aot/aot_runtime.h" -static bool -commit_ip(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, - LLVMValueRef exce_ip, bool is_64bit) -{ - LLVMValueRef cur_frame = func_ctx->cur_frame; - LLVMValueRef value_offset, value_addr, value_ptr; - uint32 offset_ip; - - if (!comp_ctx->is_jit_mode) - offset_ip = comp_ctx->pointer_size * 4; - else - offset_ip = offsetof(WASMInterpFrame, ip); - - if (!(value_offset = I32_CONST(offset_ip))) { - aot_set_last_error("llvm build const failed"); - return false; - } - - if (!(value_addr = - LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, cur_frame, - &value_offset, 1, "ip_addr"))) { - aot_set_last_error("llvm build in bounds gep failed"); - return false; - } - - if (!(value_ptr = LLVMBuildBitCast( - comp_ctx->builder, value_addr, - is_64bit ? INT64_PTR_TYPE : INT32_PTR_TYPE, "ip_ptr"))) { - aot_set_last_error("llvm build bit cast failed"); - return false; - } - - if (!LLVMBuildStore(comp_ctx->builder, exce_ip, value_ptr)) { - aot_set_last_error("llvm build store failed"); - return false; - } - - return true; -} - bool aot_emit_exception(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, int32 exception_id, bool is_cond_br, LLVMValueRef cond_br_if, @@ -90,8 +51,8 @@ aot_emit_exception(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, } /* Commit ip to current frame */ - if (!commit_ip(comp_ctx, func_ctx, func_ctx->exception_ip_phi, - is_64bit)) { + if (!aot_gen_commit_ip(comp_ctx, func_ctx, + func_ctx->exception_ip_phi, is_64bit)) { return false; } }