]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: provide gc maps for the reflect.callXX frames.
authorKeith Randall <khr@golang.org>
Wed, 21 May 2014 21:28:34 +0000 (14:28 -0700)
committerKeith Randall <khr@golang.org>
Wed, 21 May 2014 21:28:34 +0000 (14:28 -0700)
Update #8030

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/100620045

src/cmd/5a/a.y
src/cmd/5a/y.tab.c
src/pkg/runtime/asm_386.s
src/pkg/runtime/asm_amd64.s
src/pkg/runtime/asm_arm.s

index 6395359949299f583b5078d01694c74d45370d0c..56d0c563db2e363f9e911ccfaac56a49e11ae5d3 100644 (file)
@@ -336,7 +336,7 @@ inst:
        {
                if($2.type != D_CONST)
                        yyerror("index for FUNCDATA must be integer constant");
-               if($4.type != D_EXTERN && $4.type != D_STATIC)
+               if($4.type != D_EXTERN && $4.type != D_STATIC && $4.type != D_OREG)
                        yyerror("value for FUNCDATA must be symbol reference");
                outcode($1, Always, &$2, NREG, &$4);
        }
index 67712d2c8fbf49d95b16eac5187d98a70912360a..0bc8c34e10c7ffb23cb2d5f00fbf7eb25a30f6a3 100644 (file)
@@ -2120,7 +2120,7 @@ yyreduce:
     {
                if((yyvsp[(2) - (4)].addr).type != D_CONST)
                        yyerror("index for FUNCDATA must be integer constant");
-               if((yyvsp[(4) - (4)].addr).type != D_EXTERN && (yyvsp[(4) - (4)].addr).type != D_STATIC)
+               if((yyvsp[(4) - (4)].addr).type != D_EXTERN && (yyvsp[(4) - (4)].addr).type != D_STATIC && (yyvsp[(4) - (4)].addr).type != D_OREG)
                        yyerror("value for FUNCDATA must be symbol reference");
                outcode((yyvsp[(1) - (4)].lval), Always, &(yyvsp[(2) - (4)].addr), NREG, &(yyvsp[(4) - (4)].addr));
        }
index dae241a15b34e527bee2aa44cdc8c68e977ae95c..95312089d97d888ac3086e5ab6655069753969a1 100644 (file)
@@ -343,8 +343,22 @@ TEXT reflect·call(SB), NOSPLIT, $0-16
        MOVL    $runtime·badreflectcall(SB), AX
        JMP     AX
 
+// Argument map for the callXX frames.  Each has one
+// stack map (for the single call) with 3 arguments.
+DATA gcargs_reflectcall<>+0x00(SB)/4, $1  // 1 stackmap
+DATA gcargs_reflectcall<>+0x04(SB)/4, $6  // 3 args
+DATA gcargs_reflectcall<>+0x08(SB)/4, $(const_BitsPointer+(const_BitsPointer<<2)+(const_BitsScalar<<4))
+GLOBL gcargs_reflectcall<>(SB),RODATA,$12
+
+// callXX frames have no locals
+DATA gclocals_reflectcall<>+0x00(SB)/4, $1  // 1 stackmap
+DATA gclocals_reflectcall<>+0x04(SB)/4, $0  // 0 locals
+GLOBL gclocals_reflectcall<>(SB),RODATA,$8
+
 #define CALLFN(NAME,MAXSIZE)                   \
 TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-16;  \
+       FUNCDATA $FUNCDATA_ArgsPointerMaps,gcargs_reflectcall<>(SB);    \
+       FUNCDATA $FUNCDATA_LocalsPointerMaps,gclocals_reflectcall<>(SB);\
        /* copy arguments to stack */           \
        MOVL    argptr+4(FP), SI;               \
        MOVL    argsize+8(FP), CX;              \
@@ -353,6 +367,7 @@ TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-16;       \
        /* call function */                     \
        MOVL    f+0(FP), DX;                    \
        MOVL    (DX), AX;                       \
+       PCDATA  $PCDATA_StackMapIndex, $0;      \
        CALL    AX;                             \
        /* copy return values back */           \
        MOVL    argptr+4(FP), DI;               \
index 27abb37cdbf0b72cf74dfccf9225c3196a59132f..3c7eaf3433d22e6a2ae5ff65b0a4e2d9353a91dd 100644 (file)
@@ -321,8 +321,22 @@ TEXT reflect·call(SB), NOSPLIT, $0-24
        MOVQ    $runtime·badreflectcall(SB), AX
        JMP     AX
 
+// Argument map for the callXX frames.  Each has one
+// stack map (for the single call) with 3 arguments.
+DATA gcargs_reflectcall<>+0x00(SB)/4, $1  // 1 stackmap
+DATA gcargs_reflectcall<>+0x04(SB)/4, $6  // 3 args
+DATA gcargs_reflectcall<>+0x08(SB)/4, $(const_BitsPointer+(const_BitsPointer<<2)+(const_BitsScalar<<4))
+GLOBL gcargs_reflectcall<>(SB),RODATA,$12
+
+// callXX frames have no locals
+DATA gclocals_reflectcall<>+0x00(SB)/4, $1  // 1 stackmap
+DATA gclocals_reflectcall<>+0x04(SB)/4, $0  // 0 locals
+GLOBL gclocals_reflectcall<>(SB),RODATA,$8
+
 #define CALLFN(NAME,MAXSIZE)                   \
 TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-24;  \
+       FUNCDATA $FUNCDATA_ArgsPointerMaps,gcargs_reflectcall<>(SB);    \
+       FUNCDATA $FUNCDATA_LocalsPointerMaps,gclocals_reflectcall<>(SB);\
        /* copy arguments to stack */           \
        MOVQ    argptr+8(FP), SI;               \
        MOVLQZX argsize+16(FP), CX;             \
@@ -330,6 +344,7 @@ TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-24;       \
        REP;MOVSB;                              \
        /* call function */                     \
        MOVQ    f+0(FP), DX;                    \
+       PCDATA  $PCDATA_StackMapIndex, $0;      \
        CALL    (DX);                           \
        /* copy return values back */           \
        MOVQ    argptr+8(FP), DI;               \
index 3ce3deb2e29d35036a2df55a1130535c95f79376..024649be0769e9b6fe2df2b0ac52dcc4faebb3e6 100644 (file)
@@ -301,8 +301,22 @@ TEXT reflect·call(SB), NOSPLIT, $-4-16
        MOVW    $runtime·badreflectcall(SB), R1
        B       (R1)
 
+// Argument map for the callXX frames.  Each has one
+// stack map (for the single call) with 3 arguments.
+DATA gcargs_reflectcall<>+0x00(SB)/4, $1  // 1 stackmap
+DATA gcargs_reflectcall<>+0x04(SB)/4, $6  // 3 args
+DATA gcargs_reflectcall<>+0x08(SB)/4, $(const_BitsPointer+(const_BitsPointer<<2)+(const_BitsScalar<<4))
+GLOBL gcargs_reflectcall<>(SB),RODATA,$12
+
+// callXX frames have no locals
+DATA gclocals_reflectcall<>+0x00(SB)/4, $1  // 1 stackmap
+DATA gclocals_reflectcall<>+0x04(SB)/4, $0  // 0 locals
+GLOBL gclocals_reflectcall<>(SB),RODATA,$8
+
 #define CALLFN(NAME,MAXSIZE)                   \
 TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-16;  \
+       FUNCDATA $FUNCDATA_ArgsPointerMaps,gcargs_reflectcall<>(SB);    \
+       FUNCDATA $FUNCDATA_LocalsPointerMaps,gclocals_reflectcall<>(SB);\
        /* copy arguments to stack */           \
        MOVW    argptr+4(FP), R0;               \
        MOVW    argsize+8(FP), R2;              \
@@ -316,6 +330,7 @@ TEXT runtime·NAME(SB), WRAPPER, $MAXSIZE-16;       \
        /* call function */                     \
        MOVW    f+0(FP), R7;                    \
        MOVW    (R7), R0;                       \
+       PCDATA  $PCDATA_StackMapIndex, $0;      \
        BL      (R0);                           \
        /* copy return values back */           \
        MOVW    argptr+4(FP), R0;               \