提交 f55cde11 编写于 作者: B Ben Shi

Implement translation of stack allocation.

上级 c1f2f5aa
...@@ -6,9 +6,9 @@ fn main { ...@@ -6,9 +6,9 @@ fn main {
for x := -1.5; x < 1.5; x = x + 0.1 { for x := -1.5; x < 1.5; x = x + 0.1 {
a = x*x + y*y - 1.0 a = x*x + y*y - 1.0
if a*a*a < x*x*y*y*y { if a*a*a < x*x*y*y*y {
print('@') print("@")
} else { } else {
print(' ') print(" ")
} }
} }
println() println()
......
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
"github.com/wa-lang/wa/internal/ssa" "github.com/wa-lang/wa/internal/ssa"
"github.com/wa-lang/wa/internal/token" "github.com/wa-lang/wa/internal/token"
"github.com/wa-lang/wa/internal/types"
) )
func (p *Compiler) compileValue(val ssa.Value) error { func (p *Compiler) compileValue(val ssa.Value) error {
...@@ -39,6 +40,25 @@ func (p *Compiler) compileValue(val ssa.Value) error { ...@@ -39,6 +40,25 @@ func (p *Compiler) compileValue(val ssa.Value) error {
} }
p.output.WriteString("\n") p.output.WriteString("\n")
case *ssa.Alloc:
if !val.Heap {
p.output.WriteString(" ")
p.output.WriteString(getValueStr(val))
p.output.WriteString(" = alloca ")
if pt, ok := val.Type().(*types.Pointer); ok {
p.output.WriteString(getTypeStr(pt.Elem(), p.target))
} else {
p.output.WriteString(getTypeStr(val.Type(), p.target))
}
} else {
// TODO: Support heap allocation.
p.output.WriteString(" ; " + val.Name() + " = " + val.String())
}
p.output.WriteString("\n")
case *ssa.IndexAddr:
p.output.WriteString(" ; " + val.Name() + " = " + val.String() + "\n")
default: default:
p.output.WriteString(" ; " + val.Name() + " = " + val.String() + "\n") p.output.WriteString(" ; " + val.Name() + " = " + val.String() + "\n")
// panic("unsupported Value '" + val.Name() + " = " + val.String() + "'") // panic("unsupported Value '" + val.Name() + " = " + val.String() + "'")
......
...@@ -127,7 +127,6 @@ func getTypeStr(ty types.Type, target string) string { ...@@ -127,7 +127,6 @@ func getTypeStr(ty types.Type, target string) string {
"x86": "i32", "x86": "i32",
"x86_64": "i64", "x86_64": "i64",
} }
// fixed types // fixed types
expTy := map[types.BasicKind]string{ expTy := map[types.BasicKind]string{
types.Bool: "i1", types.Bool: "i1",
...@@ -162,6 +161,13 @@ func getTypeStr(ty types.Type, target string) string { ...@@ -162,6 +161,13 @@ func getTypeStr(ty types.Type, target string) string {
default: default:
panic("unknown basic type") panic("unknown basic type")
} }
case *types.Array:
return fmt.Sprintf("[%d x %s]", t.Len(), getTypeStr(t.Elem(), target))
case *types.Pointer:
return getTypeStr(t.Elem(), target) + "*"
default: default:
// TODO: support pointer, array and struct types // TODO: support pointer, array and struct types
panic("unknown type") panic("unknown type")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册