/// <summary> /// Adds a new basic block to the procedure <paramref name="proc"/>. /// </summary> /// <param name="addr"></param> /// <param name="proc"></param> /// <param name="blockName"></param> /// <returns></returns> public Block AddBlock(Address addr, Procedure proc, string blockName) { Block b = new Block(proc, addr, blockName); if (Program.User.BlockLabels.TryGetValue(blockName, out var userLabel)) { b.UserLabel = userLabel; } if (!blocks.TryGetUpperBound(addr, out var br)) { var lastMem = segmentMap.Segments.Values.Last().MemoryArea; blocks.Add(addr, new BlockRange(b, addr.ToLinear(), lastMem.BaseAddress.ToLinear() + (uint)lastMem.Length)); } else { blocks.Add(addr, new BlockRange(b, addr.ToLinear(), br.Start)); } blockStarts.Add(b, addr); proc.ControlGraph.Blocks.Add(b); imageMap.AddItem(addr, new ImageMapBlock(addr) { Block = b }); return(b); }