From f030043e37c4038e8a169feaf814ccbe3ae55cda Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Mon, 23 Aug 2021 21:32:30 +1000 Subject: [PATCH] cmd/internal/obj/riscv: simplify machine code output Use cursym.WriteInt rather than building up a slice of bytes and then writing them out via PutUint32. This also allows for variable instruction sizes, which will be needed when support for compressed (2 byte length) instructions is added. Change-Id: I17c9ffa52d27c91a24e161317e3db28e224804ae Reviewed-on: https://go-review.googlesource.com/c/go/+/344460 Trust: Joel Sing Reviewed-by: Cherry Mui --- src/cmd/internal/obj/riscv/obj.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index fd5026f25b2..b1a18319667 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -2019,7 +2019,6 @@ func assemble(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ctxt.Retpoline = false // don't keep printing } - var symcode []uint32 for p := cursym.Func().Text; p != nil; p = p.Link { switch p.As { case AJALR: @@ -2074,23 +2073,17 @@ func assemble(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { rel.Type = rt } + offset := p.Pc for _, ins := range instructionsForProg(p) { - ic, err := ins.encode() - if err != nil { - break + if ic, err := ins.encode(); err == nil { + cursym.WriteInt(ctxt, offset, ins.length(), int64(ic)) + offset += int64(ins.length()) } if ins.usesRegTmp() { p.Mark |= USES_REG_TMP } - symcode = append(symcode, ic) } } - cursym.Size = int64(4 * len(symcode)) - - cursym.Grow(cursym.Size) - for p, i := cursym.P, 0; i < len(symcode); p, i = p[4:], i+1 { - ctxt.Arch.ByteOrder.PutUint32(p, symcode[i]) - } obj.MarkUnsafePoints(ctxt, cursym.Func().Text, newprog, isUnsafePoint, nil) }