code: func pctofileline(ctxt *Link, sym *LSym, oldval int, p *Prog, phase int, arg interface{}) int {
  	var i int
  	var l int
  	var f *LSym
  	var pcln *Pcln
  	if p.As == ctxt.Arch.ATEXT || p.As == ctxt.Arch.ANOP || p.As == ctxt.Arch.AUSEFIELD || p.Lineno == 0 || phase == 1 {
  		return oldval
  	}
  	linkgetline(ctxt, p.Lineno, &f, &l)
  	if f == nil {
  		//	print("getline failed for %s %P\n", ctxt->cursym->name, p);
  		return oldval
  	}
  	if arg == nil {
  		return l
  	}
  	pcln = arg.(*Pcln)
  	if f == pcln.Lastfile {
  		return pcln.Lastindex
  	}
  	for i = 0; i < len(pcln.File); i++ {
  		if pcln.File[i] == f {
  			pcln.Lastfile = f
  			pcln.Lastindex = i
  			return i
  		}
  	}
  	pcln.File = append(pcln.File, f)
  	pcln.Lastfile = f
  	pcln.Lastindex = i
  	return i
  }
docs: // pctofileline computes either the file number (arg == 0)
  // or the line number (arg == 1) to use at p.
  // Because p->lineno applies to p, phase == 0 (before p)
  // takes care of the update.