Xml serialize section contents and gcinfo transitions
authorAmy Yu <amycmyu@gmail.com>
Fri, 22 Jun 2018 01:31:22 +0000 (18:31 -0700)
committerAmy Yu <amycmyu@gmail.com>
Tue, 26 Jun 2018 22:04:10 +0000 (15:04 -0700)
Commit migrated from https://github.com/dotnet/coreclr/commit/5678ab7e406ba8040aff07cb9364c70ac6042d83

src/coreclr/src/tools/r2rdump/GCInfo.cs
src/coreclr/src/tools/r2rdump/R2RDump.cs

index cf51c8b..c423eab 100644 (file)
@@ -127,8 +127,9 @@ namespace R2RDump
         public GcSlotTable SlotTable { get; set; }
         public int Size { get; set; }
         public int Offset { get; set; }
+
         [XmlIgnore]
-        public Dictionary<int, GcTransition> Transitions { get; }
+        public Dictionary<int, GcTransition> Transitions { get; set; }
 
         public GcInfo() { }
 
index 1e6ccf6..6606b49 100644 (file)
@@ -230,7 +230,10 @@ namespace R2RDump
                     methodNode.AppendChild(gcNode);
                     Serialize(method.GcInfo, gcNode);
 
-                    Serialize(new List<GcInfo.GcTransition>(method.GcInfo.Transitions.Values), gcNode);
+                    foreach (KeyValuePair<int, GcInfo.GcTransition> transition in method.GcInfo.Transitions)
+                    {
+                        Serialize(transition, gcNode);
+                    }
                 }
                 else
                 {
@@ -407,21 +410,29 @@ namespace R2RDump
                     }
                     break;
                 case R2RSection.SectionType.READYTORUN_SECTION_RUNTIME_FUNCTIONS:
-                    if (!_xml)
+                    int rtfOffset = r2r.GetOffset(section.RelativeVirtualAddress);
+                    int rtfEndOffset = rtfOffset + section.Size;
+                    int rtfIndex = 0;
+                    while (rtfOffset < rtfEndOffset)
                     {
-                        int rtfOffset = r2r.GetOffset(section.RelativeVirtualAddress);
-                        int rtfEndOffset = rtfOffset + section.Size;
-                        int rtfIndex = 0;
-                        while (rtfOffset < rtfEndOffset)
+                        uint rva = NativeReader.ReadUInt32(r2r.Image, ref rtfOffset);
+                        if (_xml)
+                        {
+                            AddXMLNode($"{rtfIndex}", $"0x{rva:X8}", contentsNode);
+                        }
+                        else
                         {
-                            uint rva = NativeReader.ReadUInt32(r2r.Image, ref rtfOffset);
                             _writer.WriteLine($"{rtfIndex}: 0x{rva:X8}");
-                            rtfIndex++;
                         }
+                        rtfIndex++;
                     }
                     break;
                 case R2RSection.SectionType.READYTORUN_SECTION_COMPILER_IDENTIFIER:
-                    if (!_xml)
+                    if(_xml)
+                    {
+                        AddXMLNode("CompileIdentifier", r2r.CompileIdentifier, contentsNode);
+                    }
+                    else
                     {
                         _writer.WriteLine(r2r.CompileIdentifier);
                     }
@@ -482,15 +493,20 @@ namespace R2RDump
                                 DumpBytes(r2r, importSection.AuxiliaryDataRVA, (uint)importSection.AuxiliaryData.Size, bytesNode);
                             }
                         }
-                        if (!_xml)
+                        foreach (R2RImportSection.ImportSectionEntry entry in importSection.Entries)
                         {
-                            foreach (R2RImportSection.ImportSectionEntry entry in importSection.Entries)
+                            if (_xml)
+                            {
+                                Serialize(entry, contentsNode);
+                            }
+                            else
                             {
                                 _writer.WriteLine();
                                 _writer.WriteLine(entry.ToString());
                             }
-                            _writer.WriteLine();
                         }
+                        if (!_xml)
+                            _writer.WriteLine();
                     }
                     break;
             }