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(); } } }
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); }