|
| | Analysis (World &world, std::string name) |
| | Analysis (World &world, flags_t annex) |
| | Analysis (World &world, std::string name) |
| | Analysis (World &world, flags_t annex) |
| virtual void | reset () |
| | Clears the rewriter map and resets Phase::todo() for the next fixed-point iteration.
|
| void | make_dense () |
| | Forces whole-World rounds unconditionally.
|
| size_t | version () const |
| | Bumped on every observable lattice change; snapshot it around a code region to detect changes.
|
| World & | world () |
| const auto & | lattice () const |
| | The whole map; used e.g. to diff two fixed-point runs.
|
| const Def * | lattice (const Def *def) const |
| const Def * | repr (const Def *def) const |
| | The representative of def: follows def ↦ lattice(def) to the end of its chain.
|
| bool | is_top (const Def *def) const |
| | Phase (World &world, std::string name) |
| | Phase (World &world, flags_t annex) |
| virtual | ~Phase ()=default |
| virtual std::unique_ptr< Phase > | recreate () |
| | Creates a new instance; needed by a fixed-point PhaseMan.
|
| virtual void | apply (const App *) |
| | Invoked if your Phase has additional args.
|
| virtual void | apply (Phase &) |
| | Dito, but invoked by Phase::recreate.
|
| virtual bool | redirects () const |
| | If true, Phase::create uses take_resolved().
|
| virtual std::unique_ptr< Phase > | take_resolved () |
| | The Phase to use instead; nullptr means elide.
|
| World & | world () |
| Driver & | driver () |
| const fe::Log & | log () const |
| std::string_view | name () const |
| flags_t | annex () const |
| const fe::Vector< std::string > & | args () |
| | Command-line arguments passed to this Phase's plugin via -X <plugin>:<arg>.
|
| bool | todo () const |
| void | invalidate (bool todo=true) |
| | Signals that another round of fixed-point iteration is required, either as part of.
|
| virtual void | run () |
| | Entry point and generates some debug output; invokes Phase::start.
|
| void | profile_count (std::string_view key, uint64_t n=1) |
| | Adds n to the custom fe::Profiler counter key of the current run; no-op unless profiling is enabled.
|
| template<class D = Def> |
| D * | curr_mut () const |
| | Rewriter (World &world) |
| virtual | ~Rewriter () |
| void | reset () |
| World & | world () |
| void | push (Vars old_vars={}, Vars new_vars={}) |
| void | pop () |
| void | bind_old (const Var *var) |
| | Adds the old var - if any - to the innermost scope.
|
| void | bind_new (const Var *var) |
| | Adds the new var - if any - to the innermost scope.
|
| void | bind (const Var *old_var, const Var *new_var) |
| const Def * | map (const Def *old_def, const Def *new_def) |
| const Def * | map (const Def *old_def, Defs new_defs) |
| const Def * | map (Defs old_defs, const Def *new_def) |
| const Def * | map (Defs old_defs, Defs new_defs) |
| virtual const Def * | rewrite_imm (const Def *) |
| virtual const Def * | rewrite_stub (Def *, Def *) |
| const Def * | rewrite_stub (Def *old_mut, Def *new_mut, fe::View< size_t > new2old) |
| | Like above, but new_mut may have a different number of ops than old_mut: new_mut->op(i) is rewritten from old_mut->op(new2old[i]).
|
| virtual DefVec | rewrite (Defs) |
| virtual const Def * | rewrite_imm_Lit (const Lit *) |
| virtual const Def * | rewrite_imm_Axm (const Axm *) |
| virtual const Def * | rewrite_imm_Var (const Var *) |
| virtual const Def * | rewrite_imm_Type (const Type *) |
| virtual const Def * | rewrite_imm_Level (const Level *) |
| virtual const Def * | rewrite_imm_LMax (const LMax *) |
| virtual const Def * | rewrite_imm_LSucc (const LSucc *) |
| virtual const Def * | rewrite_imm_Pi (const Pi *) |
| virtual const Def * | rewrite_imm_Lam (const Lam *) |
| virtual const Def * | rewrite_imm_Sigma (const Sigma *) |
| virtual const Def * | rewrite_imm_Tuple (const Tuple *) |
| virtual const Def * | rewrite_imm_Extract (const Extract *) |
| virtual const Def * | rewrite_imm_Insert (const Insert *) |
| virtual const Def * | rewrite_imm_Arr (const Arr *) |
| virtual const Def * | rewrite_imm_Pack (const Pack *) |
| virtual const Def * | rewrite_imm_Join (const Join *) |
| virtual const Def * | rewrite_imm_Inj (const Inj *) |
| virtual const Def * | rewrite_imm_Match (const Match *) |
| virtual const Def * | rewrite_imm_Variant (const Variant *) |
| virtual const Def * | rewrite_imm_Top (const Top *) |
| virtual const Def * | rewrite_imm_Bot (const Bot *) |
| virtual const Def * | rewrite_imm_Reform (const Reform *) |
| virtual const Def * | rewrite_imm_Rule (const Rule *) |
| virtual const Def * | rewrite_imm_Single (const Single *) |
| virtual const Def * | rewrite_imm_Wrap (const Wrap *) |
| virtual const Def * | rewrite_imm_Nat (const Nat *) |
| virtual const Def * | rewrite_imm_Idx (const Idx *) |
| virtual const Def * | rewrite_imm_Nom (const Nom *) |
| virtual const Def * | rewrite_imm_Name (const Name *) |
| virtual const Def * | rewrite_imm_Struc (const Struc *) |
| virtual const Def * | rewrite_imm_Seq (const Seq *seq) |
| virtual const Def * | rewrite_mut_Seq (Seq *seq) |
|
| static std::unique_ptr< Phase > | create (const Flags2Phases &phases, const Def *def) |
| template<class A, class P> |
| static void | hook (Flags2Phases &phases) |
| template<class P, class... Args> |
| static void | run (Args &&... args) |
| | Runs a single Phase.
|
| void | start () override |
| | Actual entry.
|
| virtual void | prepare () |
| | Run before the main analysis.
|
| virtual void | finalize () |
| | Run after the main analysis - only in full rounds, so it always sees the complete abstract World.
|
| const Def * | lookup (const Def *) override |
| | Lookup old_def by searching in reverse through the stack of maps.
|
| const Def * | rewrite_imm_Proxy (const Proxy *proxy) override |
| | By default: ignore Proxys.
|
| const Def * | rewrite (const Def *) override |
| | Rewrites def and then maps the result to its repr().
|
| const Def * | rewrite_mut (Def *) final |
| | Schedules mut for a breadth-first visit of its dependencies and records mut -> mut.
|
| const Def * | rewrite_mut_Hole (Hole *mut) override |
| const Def * | rewrite_mut_Pi (Pi *mut) override |
| const Def * | rewrite_mut_Lam (Lam *mut) override |
| const Def * | rewrite_mut_Sigma (Sigma *mut) override |
| const Def * | rewrite_mut_Arr (Arr *mut) override |
| const Def * | rewrite_mut_Pack (Pack *mut) override |
| const Def * | rewrite_mut_Variant (Variant *mut) override |
| const Def * | rewrite_mut_Rule (Rule *mut) override |
| virtual void | leave () |
| | Called after curr_mut() has been completely dealt with.
|
| bool | lattice_force (const Def *concr, const Def *abstr) |
| | Non-monotone write of concr ↦ abstr into lattice() and map().
|
| bool | lattice_erase (const Def *concr) |
| | Non-monotone removal of concr from lattice(), so no later sparse round replays it.
|
| bool | lattice (const Def *concr, const Def *abstr) |
| | Writes concr ↦ abstr into lattice() and map().
|
| bool | pin (const Def *def) |
| | Monotonically forces def to ⊤ (keep as is).
|
| void | pin_imm (DefSet &visited, const Def *def, DefPred auto pinnable) |
| | pins every def in def's immutable subgraph for which pinnable holds.
|
| void | pin_imm (const Def *def, DefPred auto pinnable) |
| void | taint (Def *mut) |
| | Additionally schedules mut for the next sparse round.
|
| void | touch () |
| | Observable analysis information changed: records curr_mut() as dirty - the seed set of the next sparse round - and invalidate()s.
|
| Def2Def & | old2new () |
| | The map of the innermost push() scope.
|
| bool | has_intersection (const Def *old_def) |
| | Does old_def depend on the old Vars of any scope?
|
| auto | enter (Def *new_mut) |
| | Updates curr_mut() to new_mut and restores it at the end of the scope.
|
| const Def * | seal (Def *old_mut, Def *new_mut) |
| | The tail of rewrite_stub: immutabilizes new_mut in hindsight, as rewriting may have made it vacuous.
|
| static bool | is_singleton (const Def *def) |
| | The sole inhabitant of a singleton type is ⊤ and shared by all binders of that type, so it is never recorded.
|
| std::string | name_ |
| fe::Vector< Scope > | scopes_ |
Definition at line 9 of file mem_checks.h.