diff options
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/5g/ggen.c | 3 | ||||
| -rw-r--r-- | src/cmd/gc/go.h | 12 | ||||
| -rw-r--r-- | src/cmd/gc/subr.c | 30 | ||||
| -rwxr-xr-x | src/cmd/gofmt/test.sh | 2 | ||||
| -rw-r--r-- | src/cmd/ld/go.c | 5 | ||||
| -rw-r--r-- | src/cmd/ld/pe.c | 11 |
6 files changed, 49 insertions, 14 deletions
diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c index e2f0e6bc0..3f5f47e7b 100644 --- a/src/cmd/5g/ggen.c +++ b/src/cmd/5g/ggen.c @@ -472,7 +472,7 @@ cgen_shift(int op, Node *nl, Node *nr, Node *res) { Node n1, n2, n3, nt, t, lo, hi; int w; - Prog *p1, *p2, *p3, *pbig; + Prog *p1, *p2, *p3; Type *tr; uvlong sc; @@ -505,7 +505,6 @@ cgen_shift(int op, Node *nl, Node *nr, Node *res) return; } - pbig = P; tr = nr->type; if(tr->width > 4) { tempname(&nt, nr->type); diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 449127292..da0fb5146 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -40,7 +40,17 @@ enum ASTRING, AINTER, ANILINTER, - AMEMWORD, + ASLICE, + AMEM8, + AMEM16, + AMEM32, + AMEM64, + AMEM128, + ANOEQ8, + ANOEQ16, + ANOEQ32, + ANOEQ64, + ANOEQ128, BADWIDTH = -1000000000, }; diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 96675be3f..1a05d43d0 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -493,8 +493,16 @@ algtype(Type *t) if(issimple[t->etype] || isptr[t->etype] || t->etype == TCHAN || t->etype == TFUNC || t->etype == TMAP) { - if(t->width == widthptr) - a = AMEMWORD; + if(t->width == 1) + a = AMEM8; + else if(t->width == 2) + a = AMEM16; + else if(t->width == 4) + a = AMEM32; + else if(t->width == 8) + a = AMEM64; + else if(t->width == 16) + a = AMEM128; else a = AMEM; // just bytes (int, ptr, etc) } else if(t->etype == TSTRING) @@ -503,8 +511,22 @@ algtype(Type *t) a = ANILINTER; // nil interface else if(t->etype == TINTER) a = AINTER; // interface - else - a = ANOEQ; // just bytes, but no hash/eq + else if(isslice(t)) + a = ASLICE; // slice + else { + if(t->width == 1) + a = ANOEQ8; + else if(t->width == 2) + a = ANOEQ16; + else if(t->width == 4) + a = ANOEQ32; + else if(t->width == 8) + a = ANOEQ64; + else if(t->width == 16) + a = ANOEQ128; + else + a = ANOEQ; // just bytes, but no hash/eq + } return a; } diff --git a/src/cmd/gofmt/test.sh b/src/cmd/gofmt/test.sh index 5dce2ed7a..3e63d0c26 100755 --- a/src/cmd/gofmt/test.sh +++ b/src/cmd/gofmt/test.sh @@ -43,7 +43,7 @@ apply1() { bug226.go | bug228.go | bug248.go | bug274.go | bug280.go | \ bug282.go | bug287.go | bug298.go | bug299.go | bug300.go | \ bug302.go | bug306.go | bug322.go | bug324.go | bug335.go | \ - bug340.go ) return ;; + bug340.go | bug349.go | bug351.go ) return ;; esac # the following directories are skipped because they contain test # cases for syntax errors and thus won't parse in the first place: diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c index cc0262f04..fd7278a7b 100644 --- a/src/cmd/ld/go.c +++ b/src/cmd/ld/go.c @@ -148,8 +148,11 @@ ldpkg(Biobuf *f, char *pkg, int64 len, char *filename, int whence) ; } } - if(strcmp(pkg, "main") == 0 && strcmp(name, "main") != 0) + if(strcmp(pkg, "main") == 0 && strcmp(name, "main") != 0) { fprint(2, "%s: %s: not package main (package %s)\n", argv0, filename, name); + nerrors++; + errorexit(); + } loadpkgdata(filename, pkg, p0, p1 - p0); } diff --git a/src/cmd/ld/pe.c b/src/cmd/ld/pe.c index 6608a97dc..334c9959f 100644 --- a/src/cmd/ld/pe.c +++ b/src/cmd/ld/pe.c @@ -101,7 +101,7 @@ static void chksectoff(IMAGE_SECTION_HEADER *h, vlong off) { if(off != h->PointerToRawData) { - diag("%s.PointerToRawData = %#llux, want %#llux", h->Name, (vlong)h->PointerToRawData, off); + diag("%s.PointerToRawData = %#llux, want %#llux", (char *)h->Name, (vlong)h->PointerToRawData, off); errorexit(); } } @@ -110,11 +110,11 @@ static void chksectseg(IMAGE_SECTION_HEADER *h, Segment *s) { if(s->vaddr-PEBASE != h->VirtualAddress) { - diag("%s.VirtualAddress = %#llux, want %#llux", h->Name, (vlong)h->VirtualAddress, (vlong)(s->vaddr-PEBASE)); + diag("%s.VirtualAddress = %#llux, want %#llux", (char *)h->Name, (vlong)h->VirtualAddress, (vlong)(s->vaddr-PEBASE)); errorexit(); } if(s->fileoff != h->PointerToRawData) { - diag("%s.PointerToRawData = %#llux, want %#llux", h->Name, (vlong)h->PointerToRawData, (vlong)(s->fileoff)); + diag("%s.PointerToRawData = %#llux, want %#llux", (char *)h->Name, (vlong)h->PointerToRawData, (vlong)(s->fileoff)); errorexit(); } } @@ -453,13 +453,14 @@ addsymtable(void) if(nextsymoff == 0) return; - size = nextsymoff + 4; + size = nextsymoff + 4 + 18; h = addpesection(".symtab", size, size); h->Characteristics = IMAGE_SCN_MEM_READ| IMAGE_SCN_MEM_DISCARDABLE; chksectoff(h, cpos()); fh.PointerToSymbolTable = cpos(); - fh.NumberOfSymbols = 0; + fh.NumberOfSymbols = 1; + strnput("", 18); // one empty symbol // put symbol string table lputl(size); for (i=0; i<nextsymoff; i++) |
