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
<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"/>
{
// 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
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)