Skip to content

Commit b6af4d9

Browse files
committed
WASM changes from lfortran/lfortran#1495
1 parent 5d8c48c commit b6af4d9

File tree

2 files changed

+20
-42
lines changed

2 files changed

+20
-42
lines changed

src/libasr/codegen/asr_to_wasm.cpp

Lines changed: 18 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
#include <libasr/exception.h>
2020
#include <libasr/asr_utils.h>
2121

22+
#define INCLUDE_RUNTIME_FUNC(fn) \
23+
if (m_rt_func_used_idx[fn] == -1) { \
24+
m_rt_func_used_idx[fn] = no_of_types++; \
25+
} \
26+
2227
// #define SHOW_ASR
2328

2429
#ifdef SHOW_ASR
@@ -1712,42 +1717,30 @@ class ASRToWASMVisitor : public ASR::BaseVisitor<ASRToWASMVisitor> {
17121717
switch (x.m_op) {
17131718
case ASR::binopType::Add: {
17141719
if (a_kind == 4) {
1715-
if (m_rt_func_used_idx[add_c32] == -1) {
1716-
m_rt_func_used_idx[add_c32] = no_of_types++;
1717-
}
1720+
INCLUDE_RUNTIME_FUNC(add_c32);
17181721
wia.emit_call(m_rt_func_used_idx[add_c32]);
17191722
} else {
1720-
if (m_rt_func_used_idx[add_c64] == -1) {
1721-
m_rt_func_used_idx[add_c64] = no_of_types++;
1722-
}
1723+
INCLUDE_RUNTIME_FUNC(add_c64);
17231724
wia.emit_call(m_rt_func_used_idx[add_c64]);
17241725
}
17251726
break;
17261727
};
17271728
case ASR::binopType::Sub: {
17281729
if (a_kind == 4) {
1729-
if (m_rt_func_used_idx[sub_c32] == -1) {
1730-
m_rt_func_used_idx[sub_c32] = no_of_types++;
1731-
}
1730+
INCLUDE_RUNTIME_FUNC(sub_c32);
17321731
wia.emit_call(m_rt_func_used_idx[sub_c32]);
17331732
} else {
1734-
if (m_rt_func_used_idx[sub_c64] == -1) {
1735-
m_rt_func_used_idx[sub_c64] = no_of_types++;
1736-
}
1733+
INCLUDE_RUNTIME_FUNC(sub_c64);
17371734
wia.emit_call(m_rt_func_used_idx[sub_c64]);
17381735
}
17391736
break;
17401737
};
17411738
case ASR::binopType::Mul: {
17421739
if (a_kind == 4) {
1743-
if (m_rt_func_used_idx[mul_c32] == -1) {
1744-
m_rt_func_used_idx[mul_c32] = no_of_types++;
1745-
}
1740+
INCLUDE_RUNTIME_FUNC(mul_c32);
17461741
wia.emit_call(m_rt_func_used_idx[mul_c32]);
17471742
} else {
1748-
if (m_rt_func_used_idx[mul_c64] == -1) {
1749-
m_rt_func_used_idx[mul_c64] = no_of_types++;
1750-
}
1743+
INCLUDE_RUNTIME_FUNC(mul_c64);
17511744
wia.emit_call(m_rt_func_used_idx[mul_c64]);
17521745
}
17531746
break;
@@ -2685,16 +2678,12 @@ class ASRToWASMVisitor : public ASR::BaseVisitor<ASRToWASMVisitor> {
26852678
int arg_kind = -1, dest_kind = -1;
26862679
extract_kinds(x, arg_kind, dest_kind);
26872680
if (arg_kind == 4) {
2688-
if (m_rt_func_used_idx[abs_c32] == -1) {
2689-
m_rt_func_used_idx[abs_c32] = no_of_types++;
2690-
}
2681+
INCLUDE_RUNTIME_FUNC(add_c32);
26912682
wia.emit_call(m_rt_func_used_idx[abs_c32]);
26922683
wia.emit_f32_const(0.0);
26932684
wia.emit_f32_gt();
26942685
} else if (arg_kind == 8) {
2695-
if (m_rt_func_used_idx[abs_c64] == -1) {
2696-
m_rt_func_used_idx[abs_c64] = no_of_types++;
2697-
}
2686+
INCLUDE_RUNTIME_FUNC(abs_c64);
26982687
wia.emit_call(m_rt_func_used_idx[abs_c64]);
26992688
wia.emit_f64_const(0.0);
27002689
wia.emit_f64_gt();
@@ -2874,9 +2863,7 @@ class ASRToWASMVisitor : public ASR::BaseVisitor<ASRToWASMVisitor> {
28742863
int a_kind = ASRUtils::extract_kind_from_ttype_t(t);
28752864

28762865
if (ASRUtils::is_integer(*t) || ASRUtils::is_logical(*t)) {
2877-
if (m_rt_func_used_idx[print_i64] == -1) {
2878-
m_rt_func_used_idx[print_i64] = no_of_types++;
2879-
}
2866+
INCLUDE_RUNTIME_FUNC(print_i64);
28802867
this->visit_expr(*x.m_values[i]);
28812868
switch (a_kind) {
28822869
case 4: {
@@ -2895,12 +2882,8 @@ class ASRToWASMVisitor : public ASR::BaseVisitor<ASRToWASMVisitor> {
28952882
}
28962883
}
28972884
} else if (ASRUtils::is_real(*t)) {
2898-
if (m_rt_func_used_idx[print_i64] == -1) {
2899-
m_rt_func_used_idx[print_i64] = no_of_types++;
2900-
}
2901-
if (m_rt_func_used_idx[print_f64] == -1) {
2902-
m_rt_func_used_idx[print_f64] = no_of_types++;
2903-
}
2885+
INCLUDE_RUNTIME_FUNC(print_i64);
2886+
INCLUDE_RUNTIME_FUNC(print_f64);
29042887
this->visit_expr(*x.m_values[i]);
29052888
switch (a_kind) {
29062889
case 4: {
@@ -2928,12 +2911,8 @@ class ASRToWASMVisitor : public ASR::BaseVisitor<ASRToWASMVisitor> {
29282911
wia.emit_call(m_import_func_idx_map[fd_write]);
29292912
wia.emit_drop();
29302913
} else if (t->type == ASR::ttypeType::Complex) {
2931-
if (m_rt_func_used_idx[print_i64] == -1) {
2932-
m_rt_func_used_idx[print_i64] = no_of_types++;
2933-
}
2934-
if (m_rt_func_used_idx[print_f64] == -1) {
2935-
m_rt_func_used_idx[print_f64] = no_of_types++;
2936-
}
2914+
INCLUDE_RUNTIME_FUNC(print_i64);
2915+
INCLUDE_RUNTIME_FUNC(print_f64);
29372916
emit_call_fd_write(1, "(", 1, 0);
29382917
this->visit_expr(*x.m_values[i]);
29392918
if (a_kind == 4) {

src/libasr/codegen/wasm_assembler.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
#include <cassert>
2-
1+
#include <libasr/assert.h>
32
#include <libasr/codegen/wasm_utils.h>
43

54
namespace LCompilers {
@@ -53,7 +52,7 @@ void emit_u32_b32_idx(Vec<uint8_t> &code, Allocator &al, uint32_t idx,
5352
num.reserve(al, 4);
5453
encode_leb128_u32(num, al, section_size);
5554
std::vector<uint8_t> num_4b = {0x80, 0x80, 0x80, 0x00};
56-
assert(num.size() <= 4);
55+
LCOMPILERS_ASSERT(num.size() <= 4);
5756
for (uint32_t i = 0; i < num.size(); i++) {
5857
num_4b[i] |= num[i];
5958
}

0 commit comments

Comments
 (0)