cmd/internal/obj: fix build breakage from making From3 a pointer

Change-Id: I55a7f455ebbd6b1bd6912aae82c0fcff6f43387c
Reviewed-on: https://go-review.googlesource.com/10512
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go
index 53f08a3..9537fce 100644
--- a/src/cmd/internal/obj/arm64/asm7.go
+++ b/src/cmd/internal/obj/arm64/asm7.go
@@ -2101,7 +2101,7 @@
 			}
 		} else {
 			/* CSET */
-			if p.From3.Type != obj.TYPE_NONE {
+			if p.From3Type() != obj.TYPE_NONE {
 				ctxt.Diag("invalid combination\n%v", p)
 			}
 			rf = REGZERO
diff --git a/src/cmd/internal/obj/go.go b/src/cmd/internal/obj/go.go
index 9c0264e..3e6cd21 100644
--- a/src/cmd/internal/obj/go.go
+++ b/src/cmd/internal/obj/go.go
@@ -63,7 +63,9 @@
 func Nocache(p *Prog) {
 	p.Optab = 0
 	p.From.Class = 0
-	p.From3.Class = 0
+	if p.From3 != nil {
+		p.From3.Class = 0
+	}
 	p.To.Class = 0
 }
 
diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go
index f7728bf..f96a295 100644
--- a/src/cmd/internal/obj/link.go
+++ b/src/cmd/internal/obj/link.go
@@ -239,6 +239,14 @@
 	return p.From3.Type
 }
 
+// From3Offset returns From3.Offset, or 0 when From3 is nil.
+func (p *Prog) From3Offset() int64 {
+	if p.From3 == nil {
+		return 0
+	}
+	return p.From3.Offset
+}
+
 // ProgInfo holds information about the instruction for use
 // by clients such as the compiler. The exact meaning of this
 // data is up to the client and is not interpreted by the cmd/internal/obj/... packages.
diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go
index 35a9ef6..c5f4820 100644
--- a/src/cmd/internal/obj/objfile.go
+++ b/src/cmd/internal/obj/objfile.go
@@ -226,7 +226,7 @@
 					etext.Next = s
 				}
 				etext = s
-				flag = int(p.From3.Offset)
+				flag = int(p.From3Offset())
 				if flag&DUPOK != 0 {
 					s.Dupok = 1
 				}
diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go
index 16574d2..b9f5ad3 100644
--- a/src/cmd/internal/obj/ppc64/asm9.go
+++ b/src/cmd/internal/obj/ppc64/asm9.go
@@ -724,7 +724,7 @@
 	}
 
 	a1--
-	a3 := C_NONE
+	a3 := C_NONE + 1
 	if p.From3 != nil {
 		a3 = int(p.From3.Class)
 		if a3 == 0 {
diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go
index 4a4785e..99168d1 100644
--- a/src/cmd/internal/obj/x86/obj6.go
+++ b/src/cmd/internal/obj/x86/obj6.go
@@ -478,7 +478,7 @@
 	}
 
 	// TODO(rsc): Remove 'p.Mode == 64 &&'.
-	if p.Mode == 64 && autoffset < obj.StackSmall && p.From3.Offset&obj.NOSPLIT == 0 {
+	if p.Mode == 64 && autoffset < obj.StackSmall && p.From3Offset()&obj.NOSPLIT == 0 {
 		for q := p; q != nil; q = q.Link {
 			if q.As == obj.ACALL {
 				goto noleaf
@@ -492,13 +492,13 @@
 	noleaf:
 	}
 
-	if p.From3.Offset&obj.NOSPLIT == 0 || (p.From3.Offset&obj.WRAPPER != 0) {
+	if p.From3Offset()&obj.NOSPLIT == 0 || p.From3Offset()&obj.WRAPPER != 0 {
 		p = obj.Appendp(ctxt, p)
 		p = load_g_cx(ctxt, p) // load g into CX
 	}
 
 	var q *obj.Prog
-	if cursym.Text.From3.Offset&obj.NOSPLIT == 0 {
+	if cursym.Text.From3Offset()&obj.NOSPLIT == 0 {
 		p = stacksplit(ctxt, p, autoffset, int32(textarg), &q) // emit split check
 	}
 
@@ -553,7 +553,7 @@
 		p.To.Reg = REG_BP
 	}
 
-	if cursym.Text.From3.Offset&obj.WRAPPER != 0 {
+	if cursym.Text.From3Offset()&obj.WRAPPER != 0 {
 		// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
 		//
 		//	MOVQ g_panic(CX), BX
@@ -984,7 +984,7 @@
 	p.To.Type = obj.TYPE_BRANCH
 	if ctxt.Cursym.Cfunc != 0 {
 		p.To.Sym = obj.Linklookup(ctxt, "runtime.morestackc", 0)
-	} else if ctxt.Cursym.Text.From3.Offset&obj.NEEDCTXT == 0 {
+	} else if ctxt.Cursym.Text.From3Offset()&obj.NEEDCTXT == 0 {
 		p.To.Sym = obj.Linklookup(ctxt, "runtime.morestack_noctxt", 0)
 	} else {
 		p.To.Sym = obj.Linklookup(ctxt, "runtime.morestack", 0)