diff --git a/include/u.h b/include/u.h
index 489b2a3886b568c6e848b8bb110fb2f6adfed1e4..64f1a9b583f51a2a87baf6ca490d2104574611de 100644
--- a/include/u.h
+++ b/include/u.h
@@ -83,7 +83,7 @@ extern "C" {
 #ifdef _WIN32
 typedef jmp_buf sigjmp_buf;
 #endif
-typedef long p9jmp_buf[sizeof(sigjmp_buf)/sizeof(long)];
+typedef long p9jmp_buf[sizeof(sigjmp_buf)/(sizeof(long))];
 
 #if defined(__linux__)
 #	include <sys/types.h>
diff --git a/src/cmd/6c/txt.c b/src/cmd/6c/txt.c
index 3bdbf410eab9d461901fbdba1968673016a2db46..8008512a2f3db42b0e7b09bea9a5a44dbc72a7c9 100644
--- a/src/cmd/6c/txt.c
+++ b/src/cmd/6c/txt.c
@@ -992,7 +992,7 @@ gmove(Node *f, Node *t)
 			f->vconst &= 0xffff;
 			if(f->vconst & 0x8000){
 				f->vconst |= 0xffff0000;
-				f->vconst |= (vlong)~0 << 32;
+				f->vconst |= (vlong)((~(uvlong)0) << 32);
 			}
 			a = AMOVL;
 		}
@@ -1042,7 +1042,7 @@ gmove(Node *f, Node *t)
 			f->vconst &= 0xff;
 			if(f->vconst & 0x80){
 				f->vconst |= 0xffffff00;
-				f->vconst |= (vlong)~0 << 32;
+				f->vconst |= (vlong)((~(uvlong)0) << 32);
 			}
 			a = AMOVQ;
 		}
diff --git a/src/cmd/6g/peep.c b/src/cmd/6g/peep.c
index 24617836fed1bbc033a566a83543a7cb78cc15c6..deed9d2c0bf3abdb38fb274ad6280ddd731bec44 100644
--- a/src/cmd/6g/peep.c
+++ b/src/cmd/6g/peep.c
@@ -768,7 +768,7 @@ copyu(Prog *p, Adr *v, Adr *s)
 		return 3;
 
 	case ACALL:
-		if(REGEXT && v->type <= REGEXT && v->type > exregoffset)
+		if(REGEXT != 0 && v->type <= REGEXT && v->type > exregoffset)
 			return 2;
 		if(REGARG >= 0 && v->type == (uchar)REGARG)
 			return 2;
diff --git a/src/cmd/dist/build.c b/src/cmd/dist/build.c
index 8d82167b992045a02587113ad62cc50718de70de..614989b93a107fe0a1a389e268d12fdbf786bf0c 100644
--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -475,6 +475,7 @@ static char *proto_gccargs[] = {
 	"-Wstrict-prototypes",
 	"-Wextra",
 	"-Wunused",
+	"-Wno-unknown-warning-option",
 	"-Wno-sign-compare",
 	"-Wno-missing-braces",
 	"-Wno-parentheses",
@@ -482,6 +483,8 @@ static char *proto_gccargs[] = {
 	"-Wno-switch",
 	"-Wno-comment",
 	"-Wno-missing-field-initializers",
+	"-Wno-implicit-fallthrough",
+	"-Wno-stringop-truncation",
 	"-fno-common",
 	"-ggdb",
 	"-pipe",
diff --git a/src/cmd/ld/dwarf.c b/src/cmd/ld/dwarf.c
index dfe515c3c462907200fd45b1c43d35e740347c89..15db46c2dc428469dfe17400f84bcd0d9f0bd928 100644
--- a/src/cmd/ld/dwarf.c
+++ b/src/cmd/ld/dwarf.c
@@ -86,7 +86,7 @@ addrput(vlong addr)
 }
 
 static int
-uleb128enc(uvlong v, char* dst)
+uleb128enc(uvlong v, uchar* dst)
 {
 	uint8 c, len;
 
@@ -104,7 +104,7 @@ uleb128enc(uvlong v, char* dst)
 };
 
 static int
-sleb128enc(vlong v, char *dst)
+sleb128enc(vlong v, uchar *dst)
 {
 	uint8 c, s, len;
 
@@ -125,15 +125,15 @@ sleb128enc(vlong v, char *dst)
 static void
 uleb128put(vlong v)
 {
-	char buf[10];
-	strnput(buf, uleb128enc(v, buf));
+	uchar buf[10];
+	strnput((char*)buf, uleb128enc(v, buf));
 }
 
 static void
 sleb128put(vlong v)
 {
-	char buf[10];
-	strnput(buf, sleb128enc(v, buf));
+	uchar buf[10];
+	strnput((char*)buf, sleb128enc(v, buf));
 }
 
 /*
@@ -854,7 +854,7 @@ reversetree(DWDie** list)
 static void
 newmemberoffsetattr(DWDie *die, int32 offs)
 {
-	char block[10];
+	uchar block[10];
 	int i;
 
 	i = 0;
@@ -1471,7 +1471,7 @@ putpclcdelta(vlong delta_pc, vlong delta_lc)
 static void
 newcfaoffsetattr(DWDie *die, int32 offs)
 {
-	char block[10];
+	uchar block[10];
 	int i;
 
 	i = 0;
@@ -1760,7 +1760,7 @@ writeframes(void)
 	uleb128put(DWARFREGSP);	// register SP (**ABI-dependent, defined in l.h)
 	uleb128put(PtrSize);	// offset
 
-	cput(DW_CFA_offset + FAKERETURNCOLUMN);	 // return address
+	cput((char)(DW_CFA_offset + FAKERETURNCOLUMN));	 // return address
 	uleb128put(-PtrSize / DATAALIGNMENTFACTOR);  // at cfa - x*4
 
 	// 4 is to exclude the length field.
diff --git a/src/liblink/asm5.c b/src/liblink/asm5.c
index 96df9f79194bc8c555e50e6fa8ac9f24fa92a70a..b8aff1a384091f532424c0f3476b8f03a90d12de 100644
--- a/src/liblink/asm5.c
+++ b/src/liblink/asm5.c
@@ -298,7 +298,7 @@ static Optab	optab[] =
 	{ ASTREXD,	C_SOREG,C_REG,	C_REG,		92, 4, 0 },
 
 	{ APLD,		C_SOREG,C_NONE,	C_NONE,		95, 4, 0 },
-	
+
 	{ AUNDEF,		C_NONE,	C_NONE,	C_NONE,		96, 4, 0 },
 
 	{ ACLZ,		C_REG,	C_NONE,	C_REG,		97, 4, 0 },
@@ -644,11 +644,12 @@ span5(Link *ctxt, LSym *cursym)
 	int m, bflag, i, v, times;
 	int32 c, opc, out[6+3];
 	uchar *bp;
+	int debug = 0;
 
 	p = cursym->text;
 	if(p == nil || p->link == nil) // handle external functions and ELF section symbols
 		return;
- 
+
  	if(oprange[AAND].start == nil)
  		buildop(ctxt);
 
@@ -758,7 +759,7 @@ span5(Link *ctxt, LSym *cursym)
 				m = asmoutnacl(ctxt, c, p, o, nil);
 			if(p->pc != opc) {
 				bflag = 1;
-				//print("%P pc changed %d to %d in iter. %d\n", p, opc, (int32)p->pc, times);
+				if(debug) print("%P pc changed %d to %d in iter. %d\n", p, opc, (int32)p->pc, times);
 			}
 			c = p->pc + m;
 			if(m % 4 != 0 || p->pc % 4 != 0) {
@@ -912,7 +913,7 @@ addpool(Link *ctxt, Prog *p, Addr *a)
 		t.to.sym = a->sym;
 		t.to.type = a->type;
 		t.to.name = a->name;
-		
+
 		if(ctxt->flag_shared && t.to.sym != nil)
 			t.pcrel = p;
 		break;
@@ -1639,7 +1640,7 @@ if(0 /*debug['G']*/) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->na
 			rel->siz = 4;
 			rel->sym = p->to.sym;
 			rel->add = p->to.offset;
-			
+
 			// runtime.tlsg is special.
 			// Its "address" is the offset from the TLS thread pointer
 			// to the thread-local g and m pointers.
@@ -1829,7 +1830,7 @@ if(0 /*debug['G']*/) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->na
 			o1 |= p->to.reg << 16;
 			aclass(ctxt, &p->to);
 			break;
-	
+
 		case 39:	/* movm oreg,$con -> ldm */
 			o1 = (0x4 << 25) | (1 << 20);
 			o1 |= p->to.offset & 0xffff;
@@ -2305,7 +2306,7 @@ if(0 /*debug['G']*/) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->na
 			o1 = 0xe125be70;
 		break;
 	}
-	
+
 	out[0] = o1;
 	out[1] = o2;
 	out[2] = o3;