@@ -10,16 +10,16 @@ use super::{get_name, get_names};
10
10
use rspirv:: dr:: { Block , Function , Instruction , Module , ModuleHeader , Operand } ;
11
11
use rspirv:: spirv:: { FunctionControl , Op , StorageClass , Word } ;
12
12
use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
13
+ use rustc_errors:: ErrorGuaranteed ;
13
14
use rustc_session:: Session ;
14
15
use std:: mem:: take;
15
16
16
17
type FunctionMap = FxHashMap < Word , Function > ;
17
18
18
19
pub fn inline ( sess : & Session , module : & mut Module ) -> super :: Result < ( ) > {
19
20
// This algorithm gets real sad if there's recursion - but, good news, SPIR-V bans recursion
20
- if module_has_recursion ( sess, module) {
21
- return Err ( rustc_errors:: ErrorReported ) ;
22
- }
21
+ deny_recursion_in_module ( sess, module) ?;
22
+
23
23
let functions = module
24
24
. functions
25
25
. iter ( )
@@ -52,7 +52,7 @@ pub fn inline(sess: &Session, module: &mut Module) -> super::Result<()> {
52
52
let names = get_names ( module) ;
53
53
for f in inlined_dont_inlines {
54
54
sess. warn ( & format ! (
55
- "Function `{}` has `dont_inline` attribute, but need to be inlined because it has illegal argument or return types" ,
55
+ "function `{}` has `dont_inline` attribute, but need to be inlined because it has illegal argument or return types" ,
56
56
get_name( & names, f)
57
57
) ) ;
58
58
}
@@ -81,7 +81,7 @@ pub fn inline(sess: &Session, module: &mut Module) -> super::Result<()> {
81
81
}
82
82
83
83
// https://stackoverflow.com/a/53995651
84
- fn module_has_recursion ( sess : & Session , module : & Module ) -> bool {
84
+ fn deny_recursion_in_module ( sess : & Session , module : & Module ) -> super :: Result < ( ) > {
85
85
let func_to_index: FxHashMap < Word , usize > = module
86
86
. functions
87
87
. iter ( )
@@ -90,7 +90,7 @@ fn module_has_recursion(sess: &Session, module: &Module) -> bool {
90
90
. collect ( ) ;
91
91
let mut discovered = vec ! [ false ; module. functions. len( ) ] ;
92
92
let mut finished = vec ! [ false ; module. functions. len( ) ] ;
93
- let mut has_recursion = false ;
93
+ let mut has_recursion = None ;
94
94
for index in 0 ..module. functions . len ( ) {
95
95
if !discovered[ index] && !finished[ index] {
96
96
visit (
@@ -111,7 +111,7 @@ fn module_has_recursion(sess: &Session, module: &Module) -> bool {
111
111
current : usize ,
112
112
discovered : & mut Vec < bool > ,
113
113
finished : & mut Vec < bool > ,
114
- has_recursion : & mut bool ,
114
+ has_recursion : & mut Option < ErrorGuaranteed > ,
115
115
func_to_index : & FxHashMap < Word , usize > ,
116
116
) {
117
117
discovered[ current] = true ;
@@ -121,11 +121,10 @@ fn module_has_recursion(sess: &Session, module: &Module) -> bool {
121
121
let names = get_names ( module) ;
122
122
let current_name = get_name ( & names, module. functions [ current] . def_id ( ) . unwrap ( ) ) ;
123
123
let next_name = get_name ( & names, module. functions [ next] . def_id ( ) . unwrap ( ) ) ;
124
- sess. err ( & format ! (
124
+ * has_recursion = Some ( sess. err ( & format ! (
125
125
"module has recursion, which is not allowed: `{}` calls `{}`" ,
126
126
current_name, next_name
127
- ) ) ;
128
- * has_recursion = true ;
127
+ ) ) ) ;
129
128
break ;
130
129
}
131
130
@@ -159,7 +158,10 @@ fn module_has_recursion(sess: &Session, module: &Module) -> bool {
159
158
} )
160
159
}
161
160
162
- has_recursion
161
+ match has_recursion {
162
+ Some ( err) => Err ( err) ,
163
+ None => Ok ( ( ) ) ,
164
+ }
163
165
}
164
166
165
167
fn compute_disallowed_argument_and_return_types (
0 commit comments