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}