Beispiel #1
0
        public void Write(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, bool haveDebugInfo, BinaryWriter writer)
        {
            HighRegionBuilder regionBuilder = new HighRegionBuilder();
            regionBuilder.IndexCfgNode(m_entryNode.Value);

            MemoryStream regionNodesStream = new MemoryStream();
            BinaryWriter regionNodesWriter = new BinaryWriter(regionNodesStream);

            HighCfgNode cfgNode = regionBuilder.DequeueUnemittedNode();
            while (cfgNode != null)
            {
                cfgNode.Write(fileBuilder, methodBuilder, regionBuilder, haveDebugInfo, regionNodesWriter);

                cfgNode = regionBuilder.DequeueUnemittedNode();
            }

            regionNodesWriter.Flush();

            regionBuilder.WriteHeader(writer);
            writer.Flush();
            regionNodesStream.WriteTo(writer.BaseStream);
        }
Beispiel #2
0
        public void Write(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, bool haveDebugInfo, BinaryWriter writer)
        {
            HighCfgNodeBuilder cfgNodeBuilder = new HighCfgNodeBuilder();

            HashSet<HighSsaRegister> gatheredConstants = new HashSet<HighSsaRegister>();
            List<HighSsaRegister> constants = new List<HighSsaRegister>();

            HighInstruction.VisitSsaDelegate constVisitor = delegate (ref HighSsaRegister use)
            {
                if (use.IsConstant && !gatheredConstants.Contains(use))
                {
                    gatheredConstants.Add(use);
                    constants.Add(use);
                }
            };

            foreach (HighInstruction instr in m_instructions)
                instr.VisitSsaUses(constVisitor);

            writer.Write((uint)m_predecessors.Length);
            writer.Write((uint)m_phis.Length);
            writer.Write((uint)m_instructions.Length);
            writer.Write((uint)constants.Count);

            foreach (HighCfgNodeHandle pred in m_predecessors)
                writer.Write(regionBuilder.IndexCfgNode(pred.Value));

            foreach (HighPhi phi in m_phis)
            {
                cfgNodeBuilder.AddSsa(phi.Dest);
                phi.Write(fileBuilder, regionBuilder, m_predecessors, writer);
            }

            foreach (HighSsaRegister constant in constants)
            {
                cfgNodeBuilder.AddSsa(constant);
                constant.WriteConstant(fileBuilder, regionBuilder, writer);
            }

            foreach (HighInstruction instr in m_instructions)
                instr.Write(fileBuilder, methodBuilder, regionBuilder, cfgNodeBuilder, haveDebugInfo, writer);
        }
 public void Write(HighFileBuilder fileBuilder, HighRegionBuilder regionBuilder, BinaryWriter writer)
 {
     writer.Write((uint)m_escapePath);
     writer.Write(regionBuilder.IndexCfgNode(m_cfgNode.Value));
 }