| // Part of the Crubit project, under the Apache License v2.0 with LLVM |
| // Exceptions. See /LICENSE for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| #ifndef CRUBIT_LIFETIME_ANALYSIS_LIFETIME_CONSTRAINTS_H_ |
| #define CRUBIT_LIFETIME_ANALYSIS_LIFETIME_CONSTRAINTS_H_ |
| |
| #include <utility> |
| |
| #include "lifetime_annotations/function_lifetimes.h" |
| #include "lifetime_annotations/lifetime.h" |
| #include "clang/Analysis/FlowSensitive/DataflowLattice.h" |
| #include "llvm/ADT/DenseSet.h" |
| #include "llvm/Support/Error.h" |
| |
| namespace clang { |
| namespace tidy { |
| namespace lifetimes { |
| |
| class LifetimeConstraints { |
| public: |
| // Creates empty constraints. |
| LifetimeConstraints() = default; |
| |
| // Returns the constraints on `callable` that allow `replacement_callable` to |
| // be used where `callable` is requested. |
| static LifetimeConstraints ForCallableSubstitution( |
| const FunctionLifetimes& callable, |
| const FunctionLifetimes& replacement_callable); |
| |
| // Returns the constraints on `callable` and `replacement_callable` that allow |
| // `replacement_callable` to be used where `callable` is requested. |
| static LifetimeConstraints ForCallableSubstitutionFull( |
| const FunctionLifetimes& callable, |
| const FunctionLifetimes& replacement_callable); |
| |
| // Imposes the constraint shorter <= longer. |
| void AddOutlivesConstraint(Lifetime shorter, Lifetime longer) { |
| outlives_constraints_.insert({shorter, longer}); |
| } |
| |
| // Returns all the lifetimes that this set of constraints implies must outlive |
| // the given lifetime l. |
| llvm::DenseSet<Lifetime> GetOutlivingLifetimes(Lifetime l) const; |
| |
| // Merges this set of constraints with the provided constraints, returning |
| // the effect of the operation. |
| clang::dataflow::LatticeJoinEffect join(const LifetimeConstraints& other); |
| |
| // Applies this set of constraints to the given FunctionLifetimes. |
| llvm::Error ApplyToFunctionLifetimes(FunctionLifetimes& function_lifetimes); |
| |
| bool operator==(const LifetimeConstraints& other) const { |
| return outlives_constraints_ == other.outlives_constraints_; |
| } |
| |
| // Accessor for debug purposes. |
| const llvm::DenseSet<std::pair<Lifetime, Lifetime>>& AllConstraints() const { |
| return outlives_constraints_; |
| } |
| |
| private: |
| // Constraints of the form p.first <= p.second |
| llvm::DenseSet<std::pair<Lifetime, Lifetime>> outlives_constraints_; |
| }; |
| |
| } // namespace lifetimes |
| } // namespace tidy |
| } // namespace clang |
| |
| #endif // CRUBIT_LIFETIME_ANALYSIS_LIFETIME_CONSTRAINTS_H_ |