提交 9558eaea 编写于 作者: chai2010's avatar chai2010

合并分支

......@@ -43,11 +43,13 @@ func (p *Compiler) Compile(prog *loader.Program) (output string, err error) {
{
var f wir.Function
f.Name = "_start"
f.InternalName, f.ExternalName = "_start", "_start"
f.Insts = append(f.Insts, wat.NewInstCall("$waGlobalAlloc"))
n := wir.GetPkgMangleName(prog.SSAMainPkg.Pkg.Path()) + "init"
n, _ := wir.GetPkgMangleName(prog.SSAMainPkg.Pkg.Path())
n += ".init"
f.Insts = append(f.Insts, wat.NewInstCall(n))
n = wir.GetPkgMangleName(prog.SSAMainPkg.Pkg.Path()) + "main"
n, _ = wir.GetPkgMangleName(prog.SSAMainPkg.Pkg.Path())
n += ".main"
f.Insts = append(f.Insts, wat.NewInstCall(n))
p.module.AddFunc(&f)
}
......@@ -106,7 +108,7 @@ func (p *Compiler) CompilePkgFunc(ssaPkg *ssa.Package) {
if len(v.LinkName()) > 0 {
fn_name = v.LinkName()
} else {
fn_name = GetFnMangleName(v)
fn_name, _ = GetFnMangleName(v)
}
sig := wir.NewFnSigFromSignature(v.Signature)
......
......@@ -139,7 +139,7 @@ func (g *functionGenerator) getValue(i ssa.Value) valueWrap {
return nv
case *ssa.Function:
fn_name := GetFnMangleName(v)
fn_name, _ := GetFnMangleName(v)
fn_sig := wir.NewFnSigFromSignature(v.Signature)
return valueWrap{value: wir.GenConstFnValue(fn_name, fn_sig)}
......@@ -152,9 +152,10 @@ func (g *functionGenerator) getValue(i ssa.Value) valueWrap {
func (g *functionGenerator) genFunction(f *ssa.Function) *wir.Function {
var wir_fn wir.Function
if len(f.LinkName()) > 0 {
wir_fn.Name = f.LinkName()
wir_fn.InternalName = f.LinkName()
wir_fn.ExternalName = f.LinkName()
} else {
wir_fn.Name = GetFnMangleName(f)
wir_fn.InternalName, wir_fn.ExternalName = GetFnMangleName(f)
}
rets := f.Signature.Results()
......@@ -451,7 +452,8 @@ func (g *functionGenerator) genCall(inst *ssa.Call) (insts []wat.Inst, ret_type
if len(callee.LinkName()) > 0 {
insts = append(insts, wat.NewInstCall(callee.LinkName()))
} else {
insts = append(insts, wat.NewInstCall(GetFnMangleName(callee)))
fn_internal_name, _ := GetFnMangleName(callee)
insts = append(insts, wat.NewInstCall(fn_internal_name))
}
case *ssa.Builtin:
......@@ -659,10 +661,11 @@ func (g *functionGenerator) genExtract(inst *ssa.Extract) ([]wat.Inst, wir.Value
func (g *functionGenerator) genFiled(inst *ssa.Field) ([]wat.Inst, wir.ValueType) {
x := g.getValue(inst.X)
field := inst.X.Type().Underlying().(*types.Struct).Field(inst.Field)
fieldname := field.Name()
fieldname := wir.GenSymbolName(field.Name())
if field.Embedded() {
if _, ok := field.Type().(*types.Named); ok {
fieldname = wir.GetPkgMangleName(field.Pkg().Path()) + fieldname
pkgname, _ := wir.GetPkgMangleName(field.Pkg().Path())
fieldname = pkgname + "." + fieldname
}
fieldname = "$" + fieldname
}
......@@ -672,10 +675,11 @@ func (g *functionGenerator) genFiled(inst *ssa.Field) ([]wat.Inst, wir.ValueType
func (g *functionGenerator) genFieldAddr(inst *ssa.FieldAddr) ([]wat.Inst, wir.ValueType) {
field := inst.X.Type().Underlying().(*types.Pointer).Elem().Underlying().(*types.Struct).Field(inst.Field)
fieldname := field.Name()
fieldname := wir.GenSymbolName(field.Name())
if field.Embedded() {
if _, ok := field.Type().(*types.Named); ok {
fieldname = wir.GetPkgMangleName(field.Pkg().Path()) + fieldname
pkgname, _ := wir.GetPkgMangleName(field.Pkg().Path())
fieldname = pkgname + "." + fieldname
}
fieldname = "$" + fieldname
}
......@@ -772,14 +776,16 @@ func (g *functionGenerator) genMakeClosre_Anonymous(inst *ssa.MakeClosure) (inst
feild := wir.NewField(freevar.Name(), wir.ToWType(freevar.Type()))
fields = append(fields, feild)
}
st_name := GetFnMangleName(f) + ".$warpdata"
fn_internal_name, _ := GetFnMangleName(f)
st_name := fn_internal_name + ".$warpdata"
st_free_data = wir.NewStruct(st_name, fields)
}
var warp_fn_index int
{
var warp_fn wir.Function
warp_fn.Name = GetFnMangleName(f) + ".$warpfn"
fn_name, _ := GetFnMangleName(f)
warp_fn.InternalName = fn_name + ".$warpfn"
for _, i := range f.Params {
pa := valueWrap{value: wir.NewLocal(i.Name(), wir.ToWType(i.Type()))}
warp_fn.Params = append(warp_fn.Params, pa.value)
......@@ -797,10 +803,10 @@ func (g *functionGenerator) genMakeClosre_Anonymous(inst *ssa.MakeClosure) (inst
warp_fn.Insts = append(warp_fn.Insts, i.EmitPush()...)
}
warp_fn.Insts = append(warp_fn.Insts, wat.NewInstCall(GetFnMangleName(f)))
warp_fn.Insts = append(warp_fn.Insts, wat.NewInstCall(fn_name))
g.module.AddFunc(&warp_fn)
warp_fn_index = g.module.AddTableElem(warp_fn.Name)
warp_fn_index = g.module.AddTableElem(warp_fn.InternalName)
}
closure := g.addRegister(wir.NewClosure(wir.NewFnSigFromSignature(f.Signature)))
......@@ -842,7 +848,8 @@ func (g *functionGenerator) genMakeClosre_Bound(inst *ssa.MakeClosure) (insts []
var warp_fn_index int
{
var warp_fn wir.Function
warp_fn.Name = GetFnMangleName(f.Object()) + ".$bound"
fn_name, _ := GetFnMangleName(f.Object())
warp_fn.InternalName = fn_name + ".$bound"
for _, i := range f.Params {
pa := valueWrap{value: wir.NewLocal(i.Name(), wir.ToWType(i.Type()))}
warp_fn.Params = append(warp_fn.Params, pa.value)
......@@ -860,10 +867,10 @@ func (g *functionGenerator) genMakeClosre_Bound(inst *ssa.MakeClosure) (insts []
warp_fn.Insts = append(warp_fn.Insts, i.EmitPush()...)
}
warp_fn.Insts = append(warp_fn.Insts, wat.NewInstCall(GetFnMangleName(f.Object())))
warp_fn.Insts = append(warp_fn.Insts, wat.NewInstCall(fn_name))
g.module.AddFunc(&warp_fn)
warp_fn_index = g.module.AddTableElem(warp_fn.Name)
warp_fn_index = g.module.AddTableElem(warp_fn.InternalName)
}
closure := g.addRegister(wir.NewClosure(wir.NewFnSigFromSignature(f.Signature)))
......@@ -894,9 +901,10 @@ func (g *functionGenerator) addRegister(typ wir.ValueType) wir.Value {
func (g *functionGenerator) genGetter(f *ssa.Function) *wir.Function {
var wir_fn wir.Function
if len(f.LinkName()) > 0 {
wir_fn.Name = f.LinkName()
wir_fn.InternalName = f.LinkName()
wir_fn.ExternalName = f.LinkName()
} else {
wir_fn.Name = GetFnMangleName(f)
wir_fn.InternalName, wir_fn.ExternalName = GetFnMangleName(f)
}
rets := f.Signature.Results()
......@@ -927,9 +935,10 @@ func (g *functionGenerator) genGetter(f *ssa.Function) *wir.Function {
func (g *functionGenerator) genSetter(f *ssa.Function) *wir.Function {
var wir_fn wir.Function
if len(f.LinkName()) > 0 {
wir_fn.Name = f.LinkName()
wir_fn.InternalName = f.LinkName()
wir_fn.ExternalName = f.LinkName()
} else {
wir_fn.Name = GetFnMangleName(f)
wir_fn.InternalName, wir_fn.ExternalName = GetFnMangleName(f)
}
rets := f.Signature.Results()
......
......@@ -12,10 +12,11 @@ func (p *Compiler) compileGlobal(g *ssa.Global) {
if len(g.LinkName()) > 0 {
p.module.AddGlobal(g.LinkName(), wir.ToWType(g.Type().(*types.Pointer).Elem()), false, g)
} else {
pkg_name, _ := wir.GetPkgMangleName(g.Pkg.Pkg.Path())
if g.Name() == "init$guard" {
p.module.AddGlobal(wir.GetPkgMangleName(g.Pkg.Pkg.Path())+g.Name(), wir.ToWType(g.Type().(*types.Pointer).Elem()), false, g)
p.module.AddGlobal(pkg_name+"."+g.Name(), wir.ToWType(g.Type().(*types.Pointer).Elem()), false, g)
} else {
p.module.AddGlobal(wir.GetPkgMangleName(g.Pkg.Pkg.Path())+g.Name(), wir.NewPointer(wir.ToWType(g.Type().(*types.Pointer).Elem())), true, g)
p.module.AddGlobal(pkg_name+"."+wir.GenSymbolName(g.Name()), wir.NewPointer(wir.ToWType(g.Type().(*types.Pointer).Elem())), true, g)
}
}
//logger.Fatal("Todo")
......
......@@ -8,45 +8,63 @@ import (
"wa-lang.org/wa/internal/types"
)
func GetFnMangleName(v interface{}) string {
var name string
func GetFnMangleName(v interface{}) (internal string, external string) {
switch f := v.(type) {
case *ssa.Function:
name = wir.GetPkgMangleName(f.Pkg.Pkg.Path())
internal, external = wir.GetPkgMangleName(f.Pkg.Pkg.Path())
if recv := f.Signature.Recv(); recv != nil {
internal += "."
external += "."
switch rt := recv.Type().(type) {
case *types.Named:
name += rt.Obj().Name()
internal += wir.GenSymbolName(rt.Obj().Name())
external += rt.Obj().Name()
case *types.Pointer:
btype, ok := rt.Elem().(*types.Named)
if !ok {
panic("Unreachable")
}
name += btype.Obj().Name()
internal += wir.GenSymbolName(btype.Obj().Name())
external += btype.Obj().Name()
default:
panic("Unreachable")
}
name += "."
}
name += f.Name()
internal += "."
external += "."
internal += wir.GenSymbolName(f.Name())
external += f.Name()
case *types.Func:
name = wir.GetPkgMangleName(f.Pkg().Path())
internal, external = wir.GetPkgMangleName(f.Pkg().Path())
sig := f.Type().(*types.Signature)
if recv := sig.Recv(); recv != nil {
internal += "."
external += "."
switch rt := recv.Type().(type) {
case *types.Named:
name += rt.Obj().Name()
internal += wir.GenSymbolName(rt.Obj().Name())
external += rt.Obj().Name()
case *types.Pointer:
btype, ok := rt.Elem().(*types.Named)
if !ok {
panic("Unreachable")
}
name += btype.Obj().Name()
internal += wir.GenSymbolName(btype.Obj().Name())
external += btype.Obj().Name()
default:
panic("Unreachable")
}
name += "."
}
name += f.Name()
internal += "."
external += "."
internal += wir.GenSymbolName(f.Name())
external += f.Name()
}
return name
return internal, external
}
......@@ -7,7 +7,7 @@ import "wa-lang.org/wa/internal/backends/compiler_wat/wir/wat"
func (f *Function) ToWatFunc() *wat.Function {
var wat_func wat.Function
wat_func.Name = f.Name
wat_func.InternalName, wat_func.ExternalName = f.InternalName, f.ExternalName
for _, r := range f.Results {
wat_func.Results = append(wat_func.Results, r.Raw()...)
......
......@@ -108,9 +108,9 @@ func (m *Module) findFunc(fn_name string) *Function {
}
func (m *Module) AddFunc(f *Function) {
if m.findFunc(f.Name) == nil {
if m.findFunc(f.InternalName) == nil {
m.funcs = append(m.funcs, f)
m.funcs_map[f.Name] = f
m.funcs_map[f.InternalName] = f
}
}
......@@ -140,7 +140,7 @@ func (m *Module) AddDataSeg(data []byte) (ptr int) {
func (m *Module) genGlobalAlloc() *Function {
var f Function
f.Name = "$waGlobalAlloc"
f.InternalName = "$waGlobalAlloc"
for _, g := range m.globals {
if g.Kind() != ValueKindGlobal_Pointer {
......
......@@ -3,7 +3,9 @@
package wir
import (
"strconv"
"strings"
"unicode/utf8"
"wa-lang.org/wa/internal/types"
......@@ -88,10 +90,12 @@ func ToWType(from types.Type) ValueType {
if f.Embedded() {
fs = append(fs, NewField("$"+wtyp.Name(), wtyp))
} else {
fs = append(fs, NewField(f.Name(), wtyp))
fs = append(fs, NewField(GenSymbolName(f.Name()), wtyp))
}
}
return NewStruct(GetPkgMangleName(t.Obj().Pkg().Path())+t.Obj().Name(), fs)
pkg_name, _ := GetPkgMangleName(t.Obj().Pkg().Path())
obj_name := GenSymbolName(t.Obj().Name())
return NewStruct(pkg_name+"."+obj_name, fs)
case *types.Signature:
sig := NewFnSigFromSignature(ut)
......@@ -127,8 +131,33 @@ func IsNumber(v Value) bool {
return false
}
func GetPkgMangleName(pkg_path string) string {
return strings.ReplaceAll(pkg_path, "/", "$") + "."
func GetPkgMangleName(pkg_path string) (string, string) {
var symbol_name, exp_name string
for i := strings.IndexAny(pkg_path, "/\\"); i != -1; i = strings.IndexAny(pkg_path, "/\\") {
p := pkg_path[:i]
pkg_path = pkg_path[i+1:]
exp_name += p
exp_name += "$"
symbol_name += GenSymbolName(p)
symbol_name += "$"
}
exp_name += pkg_path
symbol_name += GenSymbolName(pkg_path)
return symbol_name, exp_name
}
func GenSymbolName(src string) string {
if len(src) == utf8.RuneCountInString(src) {
return src
}
s := "$0x"
for i := 0; i < len(src); i++ {
s += strconv.FormatUint(uint64(src[i]), 16)
}
return s
}
func ExtractField(x Value, field_name string) Value {
......
......@@ -29,8 +29,8 @@ func (t Block) Equal(u ValueType) bool {
}
func (t Block) onFree() int {
var f Function
f.Name = "$" + t.Name() + ".$$onFree"
if i := currentModule.findTableElem(f.Name); i != 0 {
f.InternalName = "$" + GenSymbolName(t.Name()) + ".$$onFree"
if i := currentModule.findTableElem(f.InternalName); i != 0 {
return i
}
......@@ -45,7 +45,7 @@ func (t Block) onFree() int {
f.Insts = append(f.Insts, wat.NewInstStore(wat.U32{}, 0, 1))
currentModule.AddFunc(&f)
return currentModule.AddTableElem(f.Name)
return currentModule.AddTableElem(f.InternalName)
}
func (t Block) EmitLoadFromAddr(addr Value, offset int) (insts []wat.Inst) {
......
......@@ -113,13 +113,13 @@ func (t Slice) emitGenFromRefOfArray(x *aRef, low, high Value) (insts []wat.Inst
}
func (t Slice) genAppendFunc() string {
fn_name := "$" + t.Name() + ".append"
fn_name := "$" + GenSymbolName(t.Name()) + ".append"
if currentModule.findFunc(fn_name) != nil {
return fn_name
}
var f Function
f.Name = fn_name
f.InternalName = fn_name
x := newValueSlice("x", ValueKindLocal, t.Base)
y := newValueSlice("y", ValueKindLocal, t.Base)
f.Params = append(f.Params, x)
......
......@@ -42,7 +42,7 @@ func (t String) genAppendStrFunc() string {
}
var f Function
f.Name = fn_name
f.InternalName = fn_name
x := newValueString("x", ValueKindLocal)
y := newValueString("y", ValueKindLocal)
f.Params = append(f.Params, x)
......
......@@ -89,9 +89,9 @@ func (t Struct) genRawFree() (ret []fn_offset_pair) {
func (t Struct) onFree() int {
var f Function
f.Name = "$" + t.Name() + ".$$onFree"
f.InternalName = "$" + GenSymbolName(t.Name()) + ".$$onFree"
if i := currentModule.findTableElem(f.Name); i != 0 {
if i := currentModule.findTableElem(f.InternalName); i != 0 {
return i
}
......@@ -113,29 +113,7 @@ func (t Struct) onFree() int {
f.Insts = append(f.Insts, wat.NewInstCallIndirect("$onFree"))
}
currentModule.AddFunc(&f)
return currentModule.AddTableElem(f.Name)
/* has_free := false
for _, member := range t.Members {
member_free_func := member.Type().onFree(module)
if member_free_func == 0 {
continue
}
f.Insts = append(f.Insts, ptr.EmitPush()...)
f.Insts = append(f.Insts, wat.NewInstConst(wat.I32{}, strconv.Itoa(member._start)))
f.Insts = append(f.Insts, wat.NewInstAdd(wat.I32{}))
f.Insts = append(f.Insts, wat.NewInstConst(wat.I32{}, strconv.Itoa(member_free_func)))
f.Insts = append(f.Insts, wat.NewInstCallIndirect("$onFree"))
has_free = true
}
if has_free {
return module.addTableFunc(&f)
}
return 0 //*/
return currentModule.AddTableElem(f.InternalName)
}
func (t Struct) Raw() []wat.ValueType {
......
......@@ -3,7 +3,10 @@
package wat
func (f *Function) Format(indent string) string {
s := indent + "(func $" + f.Name + " (export \"" + f.Name + "\")"
s := indent + "(func $" + f.InternalName
if len(f.ExternalName) > 0 {
s += " (export \"" + f.ExternalName + "\")"
}
for _, param := range f.Params {
s += " (param $" + param.Name() + " " + param.Type().Name() + ")"
......@@ -28,7 +31,7 @@ func (f *Function) Format(indent string) string {
s += inst.Format(indent+" ") + "\n"
}
s += indent + ") ;;" + f.Name
s += indent + ") ;;" + f.InternalName
return s
}
......
......@@ -16,10 +16,11 @@ type Import interface {
Function:
**************************************/
type Function struct {
Name string
Results []ValueType
Params []Value
Locals []Value
InternalName string
ExternalName string
Results []ValueType
Params []Value
Locals []Value
Insts []Inst
}
......
......@@ -12,10 +12,11 @@ var currentModule *Module
Function:
**************************************/
type Function struct {
Name string
Results []ValueType
Params []Value
Locals []Value
InternalName string
ExternalName string
Results []ValueType
Params []Value
Locals []Value
Insts []wat.Inst
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册