コード例 #1
0
        public static void FixLabelsNumeration(List <ThreeAddrLine> code)
        {
            int count = 0;
            Dictionary <String, int> convert = new Dictionary <string, int>();

            foreach (var line in code)
            {
                if (line.Label == null)
                {
                    line.Label = (count++).ToString();
                }
                else
                {
                    convert[line.Label] = count++;
                    line.Label          = convert[line.Label].ToString();
                }
            }

            foreach (var line in code)
            {
                if (ThreeAddrOpType.IsGoto(line.OpType))
                {
                    line.RightOp = convert[line.RightOp].ToString();
                }
            }
        }
コード例 #2
0
        public static List <BaseBlock> GenBaseBlocks(List <ThreeAddrLine> code)
        {
            var _isNewBlock = new bool[code.Count + 1];

            _isNewBlock.Initialize();
            _isNewBlock[0] = true;
            for (int i = 0; i < code.Count; ++i)
            {
                if (ThreeAddrOpType.IsGoto(code[i].OpType))
                {
                    // replace useless goto on Nop
                    if ((Int32.Parse(code[i].Label) + 1) == Int32.Parse(code[i].RightOp))
                    {
                        code[i].OpType = ThreeAddrOpType.Nop;
                        continue;
                    }

                    _isNewBlock[i + 1] = true;
                    int dst = int.Parse(code[i].RightOp);
                    _isNewBlock[dst] = true;
                }
            }

            var baseBlocks = new List <BaseBlock>();

            for (int i = 0; i < code.Count; ++i)
            {
                if (_isNewBlock[i])
                {
                    baseBlocks.Add(new BaseBlock());
                }
                baseBlocks[baseBlocks.Count - 1].Code.Add(code[i]);
            }

            return(baseBlocks);
        }