@@ -7,18 +7,15 @@ use crate::rustc_internal;
77use crate :: rustc_smir:: Tables ;
88use rustc_data_structures:: fx;
99use rustc_data_structures:: fx:: FxIndexMap ;
10- use rustc_driver:: { Callbacks , Compilation , RunCompiler } ;
11- use rustc_interface:: { interface, Queries } ;
1210use rustc_middle:: mir:: interpret:: AllocId ;
1311use rustc_middle:: ty;
1412use rustc_middle:: ty:: TyCtxt ;
1513use rustc_span:: def_id:: { CrateNum , DefId } ;
1614use rustc_span:: Span ;
1715use stable_mir:: ty:: IndexedVal ;
18- use stable_mir:: CompilerError ;
1916use std:: fmt:: Debug ;
2017use std:: hash:: Hash ;
21- use std:: ops:: { ControlFlow , Index } ;
18+ use std:: ops:: Index ;
2219
2320impl < ' tcx > Index < stable_mir:: DefId > for Tables < ' tcx > {
2421 type Output = DefId ;
@@ -141,63 +138,81 @@ pub fn run(tcx: TyCtxt<'_>, f: impl FnOnce()) {
141138 ) ;
142139}
143140
144- pub struct StableMir < B = ( ) , C = ( ) >
145- where
146- B : Send ,
147- C : Send ,
148- {
149- args : Vec < String > ,
150- callback : fn ( TyCtxt < ' _ > ) -> ControlFlow < B , C > ,
151- result : Option < ControlFlow < B , C > > ,
152- }
141+ #[ macro_export]
142+ macro_rules! run {
143+ ( $args: expr, $callback: expr) => {
144+ run!( $args, tcx, $callback)
145+ } ;
146+ ( $args: expr, $tcx: ident, $callback: expr) => { {
147+ use rustc_driver:: { Callbacks , Compilation , RunCompiler } ;
148+ use rustc_interface:: { interface, Queries } ;
149+ use stable_mir:: CompilerError ;
150+ use std:: ops:: ControlFlow ;
151+
152+ pub struct StableMir <B = ( ) , C = ( ) >
153+ where
154+ B : Send ,
155+ C : Send ,
156+ {
157+ args: Vec <String >,
158+ callback: fn ( TyCtxt <' _>) -> ControlFlow <B , C >,
159+ result: Option <ControlFlow <B , C >>,
160+ }
153161
154- impl < B , C > StableMir < B , C >
155- where
156- B : Send ,
157- C : Send ,
158- {
159- /// Creates a new `StableMir` instance, with given test_function and arguments.
160- pub fn new ( args : Vec < String > , callback : fn ( TyCtxt < ' _ > ) -> ControlFlow < B , C > ) -> Self {
161- StableMir { args, callback, result : None }
162- }
163-
164- /// Runs the compiler against given target and tests it with `test_function`
165- pub fn run ( & mut self ) -> Result < C , CompilerError < B > > {
166- let compiler_result =
167- rustc_driver:: catch_fatal_errors ( || RunCompiler :: new ( & self . args . clone ( ) , self ) . run ( ) ) ;
168- match ( compiler_result, self . result . take ( ) ) {
169- ( Ok ( Ok ( ( ) ) ) , Some ( ControlFlow :: Continue ( value) ) ) => Ok ( value) ,
170- ( Ok ( Ok ( ( ) ) ) , Some ( ControlFlow :: Break ( value) ) ) => Err ( CompilerError :: Interrupted ( value) ) ,
171- ( Ok ( Ok ( _) ) , None ) => Err ( CompilerError :: Skipped ) ,
172- ( Ok ( Err ( _) ) , _) => Err ( CompilerError :: CompilationFailed ) ,
173- ( Err ( _) , _) => Err ( CompilerError :: ICE ) ,
162+ impl <B , C > StableMir <B , C >
163+ where
164+ B : Send ,
165+ C : Send ,
166+ {
167+ /// Creates a new `StableMir` instance, with given test_function and arguments.
168+ pub fn new( args: Vec <String >, callback: fn ( TyCtxt <' _>) -> ControlFlow <B , C >) -> Self {
169+ StableMir { args, callback, result: None }
170+ }
171+
172+ /// Runs the compiler against given target and tests it with `test_function`
173+ pub fn run( & mut self ) -> Result <C , CompilerError <B >> {
174+ let compiler_result = rustc_driver:: catch_fatal_errors( || {
175+ RunCompiler :: new( & self . args. clone( ) , self ) . run( )
176+ } ) ;
177+ match ( compiler_result, self . result. take( ) ) {
178+ ( Ok ( Ok ( ( ) ) ) , Some ( ControlFlow :: Continue ( value) ) ) => Ok ( value) ,
179+ ( Ok ( Ok ( ( ) ) ) , Some ( ControlFlow :: Break ( value) ) ) => {
180+ Err ( CompilerError :: Interrupted ( value) )
181+ }
182+ ( Ok ( Ok ( _) ) , None ) => Err ( CompilerError :: Skipped ) ,
183+ ( Ok ( Err ( _) ) , _) => Err ( CompilerError :: CompilationFailed ) ,
184+ ( Err ( _) , _) => Err ( CompilerError :: ICE ) ,
185+ }
186+ }
174187 }
175- }
176- }
177188
178- impl < B , C > Callbacks for StableMir < B , C >
179- where
180- B : Send ,
181- C : Send ,
182- {
183- /// Called after analysis. Return value instructs the compiler whether to
184- /// continue the compilation afterwards (defaults to `Compilation::Continue`)
185- fn after_analysis < ' tcx > (
186- & mut self ,
187- _compiler : & interface:: Compiler ,
188- queries : & ' tcx Queries < ' tcx > ,
189- ) -> Compilation {
190- queries. global_ctxt ( ) . unwrap ( ) . enter ( |tcx| {
191- rustc_internal:: run ( tcx, || {
192- self . result = Some ( ( self . callback ) ( tcx) ) ;
193- } ) ;
194- if self . result . as_ref ( ) . is_some_and ( |val| val. is_continue ( ) ) {
195- Compilation :: Continue
196- } else {
197- Compilation :: Stop
189+ impl <B , C > Callbacks for StableMir <B , C >
190+ where
191+ B : Send ,
192+ C : Send ,
193+ {
194+ /// Called after analysis. Return value instructs the compiler whether to
195+ /// continue the compilation afterwards (defaults to `Compilation::Continue`)
196+ fn after_analysis<' tcx>(
197+ & mut self ,
198+ _compiler: & interface:: Compiler ,
199+ queries: & ' tcx Queries <' tcx>,
200+ ) -> Compilation {
201+ queries. global_ctxt( ) . unwrap( ) . enter( |tcx| {
202+ rustc_internal:: run( tcx, || {
203+ self . result = Some ( ( self . callback) ( tcx) ) ;
204+ } ) ;
205+ if self . result. as_ref( ) . is_some_and( |val| val. is_continue( ) ) {
206+ Compilation :: Continue
207+ } else {
208+ Compilation :: Stop
209+ }
210+ } )
198211 }
199- } )
200- }
212+ }
213+
214+ StableMir :: new( $args, |$tcx| $callback) . run( )
215+ } } ;
201216}
202217
203218/// Simmilar to rustc's `FxIndexMap`, `IndexMap` with extra
0 commit comments