[OE-core] [PATCH 1/2] go: Fix for panic: branch too far on arm64

Khem Raj raj.khem at gmail.com
Sat Mar 3 16:34:36 UTC 2018


see https://github.com/golang/go/issues/23889

Signed-off-by: Khem Raj <raj.khem at gmail.com>
---
 meta/recipes-devtools/go/go-1.10.inc               |  1 +
 .../arm64-fix-branch-too-far-with-TBZ.patch        | 50 ++++++++++++++++++++++
 2 files changed, 51 insertions(+)
 create mode 100644 meta/recipes-devtools/go/go-1.10/arm64-fix-branch-too-far-with-TBZ.patch

diff --git a/meta/recipes-devtools/go/go-1.10.inc b/meta/recipes-devtools/go/go-1.10.inc
index 3a93773e2a..8c70de934e 100644
--- a/meta/recipes-devtools/go/go-1.10.inc
+++ b/meta/recipes-devtools/go/go-1.10.inc
@@ -13,6 +13,7 @@ SRC_URI += "\
     file://0005-make.bash-override-CC-when-building-dist-and-go_boot.patch \
     file://0006-cmd-dist-separate-host-and-target-builds.patch \
     file://0007-cmd-go-make-GOROOT-precious-by-default.patch \
+    file://arm64-fix-branch-too-far-with-TBZ.patch \
 "
 
 SRC_URI_append_libc-musl = " file://0008-ld-replace-glibc-dynamic-linker-with-musl.patch"
diff --git a/meta/recipes-devtools/go/go-1.10/arm64-fix-branch-too-far-with-TBZ.patch b/meta/recipes-devtools/go/go-1.10/arm64-fix-branch-too-far-with-TBZ.patch
new file mode 100644
index 0000000000..9378ede132
--- /dev/null
+++ b/meta/recipes-devtools/go/go-1.10/arm64-fix-branch-too-far-with-TBZ.patch
@@ -0,0 +1,50 @@
+From 0893ca552f7dddba10d8209bd28c69f86fcd791c Mon Sep 17 00:00:00 2001
+From: Cherry Zhang <cherryyz at google.com>
+Date: Sat, 17 Feb 2018 10:31:39 -0500
+Subject: [PATCH] cmd/internal/obj/arm64: fix branch-too-far with TBZ like instructions
+
+The compiler now emits TBZ like instructions, but the assembler's
+too-far-branch patch code didn't include that case. Add it.
+
+Fixes #23889.
+
+Change-Id: Ib75f9250c660b9fb652835fbc83263a5d5073dc5
+---
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+Upstream-Status: Backport
+
+diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go
+index 423f55f..38f1d24 100644
+--- a/src/cmd/internal/obj/arm64/asm7.go
++++ b/src/cmd/internal/obj/arm64/asm7.go
+@@ -723,9 +723,16 @@
+ 			o = c.oplook(p)
+ 
+ 			/* very large branches */
+-			if (o.type_ == 7 || o.type_ == 39) && p.Pcond != nil { // 7: BEQ and like, 39: CBZ and like
++			if (o.type_ == 7 || o.type_ == 39 || o.type_ == 40) && p.Pcond != nil { // 7: BEQ and like, 39: CBZ and like, 40: TBZ and like
+ 				otxt := p.Pcond.Pc - pc
+-				if otxt <= -(1<<18)+10 || otxt >= (1<<18)-10 {
++				var toofar bool
++				switch o.type_ {
++				case 7, 39: // branch instruction encodes 19 bits
++					toofar = otxt <= -(1<<20)+10 || otxt >= (1<<20)-10
++				case 40: // branch instruction encodes 14 bits
++					toofar = otxt <= -(1<<15)+10 || otxt >= (1<<15)-10
++				}
++				if toofar {
+ 					q := c.newprog()
+ 					q.Link = p.Link
+ 					p.Link = q
+diff --git a/src/cmd/internal/obj/arm64/asm_test.go b/src/cmd/internal/obj/arm64/asm_test.go
+index 369c48f..3e0c9c1 100644
+--- a/src/cmd/internal/obj/arm64/asm_test.go
++++ b/src/cmd/internal/obj/arm64/asm_test.go
+@@ -52,6 +52,7 @@
+ // gen generates a very large program, with a very far conditional branch.
+ func gen(buf *bytes.Buffer) {
+ 	fmt.Fprintln(buf, "TEXT f(SB),0,$0-0")
++	fmt.Fprintln(buf, "TBZ $5, R0, label")
+ 	fmt.Fprintln(buf, "CBZ R0, label")
+ 	fmt.Fprintln(buf, "BEQ label")
+ 	for i := 0; i < 1<<19; i++ {
-- 
2.16.2




More information about the Openembedded-core mailing list