bug fixes
authorDavid Mason <davmason@microsoft.com>
Wed, 21 Aug 2019 11:03:33 +0000 (04:03 -0700)
committerDavid Mason <davmason@microsoft.com>
Wed, 21 Aug 2019 11:03:33 +0000 (04:03 -0700)
src/SOS/Strike/util.cpp
src/inc/sospriv.idl
src/pal/prebuilt/inc/sospriv.h

index 9f235ecddf07b809c3750473f13ab696829ee333..ff9584f1130e155eb761f59a5c6237f38dd69297 100644 (file)
@@ -2705,12 +2705,13 @@ const char *EHTypeName(EHClauseType et)
         return "UNKNOWN";
 }
 
-void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersionData, const UINT cTieredVersionData)
+void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersionData,
+    const UINT cTieredVersionData, ULONG rejitID, CLRDATA_ADDRESS ilAddr, CLRDATA_ADDRESS ilNodeAddr)
 {
-    ExtOut("    Code Version History:\n");
-
     for(int i = cTieredVersionData - 1; i >= 0; --i)
     {
+        ExtOut("NativeCodeVersion:  %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr));
+
         const char *descriptor = NULL;
         switch(pTieredVersionData[i].OptimizationTier)
         {
@@ -2735,92 +2736,43 @@ void DumpTieredNativeCodeAddressInfo(struct DacpTieredVersionData * pTieredVersi
             break;
         }
 
+        ExtOut("      ReJIT ID:           %d\n", rejitID);
         DMLOut("      CodeAddr:           %s  (%s)\n", DMLIP(pTieredVersionData[i].NativeCodeAddr), descriptor);
-        ExtOut("      NativeCodeVersion:  %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr));
+        DMLOut("      IL Addr:            %s\n", DMLIL(ilAddr));
+        ExtOut("      ILCodeVersion:      %p\n", SOS_PTR(ilNodeAddr));
+
     }
 }
 
-// 2.1 version
-void DumpTieredNativeCodeAddressInfo_21(struct DacpTieredVersionData_21 * pTieredVersionData, const UINT cTieredVersionData)
-{
-    ExtOut("Code Version History:\n");
+void DumpRejitData(CLRDATA_ADDRESS pMethodDesc, DacpReJitData * pReJitData)
+{   
+    int rejitID = (int)pReJitData->rejitID;
+    CLRDATA_ADDRESS ilAddr = 0;
+    CLRDATA_ADDRESS ilNodeAddr = 0;
 
-    for(int i = cTieredVersionData - 1; i >= 0; --i)
+    struct DacpReJitData2 rejitData;
+    ReleaseHolder<ISOSDacInterface7> sos7;
+    if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) && 
+        SUCCEEDED(sos7->GetReJITInformation(pMethodDesc, 
+                                            rejitID,
+                                            &rejitData)))
     {
-        const char *descriptor = NULL;
-        switch(pTieredVersionData[i].TieredInfo)
-        {
-        case DacpTieredVersionData_21::TIERED_UNKNOWN:
-        default:
-            descriptor = "Unknown Tier";
-            break;
-        case DacpTieredVersionData_21::NON_TIERED:
-            descriptor = "Non-Tiered";
-            break;
-        case DacpTieredVersionData_21::TIERED_0:
-            descriptor = "Tier 0";
-            break;
-        case DacpTieredVersionData_21::TIERED_1:
-            descriptor = "Tier 1";
-            break;
-        }
-
-        DMLOut("  CodeAddr:           %s  (%s)\n", DMLIP(pTieredVersionData[i].NativeCodeAddr), descriptor);
-        ExtOut("  NativeCodeVersion:  %p\n", SOS_PTR(pTieredVersionData[i].NativeCodeVersionNodePtr));
+        ilAddr = rejitData.il;
+        ilNodeAddr = rejitData.ilCodeVersionNodePtr;
     }
-}
-
-void DumpRejitData(CLRDATA_ADDRESS pMethodDesc, DacpReJitData * pReJitData)
-{
-    ExtOut("  ReJITID %p: ", SOS_PTR(pReJitData->rejitID));
 
     struct DacpTieredVersionData codeAddrs[kcMaxTieredVersions];
     int cCodeAddrs;
 
-    LPCSTR szFlags;
-    switch (pReJitData->flags)
-    {
-    default:
-    case DacpReJitData::kUnknown:
-        szFlags = "";
-        break;
-
-    case DacpReJitData::kRequested:
-        szFlags = " (READY to jit on next call)";
-        break;
-
-    case DacpReJitData::kActive:
-        szFlags = " (CURRENT)";
-        break;
-
-    case DacpReJitData::kReverted:
-        szFlags = " (reverted)";
-        break;
-    }
-    
-    ExtOut("%s\n", szFlags);
-
     ReleaseHolder<ISOSDacInterface5> sos5;
     if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface5), &sos5)) && 
         SUCCEEDED(sos5->GetTieredVersions(pMethodDesc, 
-                                            (int)pReJitData->rejitID,
+                                            rejitID,
                                             codeAddrs,
                                             kcMaxTieredVersions,
                                             &cCodeAddrs)))
     {
-        DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs);
-    }
-
-    struct DacpReJitData2 rejitData;
-    ReleaseHolder<ISOSDacInterface7> sos7;
-    if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)) && 
-        SUCCEEDED(sos7->GetReJITInformation(pMethodDesc, 
-                                            (int)pReJitData->rejitID,
-                                            &rejitData)))
-    {
-        ExtOut("    ReJIT Information:\n");
-        DMLOut("      IL Addr:            %s\n", DMLIL(rejitData.il));
-        ExtOut("      ILCodeVersion:      %p\n", SOS_PTR(rejitData.ilCodeVersionNodePtr));
+        DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs, rejitID, ilAddr, ilNodeAddr);
     }
 }
 
@@ -2855,10 +2807,6 @@ void DumpAllRejitDataIfNecessary(DacpMethodDescData * pMethodDescData, DacpReJit
     {
         return;
     }
-    ExtOut("ReJITed versions:\n");
-
-    // Dump CURRENT rejit info
-    DumpRejitData(pMethodDescData->MethodDescPtr, &pMethodDescData->rejitDataCurrent);
 
     // Dump reverted rejit infos
     for (ULONG i=0; i < cRevertedRejitData; i++)
@@ -2903,20 +2851,48 @@ void DumpMDInfoFromMethodDescData(DacpMethodDescData * pMethodDescData, DacpReJi
 
         DMLOut("Current CodeAddr:     %s\n", DMLIP(pMethodDescData->NativeCodeAddr));                
 
+        int rejitID = (int)pMethodDescData->rejitDataCurrent.rejitID;
+        CLRDATA_ADDRESS ilAddr = 0;
+        CLRDATA_ADDRESS ilNodeAddr = 0;
+
+        struct DacpReJitData2 rejitData;
+        ReleaseHolder<ISOSDacInterface7> sos7;
+        if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface7), &sos7)))
+        {
+            if SUCCEEDED(sos7->GetReJITInformation(pMethodDescData->MethodDescPtr, 
+                                                   rejitID,
+                                                   &rejitData))
+            {
+                ilAddr = rejitData.il;
+                ilNodeAddr = rejitData.ilCodeVersionNodePtr;
+            }
+
+            int pendingRejitID;
+            struct DacpReJitData2 pendingRejitData;
+            if (sos7->GetPendingReJITID(pMethodDescData->MethodDescPtr, &pendingRejitID) == S_OK &&
+                SUCCEEDED(sos7->GetReJITInformation(pMethodDescData->MethodDescPtr, pendingRejitID, &pendingRejitData)))
+            {
+                // Special case, there is no jitted code yet but still need to output the IL information
+                ExtOut("ILCodeVersion:      %p (pending)\n", SOS_PTR(pendingRejitData.ilCodeVersionNodePtr));
+                ExtOut("      ReJIT ID:           %d\n", pendingRejitID);
+                DMLOut("      IL Addr:            %s\n", DMLIL(pendingRejitData.il));
+            }
+        }
+
         struct DacpTieredVersionData codeAddrs[kcMaxTieredVersions];
         int cCodeAddrs;
 
         ReleaseHolder<ISOSDacInterface5> sos5;
         if (SUCCEEDED(g_sos->QueryInterface(__uuidof(ISOSDacInterface5), &sos5)) && 
             SUCCEEDED(sos5->GetTieredVersions(pMethodDescData->MethodDescPtr, 
-                                                                (int)pMethodDescData->rejitDataCurrent.rejitID,
+                                                                rejitID,
                                                                 codeAddrs,
                                                                 kcMaxTieredVersions,
                                                                 &cCodeAddrs)))
         {
-            DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs);
+            DumpTieredNativeCodeAddressInfo(codeAddrs, cCodeAddrs, rejitID, ilAddr, ilNodeAddr);
         }
-        
+
         DumpAllRejitDataIfNecessary(pMethodDescData, pRevertedRejitData, cRevertedRejitData);
     }
     else
index f41053739f3e37e04b802ef2e84890529ff806b7..89a7d8469357bd26dd2d60d95fe30fb28b9d1297 100644 (file)
@@ -385,6 +385,7 @@ interface ISOSDacInterface6 : IUnknown
 ]
 interface ISOSDacInterface7 : IUnknown
 {
+    HRESULT GetPendingReJITID(CLRDATA_ADDRESS methodDesc, int *pRejitId);
     HRESULT GetReJITInformation(CLRDATA_ADDRESS methodDesc, int rejitId, struct DacpReJitData2 *pRejitData);
     HRESULT GetProfilerModifiedILInformation(CLRDATA_ADDRESS methodDesc, struct DacpProfilerILData *pILData);
     HRESULT GetMethodsWithProfilerModifiedIL(CLRDATA_ADDRESS mod, CLRDATA_ADDRESS *methodDescs, int cMethodDescs, int *pcMethodDescs);
index 4d4c504efd12e272e7b6858a1a61e5e9711bac74..2f03eb0134e69716a1ee1291b5fe83f423366b47 100644 (file)
@@ -2392,6 +2392,10 @@ EXTERN_C const IID IID_ISOSDacInterface7;
     ISOSDacInterface7 : public IUnknown
     {
     public:
+        virtual HRESULT STDMETHODCALLTYPE GetPendingReJITID( 
+            CLRDATA_ADDRESS methodDesc,
+            int *pRejitId) = 0;
+        
         virtual HRESULT STDMETHODCALLTYPE GetReJITInformation( 
             CLRDATA_ADDRESS methodDesc,
             int rejitId,
@@ -2428,6 +2432,11 @@ EXTERN_C const IID IID_ISOSDacInterface7;
         ULONG ( STDMETHODCALLTYPE *Release )( 
             ISOSDacInterface7 * This);
         
+        HRESULT ( STDMETHODCALLTYPE *GetPendingReJITID )( 
+            ISOSDacInterface7 * This,
+            CLRDATA_ADDRESS methodDesc,
+            int *pRejitId);
+        
         HRESULT ( STDMETHODCALLTYPE *GetReJITInformation )( 
             ISOSDacInterface7 * This,
             CLRDATA_ADDRESS methodDesc,
@@ -2469,6 +2478,9 @@ EXTERN_C const IID IID_ISOSDacInterface7;
     ( (This)->lpVtbl -> Release(This) ) 
 
 
+#define ISOSDacInterface7_GetPendingReJITID(This,methodDesc,pRejitId)   \
+    ( (This)->lpVtbl -> GetPendingReJITID(This,methodDesc,pRejitId) ) 
+
 #define ISOSDacInterface7_GetReJITInformation(This,methodDesc,rejitId,pRejitData)   \
     ( (This)->lpVtbl -> GetReJITInformation(This,methodDesc,rejitId,pRejitData) )