Merge pull request #6976 from kvochko/prof_elt_callbacks
authorRahul Kumar <rahku@microsoft.com>
Fri, 2 Sep 2016 21:00:58 +0000 (14:00 -0700)
committerGitHub <noreply@github.com>
Fri, 2 Sep 2016 21:00:58 +0000 (14:00 -0700)
Enable FunctionEnter/FunctionLeave callbacks on ARM

1  2 
src/vm/arm/asmhelpers.S

diff --combined src/vm/arm/asmhelpers.S
@@@ -309,12 -309,10 +309,12 @@@ LOCAL_LABEL(LNullThis)
  //
  // r12 = UMEntryThunk*
  //
 -        NESTED_ENTRY UMThunkStub,_TEXT,NoHandler
 +        NESTED_ENTRY UMThunkStub,_TEXT,UnhandledExceptionHandlerUnix
          PROLOG_PUSH         "{r4,r5,r7,r11,lr}"
 -        push                {r0-r3,r12}
 -        PROLOG_STACK_SAVE_OFFSET   r7, #28
 +        PROLOG_STACK_SAVE_OFFSET   r7, #8
 +
 +        alloc_stack         4 * 5
 +        stm                 sp, {r0-r3,r12}
  
          //GBLA UMThunkStub_HiddenArgOffest // offset of saved UMEntryThunk *
          //GBLA UMThunkStub_StackArgsOffest // offset of original stack args
@@@ -380,7 -378,8 +380,7 @@@ LOCAL_LABEL(UMThunkStub_PostCall)
          mov                 r4, 0
          str                 r4, [r5, #Thread__m_fPreemptiveGCDisabled]
  
 -        EPILOG_STACK_RESTORE_OFFSET    r7, #28
 -        free_stack           4 * 5
 +        EPILOG_STACK_RESTORE_OFFSET    r7, #8
          EPILOG_POP           "{r4,r5,r7,r11,pc}"
  
  LOCAL_LABEL(UMThunkStub_DoThreadSetup):
@@@ -637,6 -636,92 +637,92 @@@ ThePreStubPatchLabel
  
          .endm
  
+ //
+ // EXTERN_C void ProfileEnterNaked(FunctionIDOrClientID functionIDOrClientID);
+ //
+ NESTED_ENTRY ProfileEnterNaked, _TEXT, NoHandler
+     PROLOG_PUSH "{r4, r5, r7, r11, lr}"
+     PROLOG_STACK_SAVE_OFFSET r7, #8
+     // fields of PLATFORM_SPECIFIC_DATA, in reverse order
+     // UINT32      r0;         // Keep r0 & r1 contiguous to make returning 64-bit results easier
+     // UINT32      r1;
+     // void       *R11;
+     // void       *Pc;
+     // union                   // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7)
+     // {
+     //     UINT32  s[16];
+     //     UINT64  d[8];
+     // };
+     // FunctionID  functionId;
+     // void       *probeSp;    // stack pointer of managed function 
+     // void       *profiledSp; // location of arguments on stack
+     // LPVOID      hiddenArg;
+     // UINT32      flags;
+     movw        r4, #1
+     push        { /* flags      */ r4 }
+     movw        r4, #0
+     push        { /* hiddenArg  */ r4 }
+     add         r5, r11, #8
+     push        { /* profiledSp */ r5 }
+     add         r5, sp, #32
+     push        { /* probeSp    */ r5 }
+     push        { /* functionId */ r0 }
+     vpush.64    { d0 - d7 }
+     push        { lr }
+     push        { r11 }
+     push        { /* return value, r4 is NULL */ r4 }
+     push        { /* return value, r4 is NULL */ r4 }
+     mov         r1, sp
+     bl          C_FUNC(ProfileEnter)
+     EPILOG_STACK_RESTORE_OFFSET r7, #8
+     EPILOG_POP "{r4, r5, r7, r11, pc}"
+ NESTED_END ProfileEnterNaked, _TEXT
+ //
+ // EXTERN_C void ProfileLeaveNaked(FunctionIDOrClientID functionIDOrClientID);
+ //
+ NESTED_ENTRY ProfileLeaveNaked, _TEXT, NoHandler
+     PROLOG_PUSH "{r1, r2, r4, r5, r7, r11, lr}"
+     PROLOG_STACK_SAVE_OFFSET r7, #16
+     // fields of PLATFORM_SPECIFIC_DATA, in reverse order
+     // UINT32      r0;         // Keep r0 & r1 contiguous to make returning 64-bit results easier
+     // UINT32      r1;
+     // void       *R11;
+     // void       *Pc;
+     // union                   // Float arg registers as 32-bit (s0-s15) and 64-bit (d0-d7)
+     // {
+     //     UINT32  s[16];
+     //     UINT64  d[8];
+     // };
+     // FunctionID  functionId;
+     // void       *probeSp;    // stack pointer of managed function 
+     // void       *profiledSp; // location of arguments on stack
+     // LPVOID      hiddenArg;
+     // UINT32      flags;
+     movw        r4, #2
+     push        { /* flags      */ r4 }
+     movw        r4, #0
+     push        { /* hiddenArg  */ r4 }
+     add         r5, r11, #8
+     push        { /* profiledSp */ r5 }
+     add         r5, sp, #40
+     push        { /* probeSp    */ r5 }
+     push        { /* functionId */ r0 }
+     vpush.64    { d0 - d7 }
+     push        { lr }
+     push        { r11 }
+     push        { r1 }
+     push        { r2 }
+     mov         r1, sp
+     bl          C_FUNC(ProfileLeave)
+     EPILOG_STACK_RESTORE_OFFSET r7, #16
+     EPILOG_POP "{r1, r2, r4, r5, r7, r11, pc}"
+ NESTED_END ProfileLeaveNaked, _TEXT
  // EXTERN_C int __fastcall HelperMethodFrameRestoreState(
  //         INDEBUG_COMMA(HelperMethodFrame *pFrame)
  //         MachState *pState