}
// log.Printf("GLOBL %s %d, $%d", name, flag, size)
- p.ctxt.Globl(nameAddr.Sym, addr.Offset, int(flag))
+ p.ctxt.GloblPos(nameAddr.Sym, addr.Offset, int(flag), p.pos())
}
// asmPCData assembles a PCDATA pseudo-op.
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+TEXT foo(SB), 0, $0
+ RET
+TEXT foo(SB), 0, $0 // ERROR "symbol foo redeclared"
+ RET
+
+GLOBL bar(SB), 0, $8
+GLOBL bar(SB), 0, $8 // ERROR "symbol bar redeclared"
+
+DATA bar+0(SB)/8, $0
+DATA bar+0(SB)/8, $0 // ERROR "overlapping DATA entry for bar"
switch p.To.Sym.Name {
case "go_args_stackmap":
if p.From.Type != TYPE_CONST || p.From.Offset != objabi.FUNCDATA_ArgsPointerMaps {
- ctxt.Diag("FUNCDATA use of go_args_stackmap(SB) without FUNCDATA_ArgsPointerMaps")
+ ctxt.Diag("%s: FUNCDATA use of go_args_stackmap(SB) without FUNCDATA_ArgsPointerMaps", p.Pos)
}
p.To.Sym = ctxt.LookupDerived(curtext, curtext.Name+".args_stackmap")
case "no_pointers_stackmap":
if p.From.Type != TYPE_CONST || p.From.Offset != objabi.FUNCDATA_LocalsPointerMaps {
- ctxt.Diag("FUNCDATA use of no_pointers_stackmap(SB) without FUNCDATA_LocalsPointerMaps")
+ ctxt.Diag("%s: FUNCDATA use of no_pointers_stackmap(SB) without FUNCDATA_LocalsPointerMaps", p.Pos)
}
// funcdata for functions with no local variables in frame.
// Define two zero-length bitmaps, because the same index is used
return
}
if s.Func() != nil {
- ctxt.Diag("InitTextSym double init for %s", s.Name)
+ ctxt.Diag("%s: symbol %s redeclared\n\t%s: other declaration of symbol %s", ctxt.PosTable.Pos(start), s.Name, ctxt.PosTable.Pos(s.Func().Text.Pos), s.Name)
+ return
}
s.NewFuncInfo()
if s.OnList() {
- ctxt.Diag("symbol %s listed multiple times", s.Name)
+ ctxt.Diag("%s: symbol %s redeclared", ctxt.PosTable.Pos(start), s.Name)
+ return
}
// startLine should be the same line number that would be displayed via
}
func (ctxt *Link) Globl(s *LSym, size int64, flag int) {
+ ctxt.GloblPos(s, size, flag, src.NoXPos)
+}
+func (ctxt *Link) GloblPos(s *LSym, size int64, flag int, pos src.XPos) {
if s.OnList() {
- ctxt.Diag("symbol %s listed multiple times", s.Name)
+ // TODO: print where the first declaration was.
+ ctxt.Diag("%s: symbol %s redeclared", ctxt.PosTable.Pos(pos), s.Name)
}
s.Set(AttrOnList, true)
ctxt.Data = append(ctxt.Data, s)