From: Joel Sing Date: Mon, 23 Aug 2021 11:32:30 +0000 (+1000) Subject: cmd/internal/obj/riscv: simplify machine code output X-Git-Tag: go1.18beta1~1446 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f030043e37c4038e8a169feaf814ccbe3ae55cda;p=gostls13.git 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 --- diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index fd5026f25b..b1a1831966 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) }