[Mono.Profiler.Log] Support MLPD version 13
authorRodrigo Moya <rodrigo.moya@xamarin.com>
Thu, 7 Sep 2017 20:16:13 +0000 (22:16 +0200)
committerRodrigo Moya <rodrigo@gnome.org>
Wed, 13 Sep 2017 23:20:13 +0000 (01:20 +0200)
The differences from v14 are small, and given it is the current "stable"
MLPD version, it's worth supporting it. The differences are:

* ImagePointer field not present in v13 Assembly*Event's
* In MonitorEvent, LogMonitorEvent is not in a separate field, but included
  as a flag in the extType field.
* SampleHitEvent's have a type field in v13, which was removed in v14, because
  only cycles samples are emitted.
* MONO_GC_EVENT_{MARK,RECLAIM}_{START,END} were removed in v14
* SampleUnmanagedBinary's SegmentPointer is not based on ptr_base in v13
* In v13, HeapRootsEvent's Attributes is (wrongly) a byte, in v14 this was
  fixed and changed back to a uleb128

mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogEnums.cs
mcs/class/Mono.Profiler.Log/Mono.Profiler.Log/LogProcessor.cs

index 9772f224ff6cb7c1a9a2915906f3c8ff944e04cc..9fc47b470f0898a3a86f8de8c04b9b5a162616c8 100644 (file)
@@ -173,6 +173,11 @@ namespace Mono.Profiler.Log {
                PreStartWorld = 8,
                PostStartWorld = 9,
                PostStartWorldUnlocked = 11,
+               // Following are v13 and older only
+               MarkBegin = 1,
+               MarkEnd = 2,
+               ReclaimBegin = 3,
+               ReclaimEnd = 4
        }
 
        // mono/metadata/mono-gc.h : MonoGCHandleType
index f6928f74505c4f9dd6390eda8ac5c7b048c4aa66..5da4229538f723c1c239cdbdcde3bc159b48547b 100644 (file)
@@ -230,13 +230,13 @@ namespace Mono.Profiler.Log {
                                        if (load) {
                                                ev = new AssemblyLoadEvent {
                                                        AssemblyPointer = ReadPointer (),
-                                                       ImagePointer = ReadPointer (),
+                                                       ImagePointer = StreamHeader.FormatVersion >= 14 ? ReadPointer () : 0,
                                                        Name = Reader.ReadCString (),
                                                };
                                        } else if (unload) {
                                                ev = new AssemblyUnloadEvent {
                                                        AssemblyPointer = ReadPointer (),
-                                                       ImagePointer = ReadPointer (),
+                                                       ImagePointer = StreamHeader.FormatVersion >= 14 ? ReadPointer () : 0,
                                                        Name = Reader.ReadCString (),
                                                };
                                        } else
@@ -336,7 +336,7 @@ namespace Mono.Profiler.Log {
                                                Type = (LogExceptionClause) Reader.ReadByte (),
                                                Index = (long) Reader.ReadULeb128 (),
                                                MethodPointer = ReadMethod (),
-                                               ObjectPointer = ReadObject (),
+                                               ObjectPointer = StreamHeader.FormatVersion >= 14 ? ReadObject () : 0,
                                        };
                                        break;
                                default:
@@ -344,11 +344,20 @@ namespace Mono.Profiler.Log {
                                }
                                break;
                        case LogEventType.Monitor:
+                               if (StreamHeader.FormatVersion < 14) {
+                                       if (extType.HasFlag (LogEventType.MonitorBacktrace)) {
+                                               extType = LogEventType.MonitorBacktrace;
+                                       } else {
+                                               extType = LogEventType.MonitorNoBacktrace;
+                                       }
+                               }
                                switch (extType) {
                                case LogEventType.MonitorNoBacktrace:
                                case LogEventType.MonitorBacktrace:
                                        ev = new MonitorEvent {
-                                               Event = (LogMonitorEvent) Reader.ReadByte (),
+                                               Event = StreamHeader.FormatVersion >= 14 ?
+                                                                   (LogMonitorEvent) Reader.ReadByte () :
+                                                                   (LogMonitorEvent) ((((byte) type & 0xf0) >> 4) & 0x3),
                                                ObjectPointer = ReadObject (),
                                                Backtrace = ReadBacktrace (extType == LogEventType.MonitorBacktrace),
                                        };
@@ -397,7 +406,7 @@ namespace Mono.Profiler.Log {
                                        for (var i = 0; i < list.Length; i++) {
                                                list [i] = new HeapRootsEvent.HeapRoot {
                                                        ObjectPointer = ReadObject (),
-                                                       Attributes = (LogHeapRootAttributes) Reader.ReadULeb128 (),
+                                                       Attributes = StreamHeader.FormatVersion == 13 ? (LogHeapRootAttributes) Reader.ReadByte () : (LogHeapRootAttributes) Reader.ReadULeb128 (),
                                                        ExtraInfo = (long) Reader.ReadULeb128 (),
                                                };
                                        }
@@ -414,9 +423,13 @@ namespace Mono.Profiler.Log {
                        case LogEventType.Sample:
                                switch (extType) {
                                case LogEventType.SampleHit:
+                                       if (StreamHeader.FormatVersion < 14) {
+                                               // Read SampleType (always set to .Cycles) for versions < 14
+                                               Reader.ReadByte ();
+                                       }
                                        ev = new SampleHitEvent {
                                                ThreadId = ReadPointer (),
-                                               UnmanagedBacktrace = ReadBacktrace (true, false),
+                                               UnmanagedBacktrace = ReadBacktrace (true, false), // FIXME: isn't this reversed?
                                                ManagedBacktrace = ReadBacktrace (true),
                                        };
                                        break;
@@ -429,7 +442,7 @@ namespace Mono.Profiler.Log {
                                        break;
                                case LogEventType.SampleUnmanagedBinary:
                                        ev = new UnmanagedBinaryEvent {
-                                               SegmentPointer = ReadPointer (),
+                                               SegmentPointer = StreamHeader.FormatVersion >= 14 ? ReadPointer () : Reader.ReadSLeb128 (),
                                                SegmentOffset = (long) Reader.ReadULeb128 (),
                                                SegmentSize = (long) Reader.ReadULeb128 (),
                                                FileName = Reader.ReadCString (),