@@ -709,6 +709,53 @@ PCODE MethodDesc::JitCompileCode(PrepareCodeConfig* pConfig)
709709 }
710710}
711711
712+ namespace
713+ {
714+ COR_ILMETHOD_DECODER* GetAndVerifyMetadataILHeader (MethodDesc* pMD, PrepareCodeConfig* pConfig, COR_ILMETHOD_DECODER* pDecoderMemory)
715+ {
716+ STANDARD_VM_CONTRACT;
717+ _ASSERTE (pMD != NULL );
718+ _ASSERTE (!pMD->IsNoMetadata ());
719+ _ASSERTE (pConfig != NULL );
720+ _ASSERTE (pDecoderMemory != NULL );
721+
722+ COR_ILMETHOD_DECODER* pHeader = NULL ;
723+ COR_ILMETHOD* ilHeader = pConfig->GetILHeader ();
724+ if (ilHeader == NULL )
725+ return NULL ;
726+
727+ COR_ILMETHOD_DECODER::DecoderStatus status = COR_ILMETHOD_DECODER::FORMAT_ERROR;
728+ {
729+ // Decoder ctor can AV on a malformed method header
730+ AVInRuntimeImplOkayHolder AVOkay;
731+ pHeader = new (pDecoderMemory) COR_ILMETHOD_DECODER (ilHeader, pMD->GetMDImport (), &status);
732+ }
733+
734+ if (status == COR_ILMETHOD_DECODER::FORMAT_ERROR)
735+ COMPlusThrowHR (COR_E_BADIMAGEFORMAT, BFA_BAD_IL);
736+
737+ return pHeader;
738+ }
739+
740+ COR_ILMETHOD_DECODER* GetAndVerifyILHeader (MethodDesc* pMD, PrepareCodeConfig* pConfig, COR_ILMETHOD_DECODER* pIlDecoderMemory)
741+ {
742+ STANDARD_VM_CONTRACT;
743+ _ASSERTE (pMD != NULL );
744+ if (pMD->IsIL ())
745+ {
746+ return GetAndVerifyMetadataILHeader (pMD, pConfig, pIlDecoderMemory);
747+ }
748+ else if (pMD->IsILStub ())
749+ {
750+ ILStubResolver* pResolver = pMD->AsDynamicMethodDesc ()->GetILStubResolver ();
751+ return pResolver->GetILHeader ();
752+ }
753+
754+ _ASSERTE (pMD->IsNoMetadata ());
755+ return NULL ;
756+ }
757+ }
758+
712759PCODE MethodDesc::JitCompileCodeLockedEventWrapper (PrepareCodeConfig* pConfig, JitListLockEntry* pEntry)
713760{
714761 STANDARD_VM_CONTRACT;
@@ -759,11 +806,18 @@ PCODE MethodDesc::JitCompileCodeLockedEventWrapper(PrepareCodeConfig* pConfig, J
759806 }
760807#endif // PROFILING_SUPPORTED
761808
809+ // The profiler may have changed the code on the callback. Need to
810+ // pick up the new code.
811+ //
812+ // (don't want this for OSR, need to see how it works)
813+ COR_ILMETHOD_DECODER ilDecoderTemp;
814+ COR_ILMETHOD_DECODER* pilHeader = GetAndVerifyILHeader (this , pConfig, &ilDecoderTemp);
815+
762816 if (!ETW_TRACING_CATEGORY_ENABLED (MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_DOTNET_Context,
763817 TRACE_LEVEL_VERBOSE,
764818 CLR_JIT_KEYWORD))
765819 {
766- pCode = JitCompileCodeLocked (pConfig, pEntry, &sizeOfCode);
820+ pCode = JitCompileCodeLocked (pConfig, pilHeader, pEntry, &sizeOfCode);
767821 }
768822 else
769823 {
@@ -778,12 +832,13 @@ PCODE MethodDesc::JitCompileCodeLockedEventWrapper(PrepareCodeConfig* pConfig, J
778832 // a small stub of native code but no native-IL mapping.
779833#ifndef FEATURE_INTERPRETER
780834 ETW::MethodLog::MethodJitting (this ,
835+ pilHeader,
781836 &namespaceOrClassName,
782837 &methodName,
783838 &methodSignature);
784839#endif
785840
786- pCode = JitCompileCodeLocked (pConfig, pEntry, &sizeOfCode);
841+ pCode = JitCompileCodeLocked (pConfig, pilHeader, pEntry, &sizeOfCode);
787842
788843 // Interpretted methods skip this notification
789844#ifdef FEATURE_INTERPRETER
@@ -869,66 +924,11 @@ PCODE MethodDesc::JitCompileCodeLockedEventWrapper(PrepareCodeConfig* pConfig, J
869924 return pCode;
870925}
871926
872- namespace
873- {
874- COR_ILMETHOD_DECODER* GetAndVerifyMetadataILHeader (MethodDesc* pMD, PrepareCodeConfig* pConfig, COR_ILMETHOD_DECODER* pDecoderMemory)
875- {
876- STANDARD_VM_CONTRACT;
877- _ASSERTE (pMD != NULL );
878- _ASSERTE (!pMD->IsNoMetadata ());
879- _ASSERTE (pConfig != NULL );
880- _ASSERTE (pDecoderMemory != NULL );
881-
882- COR_ILMETHOD_DECODER* pHeader = NULL ;
883- COR_ILMETHOD* ilHeader = pConfig->GetILHeader ();
884- if (ilHeader == NULL )
885- return NULL ;
886-
887- COR_ILMETHOD_DECODER::DecoderStatus status = COR_ILMETHOD_DECODER::FORMAT_ERROR;
888- {
889- // Decoder ctor can AV on a malformed method header
890- AVInRuntimeImplOkayHolder AVOkay;
891- pHeader = new (pDecoderMemory) COR_ILMETHOD_DECODER (ilHeader, pMD->GetMDImport (), &status);
892- }
893-
894- if (status == COR_ILMETHOD_DECODER::FORMAT_ERROR)
895- COMPlusThrowHR (COR_E_BADIMAGEFORMAT, BFA_BAD_IL);
896-
897- return pHeader;
898- }
899-
900- COR_ILMETHOD_DECODER* GetAndVerifyILHeader (MethodDesc* pMD, PrepareCodeConfig* pConfig, COR_ILMETHOD_DECODER* pIlDecoderMemory)
901- {
902- STANDARD_VM_CONTRACT;
903- _ASSERTE (pMD != NULL );
904- if (pMD->IsIL ())
905- {
906- return GetAndVerifyMetadataILHeader (pMD, pConfig, pIlDecoderMemory);
907- }
908- else if (pMD->IsILStub ())
909- {
910- ILStubResolver* pResolver = pMD->AsDynamicMethodDesc ()->GetILStubResolver ();
911- return pResolver->GetILHeader ();
912- }
913-
914- _ASSERTE (pMD->IsNoMetadata ());
915- return NULL ;
916- }
917- }
918-
919- PCODE MethodDesc::JitCompileCodeLocked (PrepareCodeConfig* pConfig, JitListLockEntry* pEntry, ULONG* pSizeOfCode)
927+ PCODE MethodDesc::JitCompileCodeLocked (PrepareCodeConfig* pConfig, COR_ILMETHOD_DECODER* pilHeader, JitListLockEntry* pEntry, ULONG* pSizeOfCode)
920928{
921929 STANDARD_VM_CONTRACT;
922930
923931 PCODE pCode = NULL ;
924-
925- // The profiler may have changed the code on the callback. Need to
926- // pick up the new code.
927- //
928- // (don't want this for OSR, need to see how it works)
929- COR_ILMETHOD_DECODER ilDecoderTemp;
930- COR_ILMETHOD_DECODER* pilHeader = GetAndVerifyILHeader (this , pConfig, &ilDecoderTemp);
931-
932932 CORJIT_FLAGS jitFlags;
933933 PCODE pOtherCode = NULL ;
934934
0 commit comments