# Stable-MIR Meetings
## 2022-05-24: development
### Goals
* aligned on problem that we solving (15min)
* aligned on development plan
### Problem we are solving
* draft/skeletal charter: https://hackmd.io/DE2nBWNeRreyGfhPFoIG6w
* potentially distinct phases
* pre- and post-drop elaboration.
* instead of having pre and post drop-elab MIR, have a single MIR that represents both, by injecting boolean flags (so drop elaboration becomes just something that figures out constant booleans where there were runtime booleans before).
* user stories are good. Could add more
* there is tension between desire for low-level information about implementation details versus high-level information about the big-picture relationships in the program itself.
* should figure out what parts of each of those we want in an MVP (minimum viable product)
* which tool(s) should be part of the initial users for MVP
* MIRI is one choice
* it would be good to have at least one high-level alternative tool
* prusti? creusot?
* prusti need to run post elaborated-drops, but also needs borrow-checking (one obvious answer would be to adopt the `drop-if` operations suggested by niko)
* creusot doesn't need drop-elaboration or borrow-checker information; just need to know that the borrow-checker has run.
* but it does need all the type-substitutions and DefId's in the MIR
* so SMIR would need to be very transparent in its wrapping around MIR to acquire the secondary information that creusot needs.
* this is a worry to Xavier: To get the benefits of SMIR, need to isolate the compiler APIs, but hard to get there without re-implementing the entire compiler
* starting transparent is an approach; we'll talk about that more as part of dev-plan discussion.
* two initial customers, one high-level and one low-level
* MIRI operates on a very late MIR with most everything it needs encoded in the MIR itself.
* Kani is similar; e.g. has to replicate transmute's behavior.
* creusot and prusti both need a significant amount of the compiler API
# Dev Plan Discussion
* start transparent, slow migration to increasing opaque is fast path to iteration.
* Xavier made [sketch tool-lib](https://github.com/xldenis/tool-lib/blob/b39e76a452b4bac9aaee9d0f4736581b1a56e97b/src/lib.rs)
* this served for creusot
* but note two things:
1. uses of `::*`
2. comments of form "// TODO: Remove", which represent modules that still need specific lists of items elaborated.
* would be good to do same exercise for MIRI.
* Session: used by creusot to report error messages
* but used by other tools, e.g. Kani, for backend stuff
* HIR (?): used by creusot because that's where DefId's are defined
* and the HirMap is used to do some lookups
* HirVisitor used to check for certain patterns to improve creusot's error diagnostics.
* Prusti uses HIR visitor to collect specification closures.
* attributes are used by many tools
* rustc offers various utilities, and it would be *nice* to factor them out into things that are shareable, but we need to take care not to distract ourselves from main goal
* Ghost MIR initiative
* would be nice to embed loop invariants/contracts into the MIR, so that tools can see these user-injected things
* general pattern we expect: take something like rustc_middle::ty, and migrate it to point at chalk-ty instead.
* repeat that across other large dependencies within the compiler
* but note that until the opaque layer actually provides *everything* that tools need, tools will need to fall back on DefId's and lookups against the original compiler internals
* metadata
* (felix missed this)
* whatever was said, Oli ended with "that's a no brainer, just open an MCP with compiler-team"
* (de)coupling
* make a new driver? Run the compiler as a service?
* celina: thinking that we can serialize the data, either to the file or to a socket
* xavier: until there's a fully opaque barrier, not much advantage of running two separate processes
* TyContext exposes every single query
* xavier: imagined a blessed library distributed through rustup that exposes a selected set of curated APIs
* xavier: running on stable is not our near-term objective (Vytautas agrees)
* architecture:
* (Celina) a server sits in between server, ingests MIR and exposes SMIR to users
* (Xavier) how to handle secondary apis?
* (Vytautas): Prusti dream: RustAnalyzer/Salsa style architecture. (Xavier agrees)
* Miri migration:
* All work would happen in the compiler by migrating MIR interpreter to depend on SMIR.
* Expose a stand-alone `const-eval` crate which doesn't depend on `tcx`
*
* needs:
* trait resolution
* MIRI needs access to all MIR, including all dependencies