| //===--- PassManagerVerifierAnalysis.h ------------------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SWIFT_SILOPTIMIZER_ANALYSIS_PASSMANAGERVERIFIERANALYSIS_H |
| #define SWIFT_SILOPTIMIZER_ANALYSIS_PASSMANAGERVERIFIERANALYSIS_H |
| |
| #include "swift/SIL/SILFunction.h" |
| #include "swift/SILOptimizer/Analysis/Analysis.h" |
| #include "llvm/ADT/DenseSet.h" |
| #include "llvm/ADT/StringSet.h" |
| |
| namespace swift { |
| |
| /// An analysis that validates that the pass manager properly sends add/delete |
| /// messages as functions are added/deleted from the module. |
| /// |
| /// All methods are no-ops when asserts are disabled. |
| class PassManagerVerifierAnalysis : public SILAnalysis { |
| /// The module that we are processing. |
| LLVM_ATTRIBUTE_UNUSED |
| SILModule &mod; |
| |
| /// The set of "live" functions that we are tracking. We store the names of |
| /// the functions so that if a function is deleted we do not need to touch its |
| /// memory to get its name. |
| /// |
| /// All functions in mod must be in liveFunctions and vis-a-versa. |
| llvm::StringSet<> liveFunctionNames; |
| |
| public: |
| PassManagerVerifierAnalysis(SILModule *mod); |
| |
| static bool classof(const SILAnalysis *analysis) { |
| return analysis->getKind() == SILAnalysisKind::PassManagerVerifier; |
| } |
| |
| /// Validate that the analysis is able to look up all functions and that those |
| /// functions are live. |
| void invalidate() override final; |
| |
| /// Validate that the analysis is able to look up the given function. |
| void invalidate(SILFunction *f, InvalidationKind k) override final; |
| |
| /// If a function has not yet been seen start tracking it. |
| void notifyAddedOrModifiedFunction(SILFunction *f) override final; |
| |
| /// Stop tracking a function. |
| void notifyWillDeleteFunction(SILFunction *f) override final; |
| |
| /// Make sure that when we invalidate a function table, make sure we can find |
| /// all functions for all witness tables. |
| void invalidateFunctionTables() override final; |
| |
| /// Run the entire verification. |
| void verifyFull() const override final; |
| }; |
| |
| } // namespace swift |
| |
| #endif |