1 package Analysis.Pointer;
2 import Analysis.Disjoint.PointerMethod;
6 public class BasicBlock {
9 public Set<BBlock> blockset;
11 public BasicBlock(BBlock start, BBlock exit, Set<BBlock> blockset) {
14 this.blockset=blockset;
17 public Set<BBlock> getBlocks() {
21 public BBlock getStart() {
25 public BBlock getExit() {
29 public static class BBlock {
30 Vector<FlatNode> nodes;
36 nodes=new Vector<FlatNode>();
37 prevb=new Vector<BBlock>();
38 nextb=new Vector<BBlock>();
41 public Vector<FlatNode> nodes() {
44 public Vector<BBlock> next() {
47 public Vector<BBlock> prev() {
52 public static BasicBlock getBBlock(FlatMethod fm) {
54 Stack<FlatNode> toprocess=new Stack<FlatNode>();
55 HashMap<FlatNode, BBlock> map=new HashMap<FlatNode, BBlock>();
56 PointerMethod pm=new PointerMethod();
57 HashSet<BBlock> blockset=new HashSet<BBlock>();
60 BBlock b=new BBlock();
64 while(!toprocess.isEmpty()) {
65 FlatNode fn=toprocess.pop();
66 BBlock block=map.get(fn);
68 if (fn.kind()==FKind.FlatExit)
71 if (pm.numNext(fn)!=1) {
72 for(int i=0; i<pm.numNext(fn); i++) {
73 FlatNode fnext=pm.getNext(fn,i);
74 if (!map.containsKey(fnext)) {
75 BBlock newb=new BBlock();
81 if (!block.nextb.contains(map.get(fnext))) {
82 block.nextb.add(map.get(fnext));
83 map.get(fnext).prevb.add(block);
89 if (pm.numPrev(fn)>1) {
91 if (!map.containsKey(fn)) {
92 BBlock newb=new BBlock();
98 if (!block.nextb.contains(map.get(fn))) {
99 block.nextb.add(map.get(fn));
100 map.get(fn).prevb.add(block);
105 if (fn.kind()==FKind.FlatExit)
109 return new BasicBlock(map.get(fm), exit, blockset);