Commit 77a70ddb authored by Alex Brainman's avatar Alex Brainman

gc: fix symbol table generation on windows

gc records full, '/' delimited, filenames now.

R=rsc
CC=golang-dev
https://golang.org/cl/1962042
parent acb695f4
...@@ -918,6 +918,7 @@ char* lexname(int lex); ...@@ -918,6 +918,7 @@ char* lexname(int lex);
void mkpackage(char* pkgname); void mkpackage(char* pkgname);
void unimportfile(void); void unimportfile(void);
int32 yylex(void); int32 yylex(void);
extern int windows;
extern int yylast; extern int yylast;
extern int yyprev; extern int yyprev;
......
...@@ -73,42 +73,97 @@ Bputname(Biobuf *b, Sym *s) ...@@ -73,42 +73,97 @@ Bputname(Biobuf *b, Sym *s)
Bwrite(b, s->name, strlen(s->name)+1); Bwrite(b, s->name, strlen(s->name)+1);
} }
static void
outzfile(Biobuf *b, char *p)
{
char *q, *q2;
while(p) {
q = utfrune(p, '/');
if(windows) {
q2 = utfrune(p, '\\');
if(q2 && (!q || q2 < q))
q = q2;
}
if(!q) {
zfile(b, p, strlen(p));
return;
}
if(q > p)
zfile(b, p, q-p);
p = q + 1;
}
}
#define isdelim(c) (c == '/' || c == '\\')
static void
outwinname(Biobuf *b, Hist *h, char *ds, char *p)
{
if(isdelim(p[0])) {
// full rooted name
zfile(b, ds, 3); // leading "c:/"
outzfile(b, p+1);
} else {
// relative name
if(h->offset == 0 && pathname && pathname[1] == ':') {
if(tolowerrune(ds[0]) == tolowerrune(pathname[0])) {
// using current drive
zfile(b, pathname, 3); // leading "c:/"
outzfile(b, pathname+3);
} else {
// using drive other then current,
// we don't have any simple way to
// determine current working directory
// there, therefore will output name as is
zfile(b, ds, 2); // leading "c:"
}
}
outzfile(b, p);
}
}
static void static void
outhist(Biobuf *b) outhist(Biobuf *b)
{ {
Hist *h; Hist *h;
char *p, *q, *op; char *p, ds[] = {'c', ':', '/', 0};
int n;
for(h = hist; h != H; h = h->link) { for(h = hist; h != H; h = h->link) {
p = h->name; p = h->name;
op = 0; if(p) {
if(windows) {
if(p && p[0] != '/' && h->offset == 0 && pathname && pathname[0] == '/') { // if windows variable is set, then, we know already,
op = p; // pathname is started with windows drive specifier
p = pathname; // and all '\' were replaced with '/' (see lex.c)
} if(isdelim(p[0]) && isdelim(p[1])) {
// file name has network name in it,
while(p) { // like \\server\share\dir\file.go
q = utfrune(p, '/'); zfile(b, "//", 2); // leading "//"
if(q) { outzfile(b, p+2);
n = q-p; } else if(p[1] == ':') {
if(n == 0) // file name has drive letter in it
n = 1; // leading "/" ds[0] = p[0];
q++; outwinname(b, h, ds, p+2);
} else {
// no drive letter in file name
outwinname(b, h, pathname, p);
}
} else { } else {
n = strlen(p); if(p[0] == '/') {
q = 0; // full rooted name, like /home/rsc/dir/file.go
} zfile(b, "/", 1); // leading "/"
if(n) outzfile(b, p+1);
zfile(b, p, n); } else {
p = q; // relative name, like dir/file.go
if(p == 0 && op) { if(h->offset == 0 && pathname && pathname[0] == '/') {
p = op; zfile(b, "/", 1); // leading "/"
op = 0; outzfile(b, pathname+1);
}
outzfile(b, p);
}
} }
} }
zhist(b, h->line, h->offset); zhist(b, h->line, h->offset);
} }
} }
......
...@@ -189,7 +189,6 @@ endif ...@@ -189,7 +189,6 @@ endif
# Disable tests that windows cannot run yet. # Disable tests that windows cannot run yet.
ifeq ($(GOOS),windows) ifeq ($(GOOS),windows)
NOTEST+=exec # no pipe NOTEST+=exec # no pipe
NOTEST+=log # no runtime.Caller
NOTEST+=os # many things unimplemented NOTEST+=os # many things unimplemented
NOTEST+=os/signal # no signals NOTEST+=os/signal # no signals
NOTEST+=path # tree walking does not work NOTEST+=path # tree walking does not work
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment