]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/compile/internal/gc/pgen.go
[dev.ssa] Merge remote-tracking branch 'origin/master' into mergebranch
[gostls13.git] / src / cmd / compile / internal / gc / pgen.go
index ea9b3687e121a0b70a1089d670c8be345a7721ce..c0d4a9f5b2ffa85a4b175561e459915a6416ab15 100644 (file)
@@ -5,6 +5,7 @@
 package gc
 
 import (
+       "cmd/compile/internal/ssa"
        "cmd/internal/obj"
        "crypto/md5"
        "fmt"
@@ -341,7 +342,11 @@ func compile(fn *Node) {
                Deferreturn = Sysfunc("deferreturn")
                Panicindex = Sysfunc("panicindex")
                panicslice = Sysfunc("panicslice")
+               panicdivide = Sysfunc("panicdivide")
                throwreturn = Sysfunc("throwreturn")
+               growslice = Sysfunc("growslice")
+               typedmemmove_nostore = Sysfunc("typedmemmove_nostore")
+               panicdottype = Sysfunc("panicdottype")
        }
 
        lno := setlineno(fn)
@@ -358,6 +363,8 @@ func compile(fn *Node) {
        var nam *Node
        var gcargs *Sym
        var gclocals *Sym
+       var ssafn *ssa.Func
+       var usessa bool
        if fn.Nbody == nil {
                if pure_go != 0 || strings.HasPrefix(fn.Func.Nname.Sym.Name, "init.") {
                        Yyerror("missing function body for %q", fn.Func.Nname.Sym.Name)
@@ -409,6 +416,12 @@ func compile(fn *Node) {
                goto ret
        }
 
+       // Build an SSA backend function.
+       // TODO: get rid of usessa.
+       if Thearch.Thestring == "amd64" {
+               ssafn, usessa = buildssa(Curfn)
+       }
+
        continpc = nil
        breakpc = nil
 
@@ -472,6 +485,13 @@ func compile(fn *Node) {
                }
        }
 
+       if ssafn != nil && usessa {
+               genssa(ssafn, ptxt, gcargs, gclocals)
+               if Curfn.Func.Endlineno != 0 {
+                       lineno = Curfn.Func.Endlineno
+               }
+               return
+       }
        Genlist(Curfn.Func.Enter)
        Genlist(Curfn.Nbody)
        gclean()