@@ -7,18 +7,15 @@ use crate::rustc_internal;
7
7
use crate :: rustc_smir:: Tables ;
8
8
use rustc_data_structures:: fx;
9
9
use rustc_data_structures:: fx:: FxIndexMap ;
10
- use rustc_driver:: { Callbacks , Compilation , RunCompiler } ;
11
- use rustc_interface:: { interface, Queries } ;
12
10
use rustc_middle:: mir:: interpret:: AllocId ;
13
11
use rustc_middle:: ty;
14
12
use rustc_middle:: ty:: TyCtxt ;
15
13
use rustc_span:: def_id:: { CrateNum , DefId } ;
16
14
use rustc_span:: Span ;
17
15
use stable_mir:: ty:: IndexedVal ;
18
- use stable_mir:: CompilerError ;
19
16
use std:: fmt:: Debug ;
20
17
use std:: hash:: Hash ;
21
- use std:: ops:: { ControlFlow , Index } ;
18
+ use std:: ops:: Index ;
22
19
23
20
impl < ' tcx > Index < stable_mir:: DefId > for Tables < ' tcx > {
24
21
type Output = DefId ;
@@ -141,63 +138,81 @@ pub fn run(tcx: TyCtxt<'_>, f: impl FnOnce()) {
141
138
) ;
142
139
}
143
140
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
+ }
153
161
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
+ }
174
187
}
175
- }
176
- }
177
188
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
+ } )
198
211
}
199
- } )
200
- }
212
+ }
213
+
214
+ StableMir :: new( $args, |$tcx| $callback) . run( )
215
+ } } ;
201
216
}
202
217
203
218
/// Simmilar to rustc's `FxIndexMap`, `IndexMap` with extra
0 commit comments