Exemple #1
0
        public void Write(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, bool haveDebugInfo, BinaryWriter writer)
        {
            writer.Write((uint)m_escapePathTerminators.Length);

            foreach (HighEscapePathTerminator terminator in m_escapePathTerminators)
                terminator.Write(fileBuilder, regionBuilder, writer);

            m_protRegion.Write(fileBuilder, methodBuilder, haveDebugInfo, writer);
        }
Exemple #2
0
 public void Write(HighFileBuilder fileBuilder, HighRegionBuilder regionBuilder, BinaryWriter writer)
 {
     if (m_reg.IsConstant)
     {
         writer.Write(true);
         m_reg.WriteConstant(fileBuilder, regionBuilder, writer);
     }
     else
     {
         writer.Write(false);
         writer.Write(regionBuilder.FindPredecessorSsaIndex(m_predecessor.Value, m_reg));
     }
 }
Exemple #3
0
        public void Write(HighFileBuilder fileBuilder, HighRegionBuilder regionBuilder, HighCfgNodeHandle[] predecessors, BinaryWriter writer)
        {
            m_dest.WriteDestinationDef(fileBuilder, regionBuilder, writer);

            int numPreds = predecessors.Length;
            if (m_links.Length != numPreds)
                throw new ArgumentException("Phi and node have different number of predecessors");

            for (int i = 0; i < numPreds; i++)
            {
                HighPhiLink link = m_links[i];
                if (link.Predecessor.Value != predecessors[i].Value)
                    throw new ArgumentException("Phi has a mismatched predecessor");
                link.Write(fileBuilder, regionBuilder, writer);
            }
        }
Exemple #4
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);
        }
Exemple #5
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 override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
     writer.Write((byte)m_operation);
     writer.Write((byte)m_numberType);
     writer.Write(m_trueValue);
     writer.Write(m_falseValue);
 }
 public void Write(HighFileBuilder fileBuilder, HighRegionBuilder regionBuilder, BinaryWriter writer)
 {
     writer.Write((uint)m_escapePath);
     writer.Write(regionBuilder.IndexCfgNode(m_cfgNode.Value));
 }
 public override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
     writer.Write(fileBuilder.IndexMethodSpecTag(m_methodSpec));
     writer.Write(fileBuilder.IndexTypeSpecTag(m_constraintType));
     writer.Write((uint)m_parameters.Length);
 }
 public override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
     writer.Write(fileBuilder.IndexString(m_field));
 }
Exemple #10
0
        public void WriteDestinationDef(HighFileBuilder fileBuilder, HighRegionBuilder regionBuilder, BinaryWriter writer)
        {
            if (this.IsConstant)
                throw new Exception("Can't use constant as a destination");

            writer.Write((byte)m_valueType);
            writer.Write(fileBuilder.IndexTypeSpecTag(m_type));
        }
 public override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
     throw new NotImplementedException();
 }
Exemple #12
0
 public override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
     writer.Write((uint)m_cases.Length);
 }
 public override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
     writer.Write((byte)m_conversionType);
     writer.Write(m_destPrecision);
     writer.Write(m_sourcePrecision);
 }
 public override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
     writer.Write(fileBuilder.IndexTypeSpecTag(m_type));
     writer.Write(fileBuilder.IndexString(m_fieldName));
     writer.Write(m_isStatic);
 }
Exemple #15
0
 public override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
     writer.Write((byte)m_arithOp);
     writer.Write((byte)m_arithType);
     writer.Write(m_checkOverflow);
 }
 public override void WriteHeader(HighFileBuilder fileBuilder, HighMethodBuilder methodBuilder, HighRegionBuilder regionBuilder, HighCfgNodeBuilder cfgNodeBuilder, bool haveDebugInfo, BinaryWriter writer)
 {
 }
Exemple #17
0
        public void WriteConstant(HighFileBuilder fileBuilder, HighRegionBuilder regionBuilder, BinaryWriter writer)
        {
            if (!this.IsConstant)
                throw new Exception("Can't use non-constant as a constant");
            writer.Write((byte)m_valueType);
            writer.Write(fileBuilder.IndexTypeSpecTag(m_type));

            if (m_valueType == HighValueType.Null)
            {
            }
            else if (m_valueType == HighValueType.ConstantString)
                writer.Write(fileBuilder.IndexString((string)m_constValue));
            else if (m_valueType == HighValueType.ConstantValue)
            {
                TypeSpecClassTag classTag = (TypeSpecClassTag)m_type;
                TypeNameTag className = classTag.TypeName;
                string classNameStr = className.TypeName;

                if (classNameStr == "SByte")
                    writer.Write((sbyte)m_constValue);
                else if (classNameStr == "Byte")
                    writer.Write((byte)m_constValue);
                else if (classNameStr == "Int16")
                    writer.Write((short)m_constValue);
                else if (classNameStr == "UInt16")
                    writer.Write((ushort)m_constValue);
                else if (classNameStr == "Int32")
                    writer.Write((int)m_constValue);
                else if (classNameStr == "UInt32")
                    writer.Write((uint)m_constValue);
                else if (classNameStr == "Int64")
                    writer.Write((long)m_constValue);
                else if (classNameStr == "UInt64")
                    writer.Write((ulong)m_constValue);
                else if (classNameStr == "IntPtr")
                    writer.Write((long)m_constValue);
                else if (classNameStr == "UIntPtr")
                    writer.Write((ulong)m_constValue);
                else if (classNameStr == "Single")
                    writer.Write((float)m_constValue);
                else if (classNameStr == "Double")
                    writer.Write((double)m_constValue);
                else
                    throw new ArgumentException();
            }
            else
                throw new Exception();
        }