From e367ba9eaea80917c877709da365ff8f13cc60bd Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 10 Apr 2017 16:57:06 -0700 Subject: [PATCH] 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 --- src/cmd/asm/internal/asm/asm.go | 1 + src/cmd/compile/internal/gc/gsubr.go | 2 + src/cmd/internal/obj/plist.go | 61 ++++++++++++++++------------ 3 files changed, 38 insertions(+), 26 deletions(-) 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) -- 2.50.0