diff --git a/src/cmd/6l/6.out.h b/src/cmd/6l/6.out.h
index 8006826405aaf2fbc132e17bb2faa825c27c2f50..6473bc0bb25c192d5e2e3d8d31f64612687085ff 100644
--- a/src/cmd/6l/6.out.h
+++ b/src/cmd/6l/6.out.h
@@ -32,6 +32,7 @@
 #define	NSNAME	8
 #define NOPROF	(1<<0)
 #define DUPOK	(1<<1)
+#define SOFmark	(11)
 
 /*
  *	amd64
diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c
index 3ae914afe4553bd1946d4e411b1711bf0548ec52..fca576fa6eaa8e5112373c9505e01ac943d6d8b1 100644
--- a/src/cmd/6l/asm.c
+++ b/src/cmd/6l/asm.c
@@ -138,7 +138,8 @@ asmb(void)
 	for(p = firstp; p != P; p = p->link) {
 		if(p->as == ATEXT)
 			curtext = p;
-		if(p->pc != pc) {
+		if(p->pc != pc)
+		if(p->as != ATEXT || p->pc != pc+SOFmark) {
 			if(!debug['a'])
 				print("%P\n", curp);
 			diag("phase error %llux sb %llux in %s", p->pc, pc, TNAME);
diff --git a/src/cmd/6l/l.h b/src/cmd/6l/l.h
index bb5c0a850d44c6cfe41ec93971cf403221895ec3..5e437cd3805cd9bec5f397127d1e8e5929fb1550 100644
--- a/src/cmd/6l/l.h
+++ b/src/cmd/6l/l.h
@@ -217,6 +217,7 @@ enum
 	Zaut_r,
 	Zo_m,
 	Zo_m64,
+	Ztext,
 	Zpseudo,
 	Zr_m,
 	Zr_m_xm,
diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c
index fb84209504b4e454406f71787a1712bf6cd77f79..47339fe7e018d073ee336c454c58f721e3b3c722 100644
--- a/src/cmd/6l/obj.c
+++ b/src/cmd/6l/obj.c
@@ -925,7 +925,9 @@ loop:
 			sig = 1729;
 		if(sig != 0){
 			if(s->sig != 0 && s->sig != sig)
-				diag("incompatible type signatures %lux(%s) and %lux(%s) for %s", s->sig, filen[s->file], sig, pn, s->name);
+				diag("incompatible type signatures %lux(%s)"
+					"and %lux(%s) for %s", s->sig,
+					filen[s->file], sig, pn, s->name);
 			s->sig = sig;
 			s->file = files-1;
 		}
diff --git a/src/cmd/6l/optab.c b/src/cmd/6l/optab.c
index d99797166254cfc890d737eb31b5cd13dbfb9119..f07eb18df26e06c99e0f1f0ce8ca69bd1729e12e 100644
--- a/src/cmd/6l/optab.c
+++ b/src/cmd/6l/optab.c
@@ -37,7 +37,7 @@ uchar	ynone[] =
 };
 uchar	ytext[] =
 {
-	Ymb,	Yi32,	Zpseudo,1,
+	Ymb,	Yi32,	Ztext,	1,
 	0
 };
 uchar	ynop[] =
diff --git a/src/cmd/6l/span.c b/src/cmd/6l/span.c
index 4b225da8caafdc0600fc4114184f277a584a80ae..4ade9e3d1f9b5518de5cc8a98e113271bbc15bd8 100644
--- a/src/cmd/6l/span.c
+++ b/src/cmd/6l/span.c
@@ -83,6 +83,8 @@ start:
 				p->pc = c;
 		asmins(p);
 		p->pc = c;
+		if(p->as == ATEXT)
+			p->pc += SOFmark;	// skip the stack marker
 		m = andptr-and;
 		p->mark = m;
 		c += m;
@@ -113,6 +115,8 @@ loop:
 			}
 		}
 		p->pc = c;
+		if(p->as == ATEXT)
+			p->pc += SOFmark;	// skip the stack marker
 		c += p->mark;
 	}
 	if(again) {
@@ -269,7 +273,7 @@ asmlc(void)
 	Prog *p;
 	long oldlc, v, s;
 
-	oldpc = INITTEXT;
+	oldpc = INITTEXT+SOFmark;
 	oldlc = 0;
 	for(p = firstp; p != P; p = p->link) {
 		if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) {
@@ -1120,6 +1124,19 @@ found:
 		diag("asmins: unknown z %d %P", t[2], p);
 		return;
 
+	case Ztext:
+		v = p->to.offset;
+		if(v < 0)
+			v = 0;
+
+		// eleven bytes of buried stack offset
+		*andptr++ = v>>3;
+		*andptr++ = v>>11;
+		*andptr++ = v>>19;
+		for(v=0; v<SOFmark-3; v++)
+			*andptr++ = "\xa7\xf1\xd9\x2a\x82\xc8\xd8\xfe"[v];
+		break;
+
 	case Zpseudo:
 		break;