From: Josh Bleecher Snyder Date: Mon, 10 Apr 2017 23:57:06 +0000 (-0700) Subject: cmd/internal/obj: refactor ATEXT symbol initialization X-Git-Tag: go1.9beta1~754 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e367ba9eaea80917c877709da365ff8f13cc60bd;p=gostls13.git cmd/internal/obj: refactor ATEXT symbol initialization This makes the core Flushplist loop clearer. We may also want to move the Sym initialization much earlier in the compiler (see discussion on CL 40254), for which this paves the way. While we're here, eliminate package log in favor of ctxt.Diag. Passes toolstash-check -all. Updates #15756 Change-Id: Ieaf848d196764a5aa82578b689af7bc6638c385a Reviewed-on: https://go-review.googlesource.com/40313 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Michael Hudson-Doyle --- diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go index e83cd7286d..0e31677a3f 100644 --- a/src/cmd/asm/internal/asm/asm.go +++ b/src/cmd/asm/internal/asm/asm.go @@ -176,6 +176,7 @@ func (p *Parser) asmText(word string, operands [][]lex.Token) { }, } prog.To.Val = int32(argSize) + p.ctxt.InitTextSym(prog) p.append(prog, "", true) } diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go index b22828f2e5..2c628a521f 100644 --- a/src/cmd/compile/internal/gc/gsubr.go +++ b/src/cmd/compile/internal/gc/gsubr.go @@ -185,6 +185,8 @@ func (pp *Progs) settext(fn *Node) { } } + Ctxt.InitTextSym(ptxt) + pp.Text = ptxt } diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index b79b39de8d..6614f7d74e 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -6,7 +6,6 @@ package obj import ( "fmt" - "log" "strings" ) @@ -42,33 +41,9 @@ func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc) { if s == nil { // func _() { } curtext = nil - continue } - if s.FuncInfo == nil { - s.FuncInfo = new(FuncInfo) - } - - if s.Text != nil { - log.Fatalf("duplicate TEXT for %s", s.Name) - } - if s.OnList() { - log.Fatalf("symbol %s listed multiple times", s.Name) - } - s.Set(AttrOnList, true) text = append(text, s) - flag := int(p.From3Offset()) - if flag&DUPOK != 0 { - s.Set(AttrDuplicateOK, true) - } - if flag&NOSPLIT != 0 { - s.Set(AttrNoSplit, true) - } - if flag&REFLECTMETHOD != 0 { - s.Set(AttrReflectMethod, true) - } - s.Type = STEXT - s.Text = p etext = p curtext = s continue @@ -137,13 +112,47 @@ func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc) { ctxt.Text = append(ctxt.Text, text...) } +func (ctxt *Link) InitTextSym(p *Prog) { + if p.As != ATEXT { + ctxt.Diag("InitTextSym non-ATEXT: %v", p) + } + s := p.From.Sym + if s == nil { + // func _() { } + return + } + if s.FuncInfo != nil { + ctxt.Diag("InitTextSym double init for %s", s.Name) + } + s.FuncInfo = new(FuncInfo) + if s.Text != nil { + ctxt.Diag("duplicate TEXT for %s", s.Name) + } + if s.OnList() { + ctxt.Diag("symbol %s listed multiple times", s.Name) + } + s.Set(AttrOnList, true) + flag := int(p.From3Offset()) + if flag&DUPOK != 0 { + s.Set(AttrDuplicateOK, true) + } + if flag&NOSPLIT != 0 { + s.Set(AttrNoSplit, true) + } + if flag&REFLECTMETHOD != 0 { + s.Set(AttrReflectMethod, true) + } + s.Type = STEXT + s.Text = p +} + func (ctxt *Link) Globl(s *LSym, size int64, flag int) { if s.SeenGlobl() { fmt.Printf("duplicate %v\n", s) } s.Set(AttrSeenGlobl, true) if s.OnList() { - log.Fatalf("symbol %s listed multiple times", s.Name) + ctxt.Diag("symbol %s listed multiple times", s.Name) } s.Set(AttrOnList, true) ctxt.Data = append(ctxt.Data, s)