Index: utils/LLVMVisualizers/llvm.natvis =================================================================== --- utils/LLVMVisualizers/llvm.natvis +++ utils/LLVMVisualizers/llvm.natvis @@ -168,4 +168,35 @@ <Item Name="[underlying]" Condition="hasVal">*(($T1 *)(unsigned char *)storage.buffer)</Item> </Expand> </Type> + + <!-- Since we're in MSVC, we can assume that the system is little endian. Therefore + the little and native cases just require a cast. Handle this easy case first. Use + a wildcard for the second template argument (the endianness), but we will use a + specific value of 0 later on for the big endian to give it priority for being a + better match. --> + <Type Name="llvm::support::detail::packed_endian_specific_integral<*,*,1>"> + <DisplayString>little endian {*(($T1*)(unsigned char *)Value.buffer)}</DisplayString> + <Expand> + <Item Name="[value]">*(($T1*)(unsigned char *)Value.buffer)</Item> + <Item Name="[Raw Bytes]" Condition="sizeof($T1)==1">(unsigned char *)Value.buffer,1</Item> + <Item Name="[Raw Bytes]" Condition="sizeof($T1)==2">(unsigned char *)Value.buffer,2</Item> + <Item Name="[Raw Bytes]" Condition="sizeof($T1)==4">(unsigned char *)Value.buffer,4</Item> + <Item Name="[Raw Bytes]" Condition="sizeof($T1)==8">(unsigned char *)Value.buffer,8</Item> + </Expand> + </Type> + + <!-- Now handle the hard case of big endian. We need to do the swizzling here, but + we need to specialize it based on the size of the value type. --> + <Type Name="llvm::support::detail::packed_endian_specific_integral<*,0,1>"> + <DisplayString Condition="sizeof($T1)==1">big endian {*(unsigned char *)Value.buffer}</DisplayString> + <DisplayString Condition="sizeof($T1)==2">big endian {(($T1)(*(unsigned char *)Value.buffer) << 8) | ($T1)(*((unsigned char *)Value.buffer+1))}</DisplayString> + <DisplayString Condition="sizeof($T1)==4">big endian {(($T1)(*(unsigned char *)Value.buffer) << 24) | (($T1)(*((unsigned char *)Value.buffer+1)) << 16) | (($T1)(*((unsigned char *)Value.buffer+2)) << 8) | ($T1)(*((unsigned char *)Value.buffer+3))}</DisplayString> + <DisplayString Condition="sizeof($T1)==8">big endian {(($T1)(*(unsigned char *)Value.buffer) << 56) | (($T1)(*((unsigned char *)Value.buffer+1)) << 48) | (($T1)(*((unsigned char *)Value.buffer+2)) << 40) | (($T1)(*((unsigned char *)Value.buffer+3)) << 32) | (($T1)(*((unsigned char *)Value.buffer+4)) << 24) | (($T1)(*((unsigned char *)Value.buffer+5)) << 16) | (($T1)(*((unsigned char *)Value.buffer+6)) << 8) | ($T1)(*((unsigned char *)Value.buffer+7))}</DisplayString> + <Expand> + <Item Name="[Raw Bytes]" Condition="sizeof($T1)==1">(unsigned char *)Value.buffer,1</Item> + <Item Name="[Raw Bytes]" Condition="sizeof($T1)==2">(unsigned char *)Value.buffer,2</Item> + <Item Name="[Raw Bytes]" Condition="sizeof($T1)==4">(unsigned char *)Value.buffer,4</Item> + <Item Name="[Raw Bytes]" Condition="sizeof($T1)==8">(unsigned char *)Value.buffer,8</Item> + </Expand> + </Type> </AutoVisualizer>