Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
38905554
wa
项目概览
wa-lang
/
wa
11 个月 前同步成功
通知
68
Star
655
Fork
45
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
wa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
38905554
编写于
9月 03, 2022
作者:
chai2010
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
调整 wasm 例子, 最小例子可以执行, 打开 action 检查
上级
cdc98460
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
213 addition
and
8 deletion
+213
-8
.github/workflows/wa.yml
.github/workflows/wa.yml
+1
-1
hello.wa
hello.wa
+1
-5
internal/backends/compiler_wat/base.wat.go
internal/backends/compiler_wat/base.wat.go
+205
-0
internal/backends/compiler_wat/compile.go
internal/backends/compiler_wat/compile.go
+3
-2
internal/backends/compiler_wat/wir/module.go
internal/backends/compiler_wat/wir/module.go
+2
-0
internal/backends/compiler_wat/wir/wir.go
internal/backends/compiler_wat/wir/wir.go
+1
-0
未找到文件。
.github/workflows/wa.yml
浏览文件 @
38905554
...
...
@@ -45,7 +45,7 @@ jobs:
-
run
:
wa run _examples/prime
-
run
:
wa wasm hello.wa
#
- run: wasmer a.out.wat
-
run
:
wasmer a.out.wat
-
uses
:
shogo82148/actions-goveralls@v1
with
:
...
...
hello.wa
浏览文件 @
38905554
# 版权 @2019 凹语言 作者。保留所有权利。
fn main() {
println(add(40, 2))
}
fn add(a:i32, b:i32) => i32 {
return a + b
println(40+2)
}
internal/backends/compiler_wat/base.wat.go
浏览文件 @
38905554
...
...
@@ -44,3 +44,208 @@ const (
// 开始函数
_waStart
=
"_start"
)
const
modBaseWat
=
`
;; ----------------------------------------------------
;; import 必须最先定义
;; ----------------------------------------------------
;; WASI 最小子集
;; 用于输出字符串
(import "wasi_snapshot_preview1" "fd_write"
(func $fd_write (param i32 i32 i32 i32) (result i32))
)
;; ----------------------------------------------------
;; 内存和入口
;; ----------------------------------------------------
(memory $memory 1)
(export "memory" (memory $memory))
(export "_start" (func $_start))
;; (export "main.main" (func $main.main))
;; ----------------------------------------------------
;; WASM 约定栈和内存管理
;; 相关全局变量地址必须和 base_wasm.go 保持一致
;; ----------------------------------------------------
;; heap 和 stack 状态(__heap_base 只读)
;; | 0 <-- stack --> | <-- static-data --> | <-- heap --> |
(global $__stack_ptr (mut i32) (i32.const 1024)) ;; index=0
(global $__heap_base i32 (i32.const 2048)) ;; index=1
;; ----------------------------------------------------
;; Stack 辅助函数
;; ----------------------------------------------------
;; 获取栈顶地址
(func $waStackPtr (result i32)
(global.get $__stack_ptr)
)
;; 栈上分配空间
(func $waStackAlloc (param $size i32) (result i32)
;; $__stack_ptr -= $size
(global.set $__stack_ptr (i32.sub (global.get $__stack_ptr) (local.get $size)))
;; return $__stack_ptr
(return (global.get $__stack_ptr))
)
;; 释放栈上的空间
(func $waStackFree (param $size i32)
;; $__stack_ptr += $size
(global.set $__stack_ptr (i32.add (global.get $__stack_ptr) (local.get $size)))
)
;; ----------------------------------------------------
;; Heap 辅助函数
;; ----------------------------------------------------
;; 获取堆地址
(func $waHeapPtr (result i32)
(global.get $__heap_base)
)
;; 堆上分配内存(没有记录大小)
(func $waAlloc (param $size i32) (result i32)
;; {{$waAlloc/body/begin}}
unreachable
;; {{$waAlloc/body/end}}
)
;; 内存复用(引用加一)
(func $waRetain(param $ptr i32) (result i32)
;; {{$waRetain/body/begin}}
unreachable
;; {{$waRetain/body/end}}
)
;; 释放内存(引用减一)
(func $waFree (param $ptr i32)
;; {{$waFree/body/begin}}
unreachable
;; {{$waFree/body/end}}
)
;; ----------------------------------------------------
;; 输出函数
;; ----------------------------------------------------
;; 打印字符串
(func $puts (param $str i32) (param $len i32)
;; {{$puts/body/begin}}
(local $sp i32)
(local $p_iov i32)
(local $p_nwritten i32)
(local $stdout i32)
;; 保存栈指针状态
(local.set $sp (global.get $__stack_ptr))
;; 分配 iov 结构体
(local.set $p_iov (call $waStackAlloc (i32.const 8)))
;; 返回地址
(local.set $p_nwritten (call $waStackAlloc (i32.const 4)))
;; 设置字符串指针和长度
(i32.store offset=0 align=1 (local.get $p_iov) (local.get $str))
(i32.store offset=4 align=1 (local.get $p_iov) (local.get $len))
;; 标准输出
(local.set $stdout (i32.const 1))
;; 输出字符串
(call $fd_write
(local.get $stdout)
(local.get $p_iov) (i32.const 1)
(local.get $p_nwritten)
)
;; 重置栈指针
(global.set $__stack_ptr (local.get $sp))
drop
;; {{$puts/body/end}}
)
;; 打印字符
(func $__print_char (param $ch i32)
;; {{$putchar/body/begin}}
(local $sp i32)
(local $p_ch i32)
;; 保存栈指针状态
(local.set $sp (global.get $__stack_ptr))
;; 分配字符
(local.set $p_ch (call $waStackAlloc (i32.const 4)))
(i32.store offset=0 align=1 (local.get $p_ch) (local.get $ch))
;; 输出字符
(call $puts (local.get $p_ch) (i32.const 1))
;; 重置栈指针
(global.set $__stack_ptr (local.get $sp))
;; {{$putchar/body/begin}}
)
;; 打印整数
(func $__print_i32 (param $x i32)
;; {{$print_i32/body/begin}}
(local $div i32)
(local $rem i32)
;; if $x == 0 { print '0'; return }
(i32.eq (local.get $x) (i32.const 0))
if
(call $putchar (i32.const 48)) ;; '0'
(call $putchar (i32.const 10)) ;; '\n'
(return)
end
;; if $x < 0 { $x = 0-$x; print '-'; }
(i32.lt_s (local.get $x) (i32.const 0))
if
(local.set $x (i32.sub (i32.const 0) (local.get $x)))
(call $putchar (i32.const 45)) ;; '-'
end
;; print_i32($x / 10)
;; puchar($x%10 + '0')
(local.set $div (i32.div_s (local.get $x) (i32.const 10)))
(local.set $rem (i32.rem_s (local.get $x) (i32.const 10)))
(call $print_i32 (local.get $div))
(call $putchar (i32.add (local.get $rem) (i32.const 48))) ;; '0'
;; {{$print_i32/body/end}}
)
(func $putchar (param $ch i32)
local.get $ch
call $__print_char
)
(func $print_i32 (param $ch i32)
local.get $ch
call $__print_i32
)
;; ----------------------------------------------------
;; _start 函数
;; ----------------------------------------------------
;; _start 函数
(func $_start
;; {{$_start/body/begin}}
;; (call $main.init)
(call $main)
;; {{$_start/body/end}}
)
`
\ No newline at end of file
internal/backends/compiler_wat/compile.go
浏览文件 @
38905554
...
...
@@ -17,6 +17,7 @@ type Compiler struct {
func
New
()
*
Compiler
{
p
:=
new
(
Compiler
)
p
.
module
.
BaseWat
=
modBaseWat
return
p
}
...
...
@@ -38,8 +39,8 @@ func (p *Compiler) CompilePackage(ssaPkg *ssa.Package) {
{
var
sig
wir
.
FuncSig
sig
.
Params
=
append
(
sig
.
Params
,
wtypes
.
Int32
{})
p
.
module
.
Imports
=
append
(
p
.
module
.
Imports
,
wir
.
NewImpFunc
(
"js"
,
"print_i32"
,
"__print_i32"
,
sig
))
p
.
module
.
Imports
=
append
(
p
.
module
.
Imports
,
wir
.
NewImpFunc
(
"js"
,
"print_char"
,
"__print_char"
,
sig
))
//
p.module.Imports = append(p.module.Imports, wir.NewImpFunc("js", "print_i32", "__print_i32", sig))
//
p.module.Imports = append(p.module.Imports, wir.NewImpFunc("js", "print_char", "__print_char", sig))
}
for
_
,
m
:=
range
p
.
ssaPkg
.
Members
{
...
...
internal/backends/compiler_wat/wir/module.go
浏览文件 @
38905554
...
...
@@ -3,6 +3,8 @@ package wir
func
(
m
*
Module
)
String
()
string
{
s
:=
"(module $__walang__
\n
"
s
+=
m
.
BaseWat
+
"
\n
"
for
_
,
i
:=
range
m
.
Imports
{
s
+=
i
.
Format
(
" "
)
+
"
\n
"
}
...
...
internal/backends/compiler_wat/wir/wir.go
浏览文件 @
38905554
...
...
@@ -5,6 +5,7 @@ import (
)
type
Module
struct
{
BaseWat
string
Imports
[]
Import
Funcs
[]
*
Function
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录