Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wa-lang
wa
提交
0e42f328
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,发现更多精彩内容 >>
提交
0e42f328
编写于
11月 27, 2022
作者:
chai2010
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of gitee.com:wa-lang/wa
上级
a89e8072
3c4a4c96
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
44 addition
and
11 deletion
+44
-11
_examples/llvm/build.sh
_examples/llvm/build.sh
+1
-0
_examples/llvm/internal_function.wa
_examples/llvm/internal_function.wa
+18
-0
internal/backends/compiler_llvm/compile.go
internal/backends/compiler_llvm/compile.go
+9
-0
internal/backends/compiler_llvm/compile_value.go
internal/backends/compiler_llvm/compile_value.go
+4
-0
internal/backends/compiler_wat/wir/value_array.go
internal/backends/compiler_wat/wir/value_array.go
+12
-11
未找到文件。
_examples/llvm/build.sh
浏览文件 @
0e42f328
...
...
@@ -15,6 +15,7 @@ wa native global_constant.wa
wa native global_variable_0.wa
wa native global_variable_1.wa
wa native heart.wa
wa native internal_function.wa
wa native loop_0.wa
wa native loop_1.wa
wa native multi_ret.wa
...
...
_examples/llvm/internal_function.wa
0 → 100644
浏览文件 @
0e42f328
# Test the llvm backend.
# Test anonymous functions and closure functions.
fn main() {
print("Hello, ")
fn() {
println("World!")
}()
var i: int
show := fn() {
println("i = ", i)
}
for i = 0; i < 10; i++ {
show()
}
}
internal/backends/compiler_llvm/compile.go
浏览文件 @
0e42f328
...
...
@@ -21,6 +21,7 @@ type Compiler struct {
output
strings
.
Builder
debug
bool
fmts
[]
FmtStr
anofn
[]
*
ssa
.
Function
}
func
New
(
target
string
,
debug
bool
)
*
Compiler
{
...
...
@@ -142,6 +143,14 @@ func (p *Compiler) compilePackage(pkg *ssa.Package) error {
}
}
// Generate LLVM-IR for each internal function.
for
_
,
v
:=
range
p
.
anofn
{
if
err
:=
p
.
compileFunction
(
v
);
err
!=
nil
{
return
err
}
}
p
.
anofn
=
[]
*
ssa
.
Function
{}
return
nil
}
...
...
internal/backends/compiler_llvm/compile_value.go
浏览文件 @
0e42f328
...
...
@@ -387,6 +387,10 @@ func (p *Compiler) compileCall(val *ssa.Call) error {
// Emit the function name.
p
.
output
.
WriteString
(
" @"
)
callee
:=
val
.
Call
.
StaticCallee
()
// This callee is an internal function, whose body will be genereated later.
if
callee
.
Parent
()
!=
nil
{
p
.
anofn
=
append
(
p
.
anofn
,
callee
)
}
if
len
(
callee
.
LinkName
())
>
0
{
p
.
output
.
WriteString
(
callee
.
LinkName
())
}
else
{
...
...
internal/backends/compiler_wat/wir/value_array.go
浏览文件 @
0e42f328
...
...
@@ -52,23 +52,24 @@ func (t Array) EmitLoadFromAddr(addr Value, offset int) (insts []wat.Inst) {
aArray:
**************************************/
type
aArray
struct
{
a
Value
underlying
aStruct
a
Struct
typ
Array
}
func
newValueArray
(
name
string
,
kind
ValueKind
,
base_type
ValueType
,
capacity
int
)
*
aArray
{
var
v
aArray
array_typ
:=
NewArray
(
base_type
,
capacity
)
v
.
aValue
=
aValue
{
name
:
name
,
kind
:
kind
,
typ
:
array_typ
}
v
.
underlying
=
*
newValueStruct
(
name
,
kind
,
array_typ
.
Struct
)
v
.
typ
=
NewArray
(
base_type
,
capacity
)
v
.
aStruct
=
*
newValueStruct
(
name
,
kind
,
v
.
typ
.
Struct
)
return
&
v
}
func
(
v
*
aArray
)
raw
()
[]
wat
.
Value
{
return
v
.
underlying
.
raw
()
}
func
(
v
*
aArray
)
EmitInit
()
(
insts
[]
wat
.
Inst
)
{
return
v
.
underlying
.
EmitInit
()
}
func
(
v
*
aArray
)
EmitPush
()
(
insts
[]
wat
.
Inst
)
{
return
v
.
underlying
.
EmitPush
()
}
func
(
v
*
aArray
)
EmitPop
()
(
insts
[]
wat
.
Inst
)
{
return
v
.
underlying
.
EmitPop
()
}
func
(
v
*
aArray
)
EmitRelease
()
(
insts
[]
wat
.
Inst
)
{
return
v
.
underlying
.
EmitRelease
()
}
func
(
v
*
aArray
)
Type
()
ValueType
{
return
v
.
typ
}
func
(
v
*
aArray
)
raw
()
[]
wat
.
Value
{
return
v
.
aStruct
.
raw
()
}
func
(
v
*
aArray
)
EmitInit
()
(
insts
[]
wat
.
Inst
)
{
return
v
.
aStruct
.
EmitInit
()
}
func
(
v
*
aArray
)
EmitPush
()
(
insts
[]
wat
.
Inst
)
{
return
v
.
aStruct
.
EmitPush
()
}
func
(
v
*
aArray
)
EmitPop
()
(
insts
[]
wat
.
Inst
)
{
return
v
.
aStruct
.
EmitPop
()
}
func
(
v
*
aArray
)
EmitRelease
()
(
insts
[]
wat
.
Inst
)
{
return
v
.
aStruct
.
EmitRelease
()
}
func
(
v
*
aArray
)
emitStoreToAddr
(
addr
Value
,
offset
int
)
(
insts
[]
wat
.
Inst
)
{
if
!
addr
.
Type
()
.
(
Pointer
)
.
Base
.
Equal
(
v
.
Type
())
{
...
...
@@ -76,5 +77,5 @@ func (v *aArray) emitStoreToAddr(addr Value, offset int) (insts []wat.Inst) {
return
nil
}
return
v
.
underlying
.
emitStoreToAddr
(
addr
,
offset
)
return
v
.
aStruct
.
emitStoreToAddr
(
addr
,
offset
)
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录