]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/riscv: simplify machine code output
authorJoel Sing <joel@sing.id.au>
Mon, 23 Aug 2021 11:32:30 +0000 (21:32 +1000)
committerJoel Sing <joel@sing.id.au>
Wed, 8 Sep 2021 06:56:06 +0000 (06:56 +0000)
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 <joel@sing.id.au>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/internal/obj/riscv/obj.go

index fd5026f25b2ea0bddabd5b96bd98e97361df7723..b1a1831966752790c20206bff507e77ffa0954d4 100644 (file)
@@ -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)
 }