Tweaks to existing BulkType event (dotnet/coreclr#27516)
authorDavid Wrighton <davidwr@microsoft.com>
Mon, 4 Nov 2019 23:26:00 +0000 (15:26 -0800)
committerGitHub <noreply@github.com>
Mon, 4 Nov 2019 23:26:00 +0000 (15:26 -0800)
- Enable specification of exact multi-dimensional array rank
- Tolerate scenarios where the name of the type is so large that it prevents generation of the BulkType event

Commit migrated from https://github.com/dotnet/coreclr/commit/fd418f6c39dde248a157ba30ae9b9685e306b0a3

src/coreclr/src/inc/eventtracebase.h
src/coreclr/src/vm/ClrEtwAll.man
src/coreclr/src/vm/eventtrace.cpp

index d36e810..453375a 100644 (file)
@@ -46,6 +46,16 @@ enum EtwTypeFlags
     kEtwTypeFlagsFinalizable =                      0x2,
     kEtwTypeFlagsExternallyImplementedCOMObject =   0x4,
     kEtwTypeFlagsArray =                            0x8,
+    kEtwTypeFlagsArrayRankBit0 =                  0x100,
+    kEtwTypeFlagsArrayRankBit1 =                  0x200,
+    kEtwTypeFlagsArrayRankBit2 =                  0x400,
+    kEtwTypeFlagsArrayRankBit3 =                  0x800,
+    kEtwTypeFlagsArrayRankBit4 =                 0x1000,
+    kEtwTypeFlagsArrayRankBit5 =                 0x2000,
+
+    kEtwTypeFlagsArrayRankMask =                 0x3F00,
+    kEtwTypeFlagsArrayRankShift =                     8,
+    kEtwTypeFlagsArrayRankMax = kEtwTypeFlagsArrayRankMask >> kEtwTypeFlagsArrayRankShift
 };
 
 enum EtwThreadFlags
index 0aaa41f..1e82a1b 100644 (file)
                         <map value="0x2" message="$(string.RuntimePublisher.TypeFlags.Finalizable)"/>
                         <map value="0x4" message="$(string.RuntimePublisher.TypeFlags.ExternallyImplementedCOMObject)"/>
                         <map value="0x8" message="$(string.RuntimePublisher.TypeFlags.Array)"/>
+                        <map value="0x100" message="$(string.RuntimePublisher.TypeFlags.ArrayRankBit0)"/>
+                        <map value="0x200" message="$(string.RuntimePublisher.TypeFlags.ArrayRankBit1)"/>
+                        <map value="0x400" message="$(string.RuntimePublisher.TypeFlags.ArrayRankBit2)"/>
+                        <map value="0x800" message="$(string.RuntimePublisher.TypeFlags.ArrayRankBit3)"/>
+                        <map value="0x1000" message="$(string.RuntimePublisher.TypeFlags.ArrayRankBit4)"/>
+                        <map value="0x2000" message="$(string.RuntimePublisher.TypeFlags.ArrayRankBit5)"/>
                     </bitMap>
                     <bitMap name="GCRootFlagsMap">
                       <map value="0x1" message="$(string.RuntimePublisher.GCRootFlags.Pinning)"/>
                 <string id="RuntimePublisher.TypeFlags.Finalizable" value="Finalizable"/>
                 <string id="RuntimePublisher.TypeFlags.ExternallyImplementedCOMObject" value="ExternallyImplementedCOMObject"/>
                 <string id="RuntimePublisher.TypeFlags.Array" value="Array"/>
+                <string id="RuntimePublisher.TypeFlags.ArrayRankBit0" value="ArrayRankBit0"/>
+                <string id="RuntimePublisher.TypeFlags.ArrayRankBit1" value="ArrayRankBit1"/>
+                <string id="RuntimePublisher.TypeFlags.ArrayRankBit2" value="ArrayRankBit2"/>
+                <string id="RuntimePublisher.TypeFlags.ArrayRankBit3" value="ArrayRankBit3"/>
+                <string id="RuntimePublisher.TypeFlags.ArrayRankBit4" value="ArrayRankBit4"/>
+                <string id="RuntimePublisher.TypeFlags.ArrayRankBit5" value="ArrayRankBit5"/>
                 <string id="RuntimePublisher.GCRootFlags.Pinning" value="Pinning"/>
                 <string id="RuntimePublisher.GCRootFlags.WeakRef" value="WeakRef"/>
                 <string id="RuntimePublisher.GCRootFlags.Interior" value="Interior"/>
index 7b6a58f..2e73dec 100644 (file)
@@ -1778,7 +1778,20 @@ int BulkTypeEventLogger::LogSingleType(TypeHandle th)
     {
         // Normal typedesc array
         pVal->fixedSizedData.Flags |= kEtwTypeFlagsArray;
-
+        if (pVal->fixedSizedData.CorElementType == ELEMENT_TYPE_ARRAY)
+        {
+            // Multidimensional arrays set the rank bits, SzArrays do not set the rank bits
+            unsigned rank = th.AsArray()->GetRank();
+            if (rank < kEtwTypeFlagsArrayRankMax)
+            {
+                // Only ranks less than kEtwTypeFlagsArrayRankMax are supported. 
+                // Fortunately kEtwTypeFlagsArrayRankMax should be greater than the 
+                // number of ranks the type loader will support
+                rank <<= kEtwTypeFlagsArrayRankShift;
+                _ASSERTE((rank & kEtwTypeFlagsArrayRankMask) == rank);
+                pVal->fixedSizedData.Flags |= rank;
+            }
+        }
         // Fetch TypeHandle of array elements
         fSucceeded = FALSE;
         EX_TRY
@@ -1895,10 +1908,16 @@ int BulkTypeEventLogger::LogSingleType(TypeHandle th)
     int cbVal = pVal->GetByteCountInEvent();
     if (cbVal > kMaxBytesTypeValues)
     {
-        // This type is apparently so huge, it's too big to squeeze into an event, even
-        // if it were the only type batched in the whole event.  Bail
-        _ASSERTE(!"Type too big to log via ETW");
-        return -1;
+        pVal->sName.Clear();
+        cbVal = pVal->GetByteCountInEvent();
+
+        if (cbVal > kMaxBytesTypeValues)
+        {
+            // This type is apparently so huge, it's too big to squeeze into an event, even
+            // if it were the only type batched in the whole event.  Bail
+            _ASSERTE(!"Type too big to log via ETW");
+            return -1;
+        }
     }
 
     if (m_nBulkTypeValueByteCount + cbVal > kMaxBytesTypeValues)