]> Cypherpunks repositories - gostls13.git/commitdiff
reflect, runtime: add reflect support for regABI on loong64
authorGuoqi Chen <chenguoqi@loongson.cn>
Wed, 16 Aug 2023 00:28:28 +0000 (08:28 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 21 Nov 2023 19:04:25 +0000 (19:04 +0000)
Update #40724

Co-authored-by: Xiaolin Zhao <zhaoxiaolin@loongson.cn>
Change-Id: I0549fd1a2192ffb041034ff41bf0cc4be0b1662c
Reviewed-on: https://go-review.googlesource.com/c/go/+/521784
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
Reviewed-by: David Chase <drchase@google.com>
Auto-Submit: David Chase <drchase@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/reflect/asm_loong64.s
src/runtime/stkframe.go

index 341a6d55c1b7420250a7db9a3c085797f32a3c51..520f0afdd51625f2b375188ac6a30c4c00a63e37 100644 (file)
@@ -7,34 +7,83 @@
 
 #define        REGCTXT R29
 
+// The frames of each of the two functions below contain two locals, at offsets
+// that are known to the runtime.
+//
+// The first local is a bool called retValid with a whole pointer-word reserved
+// for it on the stack. The purpose of this word is so that the runtime knows
+// whether the stack-allocated return space contains valid values for stack
+// scanning.
+//
+// The second local is an abi.RegArgs value whose offset is also known to the
+// runtime, so that a stack map for it can be constructed, since it contains
+// pointers visible to the GC.
+#define LOCAL_RETVALID 40
+#define LOCAL_REGARGS 48
+
+// The frame size of the functions below is
+// 32 (args of callReflect) + 8 (bool + padding) + 392 (abi.RegArgs) = 432.
+
 // makeFuncStub is the code half of the function returned by MakeFunc.
 // See the comment on the declaration of makeFuncStub in makefunc.go
 // for more details.
 // No arg size here, runtime pulls arg map out of the func value.
-TEXT ·makeFuncStub(SB),(NOSPLIT|WRAPPER),$40
+TEXT ·makeFuncStub(SB),(NOSPLIT|WRAPPER),$432
        NO_LOCAL_POINTERS
+       ADDV    $LOCAL_REGARGS, R3, R25 // spillArgs using R25
+       JAL     runtime·spillArgs(SB)
+       MOVV    REGCTXT, 32(R3) // save REGCTXT > args of moveMakeFuncArgPtrs < LOCAL_REGARGS
+
+#ifdef GOEXPERIMENT_regabiargs
+       MOVV    REGCTXT, R4
+       MOVV    R25, R5
+#else
        MOVV    REGCTXT, 8(R3)
-       MOVV    $argframe+0(FP), R19
-       MOVV    R19, 16(R3)
-       MOVB    R0, 40(R3)
-       ADDV    $40, R3, R19
-       MOVV    R19, 24(R3)
-       MOVV    R0, 32(R3)
+       MOVV    R25, 16(R3)
+#endif
+       JAL     ·moveMakeFuncArgPtrs<ABIInternal>(SB)
+       MOVV    32(R3), REGCTXT // restore REGCTXT
+
+       MOVV    REGCTXT, 8(R3)
+       MOVV    $argframe+0(FP), R20
+       MOVV    R20, 16(R3)
+       MOVV    R0, LOCAL_RETVALID(R3)
+       ADDV    $LOCAL_RETVALID, R3, R20
+       MOVV    R20, 24(R3)
+       ADDV    $LOCAL_REGARGS, R3, R20
+       MOVV    R20, 32(R3)
        JAL     ·callReflect(SB)
+       ADDV    $LOCAL_REGARGS, R3, R25 //unspillArgs using R25
+       JAL     runtime·unspillArgs(SB)
        RET
 
 // methodValueCall is the code half of the function returned by makeMethodValue.
 // See the comment on the declaration of methodValueCall in makefunc.go
 // for more details.
 // No arg size here; runtime pulls arg map out of the func value.
-TEXT ·methodValueCall(SB),(NOSPLIT|WRAPPER),$40
+TEXT ·methodValueCall(SB),(NOSPLIT|WRAPPER),$432
        NO_LOCAL_POINTERS
+       ADDV    $LOCAL_REGARGS, R3, R25 // spillArgs using R25
+       JAL     runtime·spillArgs(SB)
+       MOVV    REGCTXT, 32(R3) // save REGCTXT > args of moveMakeFuncArgPtrs < LOCAL_REGARGS
+#ifdef GOEXPERIMENT_regabiargs
+       MOVV    REGCTXT, R4
+       MOVV    R25, R5
+#else
+       MOVV    REGCTXT, 8(R3)
+       MOVV    R25, 16(R3)
+#endif
+       JAL     ·moveMakeFuncArgPtrs<ABIInternal>(SB)
+       MOVV    32(R3), REGCTXT // restore REGCTXT
        MOVV    REGCTXT, 8(R3)
-       MOVV    $argframe+0(FP), R19
-       MOVV    R19, 16(R3)
-       MOVB    R0, 40(R3)
-       ADDV    $40, R3, R19
-       MOVV    R19, 24(R3)
-       MOVV    R0, 32(R3)
+       MOVV    $argframe+0(FP), R20
+       MOVV    R20, 16(R3)
+       MOVB    R0, LOCAL_RETVALID(R3)
+       ADDV    $LOCAL_RETVALID, R3, R20
+       MOVV    R20, 24(R3)
+       ADDV    $LOCAL_REGARGS, R3, R20
+       MOVV    R20, 32(R3) // frame size to 32+SP as callreflect args)
        JAL     ·callMethod(SB)
+       ADDV    $LOCAL_REGARGS, R3, R25 // unspillArgs using R25
+       JAL     runtime·unspillArgs(SB)
        RET
index a2f40c92d56d7c769fd7c78d9310cb467619b0ac..becb729e598af42e12a349a1a0e86173bb460be1 100644 (file)
@@ -234,7 +234,7 @@ func (frame *stkframe) getStackMap(debug bool) (locals, args bitvector, objs []s
        }
 
        // stack objects.
-       if (GOARCH == "amd64" || GOARCH == "arm64" || GOARCH == "ppc64" || GOARCH == "ppc64le" || GOARCH == "riscv64") &&
+       if (GOARCH == "amd64" || GOARCH == "arm64" || GOARCH == "loong64" || GOARCH == "ppc64" || GOARCH == "ppc64le" || GOARCH == "riscv64") &&
                unsafe.Sizeof(abi.RegArgs{}) > 0 && isReflect {
                // For reflect.makeFuncStub and reflect.methodValueCall,
                // we need to fake the stack object record.