From 1aee4f3464b678f135912e2b2703e0f6c060b980 Mon Sep 17 00:00:00 2001 From: Mark Ryan Date: Wed, 11 Dec 2024 14:03:17 +0100 Subject: [PATCH] cmd/internal/obj/riscv: prevent panics on bad branches Syntactically incorrect branches, such as BEQ X5, X6, $1 BEQ X5, X6, 31(X10) cause the assembler to panic, which they shouldn't really do. It's better for the user to see a normal error, as reported for other syntax errors in riscv64 assembly. The panics also prevent us from writing negative tests for these sorts of errors. Here we fix the issue by ensuring we generate a normal error instead of panicking when the user provides an invalid branch target. We also add a couple of negative tests. Change-Id: I1da568999a75097484b61a01d418f5d4be3e04fa Reviewed-on: https://go-review.googlesource.com/c/go/+/637316 Reviewed-by: Cherry Mui Reviewed-by: Joel Sing LUCI-TryBot-Result: Go LUCI Reviewed-by: David Chase Reviewed-by: Meng Zhuo --- src/cmd/asm/internal/asm/testdata/riscv64error.s | 2 ++ src/cmd/internal/obj/riscv/obj.go | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/riscv64error.s b/src/cmd/asm/internal/asm/testdata/riscv64error.s index e8855f6cd5..005b794612 100644 --- a/src/cmd/asm/internal/asm/testdata/riscv64error.s +++ b/src/cmd/asm/internal/asm/testdata/riscv64error.s @@ -30,6 +30,8 @@ TEXT errors(SB),$0 SLLI $64, X5, X6 // ERROR "immediate out of range 0 to 63" SRLI $64, X5, X6 // ERROR "immediate out of range 0 to 63" SRAI $64, X5, X6 // ERROR "immediate out of range 0 to 63" + BEQ X5, X6, $1 // ERROR "instruction with branch-like opcode lacks destination" + BEQ X5, X6, 31(X10) // ERROR "instruction with branch-like opcode lacks destination" RORI $-1, X5, X6 // ERROR "immediate out of range 0 to 63" SLLI $-1, X5, X6 // ERROR "immediate out of range 0 to 63" SRLI $-1, X5, X6 // ERROR "immediate out of range 0 to 63" diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index de9851519a..f9ae5fe677 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -769,7 +769,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { switch p.As { case ABEQ, ABEQZ, ABGE, ABGEU, ABGEZ, ABGT, ABGTU, ABGTZ, ABLE, ABLEU, ABLEZ, ABLT, ABLTU, ABLTZ, ABNE, ABNEZ: if p.To.Type != obj.TYPE_BRANCH { - panic("assemble: instruction with branch-like opcode lacks destination") + ctxt.Diag("%v: instruction with branch-like opcode lacks destination", p) + break } offset := p.To.Target().Pc - p.Pc if offset < -4096 || 4096 <= offset { @@ -853,7 +854,10 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { case obj.TYPE_BRANCH: p.To.Type, p.To.Offset = obj.TYPE_CONST, p.To.Target().Pc-p.Pc case obj.TYPE_MEM: - panic("unhandled type") + if ctxt.Errors == 0 { + // An error should have already been reported for this instruction + panic("unhandled type") + } } case AJAL: -- 2.51.0