summaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/5g/ggen.c3
-rw-r--r--src/cmd/gc/go.h12
-rw-r--r--src/cmd/gc/subr.c30
-rwxr-xr-xsrc/cmd/gofmt/test.sh2
-rw-r--r--src/cmd/ld/go.c5
-rw-r--r--src/cmd/ld/pe.c11
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++)