File indexing completed on 2026-05-10 08:43:12
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef LLVM_ANALYSIS_EHUTILS_H
0009 #define LLVM_ANALYSIS_EHUTILS_H
0010
0011 #include "llvm/ADT/DenseMap.h"
0012 #include "llvm/ADT/DenseSet.h"
0013
0014 namespace llvm {
0015
0016
0017 template <typename FunctionT, typename BlockT>
0018 static void computeEHOnlyBlocks(FunctionT &F, DenseSet<BlockT *> &EHBlocks) {
0019
0020
0021
0022 enum Status { Unknown = 0, EH = 1, NonEH = 2 };
0023 DenseSet<BlockT *> WorkList;
0024 DenseMap<BlockT *, Status> Statuses;
0025
0026 auto GetStatus = [&](BlockT *BB) {
0027 auto It = Statuses.find(BB);
0028 return It != Statuses.end() ? It->second : Unknown;
0029 };
0030
0031 auto CheckPredecessors = [&](BlockT *BB, Status Stat) {
0032 for (auto *PredBB : predecessors(BB)) {
0033 Status PredStatus = GetStatus(PredBB);
0034
0035
0036 if (PredStatus > Stat)
0037 Stat = PredStatus;
0038 }
0039 return Stat;
0040 };
0041
0042 auto AddSuccesors = [&](BlockT *BB) {
0043 for (auto *SuccBB : successors(BB)) {
0044 if (!SuccBB->isEHPad())
0045 WorkList.insert(SuccBB);
0046 }
0047 };
0048
0049
0050 BlockT *StartBlock = &F.front();
0051 Statuses[StartBlock] = NonEH;
0052 AddSuccesors(StartBlock);
0053
0054 for (auto &BB : F) {
0055 if (BB.isEHPad()) {
0056 AddSuccesors(&BB);
0057 Statuses[&BB] = EH;
0058 }
0059 }
0060
0061
0062 while (!WorkList.empty()) {
0063 auto *BB = *WorkList.begin();
0064 WorkList.erase(BB);
0065
0066 Status OldStatus = GetStatus(BB);
0067
0068
0069
0070 Status NewStatus = CheckPredecessors(BB, OldStatus);
0071
0072
0073 bool Changed = OldStatus != NewStatus;
0074 if (Changed) {
0075 AddSuccesors(BB);
0076 Statuses[BB] = NewStatus;
0077 }
0078 }
0079
0080 for (auto Entry : Statuses) {
0081 if (Entry.second == EH)
0082 EHBlocks.insert(Entry.first);
0083 }
0084 }
0085 }
0086
0087 #endif