summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/iwasm/fast-jit/fe/jit_emit_exception.c
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/iwasm/fast-jit/fe/jit_emit_exception.c')
-rw-r--r--fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/iwasm/fast-jit/fe/jit_emit_exception.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/iwasm/fast-jit/fe/jit_emit_exception.c b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/iwasm/fast-jit/fe/jit_emit_exception.c
new file mode 100644
index 000000000..2addb5cde
--- /dev/null
+++ b/fluent-bit/lib/wasm-micro-runtime-WAMR-1.2.2/core/iwasm/fast-jit/fe/jit_emit_exception.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2019 Intel Corporation. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include "jit_emit_exception.h"
+#include "../jit_frontend.h"
+
+bool
+jit_emit_exception(JitCompContext *cc, int32 exception_id, uint8 jit_opcode,
+ JitReg cond_br_if, JitBasicBlock *cond_br_else_block)
+{
+ JitInsn *insn = NULL;
+ JitIncomingInsn *incoming_insn;
+ JitReg else_label;
+
+ bh_assert(exception_id < EXCE_NUM);
+
+ if (jit_opcode >= JIT_OP_BEQ && jit_opcode <= JIT_OP_BLEU) {
+ bh_assert(cond_br_if == cc->cmp_reg);
+ else_label =
+ cond_br_else_block ? jit_basic_block_label(cond_br_else_block) : 0;
+ switch (jit_opcode) {
+ case JIT_OP_BEQ:
+ insn = GEN_INSN(BEQ, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BNE:
+ insn = GEN_INSN(BNE, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BGTS:
+ insn = GEN_INSN(BGTS, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BGES:
+ insn = GEN_INSN(BGES, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BLTS:
+ insn = GEN_INSN(BLTS, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BLES:
+ insn = GEN_INSN(BLES, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BGTU:
+ insn = GEN_INSN(BGTU, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BGEU:
+ insn = GEN_INSN(BGEU, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BLTU:
+ insn = GEN_INSN(BLTU, cond_br_if, 0, else_label);
+ break;
+ case JIT_OP_BLEU:
+ insn = GEN_INSN(BLEU, cond_br_if, 0, else_label);
+ break;
+ }
+ if (!insn) {
+ jit_set_last_error(cc, "generate cond br insn failed");
+ return false;
+ }
+ }
+ else if (jit_opcode == JIT_OP_JMP) {
+ insn = GEN_INSN(JMP, 0);
+ if (!insn) {
+ jit_set_last_error(cc, "generate jmp insn failed");
+ return false;
+ }
+ }
+
+ incoming_insn = jit_calloc(sizeof(JitIncomingInsn));
+ if (!incoming_insn) {
+ jit_set_last_error(cc, "allocate memory failed");
+ return false;
+ }
+
+ incoming_insn->insn = insn;
+ incoming_insn->next = cc->incoming_insns_for_exec_bbs[exception_id];
+ cc->incoming_insns_for_exec_bbs[exception_id] = incoming_insn;
+ return true;
+}