]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/arm64: don't crash on trailing NOP
authorIan Lance Taylor <iant@golang.org>
Wed, 11 Apr 2018 21:16:52 +0000 (14:16 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 11 Apr 2018 21:44:23 +0000 (21:44 +0000)
Fixes #20348

Change-Id: I831aeeee8e20d55b3e47dea67786e883b213cd58
Reviewed-on: https://go-review.googlesource.com/106457
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Aram Hăvărneanu <aram@mgk.ro>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/internal/obj/arm64/asm_test.go
src/cmd/internal/obj/arm64/obj7.go

index 3e0c9c13a6957e73f7e9b64af9bbb7abd47468a4..68f5b0b3464e83432fdfbba01834b80204766de5 100644 (file)
@@ -61,3 +61,21 @@ func gen(buf *bytes.Buffer) {
        fmt.Fprintln(buf, "label:")
        fmt.Fprintln(buf, "RET")
 }
+
+// Issue 20348.
+func TestNoRet(t *testing.T) {
+       dir, err := ioutil.TempDir("", "testnoret")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer os.RemoveAll(dir)
+       tmpfile := filepath.Join(dir, "x.s")
+       if err := ioutil.WriteFile(tmpfile, []byte("TEXT ·stub(SB),$0-0\nNOP\n"), 0644); err != nil {
+               t.Fatal(err)
+       }
+       cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", filepath.Join(dir, "x.o"), tmpfile)
+       cmd.Env = []string{"GOARCH=arm64", "GOOS=linux"}
+       if out, err := cmd.CombinedOutput(); err != nil {
+               t.Errorf("%v\n%s", err, out)
+       }
+}
index 1bd4a5d7b16dbf71f615fb0c5cd305d85c2cf567..9c3d22050e659ab850efdc25f9dc97f7e9056a6a 100644 (file)
@@ -476,9 +476,11 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                        break
 
                case obj.ANOP:
-                       q1 = p.Link
-                       q.Link = q1 /* q is non-nop */
-                       q1.Mark |= p.Mark
+                       if p.Link != nil {
+                               q1 = p.Link
+                               q.Link = q1 /* q is non-nop */
+                               q1.Mark |= p.Mark
+                       }
                        continue
 
                case ABL,