// walk symtab accumulating path names for use by pc/ln table. // don't need the full generality of the z entry history stack because // there are no includes in go (and only sensible includes in our c); // assume code only appear in top-level files. static void dosrcline(Sym *sym) { static byte srcbuf[1000]; static struct { String srcstring; int32 aline; int32 delta; } files[200]; static int32 incstart; static int32 nfunc, nfile, nhist; Func *f; int32 i, l; switch(sym->symtype) { case 't': case 'T': if(hugestring.str == nil) break; if(runtime·strcmp(sym->name, (byte*)"etext") == 0) break; f = &func[nfunc++]; // find source file for(i = 0; i < nfile - 1; i++) { if (files[i+1].aline > f->ln0) break; } f->src = files[i].srcstring; f->ln0 -= files[i].delta; break; case 'z': if(sym->value == 1) { // entry for main source file for a new object. l = makepath(srcbuf, sizeof srcbuf, sym->name+1); nhist = 0; nfile = 0; if(nfile == nelem(files)) return; files[nfile].srcstring = gostringn(srcbuf, l); files[nfile].aline = 0; files[nfile++].delta = 0; } else { // push or pop of included file. l = makepath(srcbuf, sizeof srcbuf, sym->name+1); if(srcbuf[0] != '\0') { if(nhist++ == 0) incstart = sym->value; if(nhist == 0 && nfile < nelem(files)) { // new top-level file files[nfile].srcstring = gostringn(srcbuf, l); files[nfile].aline = sym->value; // this is "line 0" files[nfile++].delta = sym->value - 1; } }else{ if(--nhist == 0) files[nfile-1].delta += sym->value - incstart; } } } }
void ·_Cfunc_GoStringN(int8 *p, int32 l, String s) { s = runtime·gostringn((byte*)p, l); FLUSH(&s); }