LLVM: include/llvm/Analysis/EHUtils.h Source File (original) (raw)
19
20
21
25
26 auto GetStatus = [&](BlockT *BB) {
27 auto It = Statuses.find(BB);
28 return It != Statuses.end() ? It->second : Unknown;
29 };
30
31 auto CheckPredecessors = [&](BlockT *BB, Status Stat) {
33 Status PredStatus = GetStatus(PredBB);
34
35
36 if (PredStatus > Stat)
37 Stat = PredStatus;
38 }
39 return Stat;
40 };
41
42 auto AddSuccesors = [&](BlockT *BB) {
44 if (!SuccBB->isEHPad())
45 WorkList.insert(SuccBB);
46 }
47 };
48
49
50 BlockT *StartBlock = &F.front();
51 Statuses[StartBlock] = NonEH;
52 AddSuccesors(StartBlock);
53
54 for (auto &BB : F) {
55 if (BB.isEHPad()) {
56 AddSuccesors(&BB);
57 Statuses[&BB] = EH;
58 }
59 }
60
61
62 while (!WorkList.empty()) {
63 auto *BB = *WorkList.begin();
64 WorkList.erase(BB);
65
66 Status OldStatus = GetStatus(BB);
67
68
69
70 Status NewStatus = CheckPredecessors(BB, OldStatus);
71
72
73 bool Changed = OldStatus != NewStatus;
75 AddSuccesors(BB);
76 Statuses[BB] = NewStatus;
77 }
78 }
79
80 for (auto Entry : Statuses) {
81 if (Entry.second == EH)
82 EHBlocks.insert(Entry.first);
83 }
84}