@@ -11,13 +11,42 @@ fn wstr(int i) -> str {
11
11
ret istr ( i * wordsz) ;
12
12
}
13
13
14
+ fn start ( ) -> vec[ str ] {
15
+ ret vec ( ".cfi_startproc" ) ;
16
+ }
17
+
18
+ fn end ( ) -> vec[ str ] {
19
+ ret vec ( ".cfi_endproc" ) ;
20
+ }
21
+
14
22
fn save_callee_saves ( ) -> vec[ str ] {
15
23
ret vec ( "pushl %ebp" ,
16
24
"pushl %edi" ,
17
25
"pushl %esi" ,
18
26
"pushl %ebx" ) ;
19
27
}
20
28
29
+ fn save_callee_saves_with_cfi ( ) -> vec[ str ] {
30
+ auto offset = 8 ;
31
+ auto t;
32
+ t = vec ( "pushl %ebp" ) ;
33
+ t += vec ( ".cfi_def_cfa_offset " + istr ( offset) ) ;
34
+ t += vec ( ".cfi_offset 5, -" + istr ( offset) ) ;
35
+
36
+ t += vec ( "pushl %edi" ) ;
37
+ offset += 4 ;
38
+ t += vec ( ".cfi_def_cfa_offset " + istr ( offset) ) ;
39
+
40
+ t += vec ( "pushl %esi" ) ;
41
+ offset += 4 ;
42
+ t += vec ( ".cfi_def_cfa_offset " + istr ( offset) ) ;
43
+
44
+ t += vec ( "pushl %ebx" ) ;
45
+ offset += 4 ;
46
+ t += vec ( ".cfi_def_cfa_offset " + istr ( offset) ) ;
47
+ ret t;
48
+ }
49
+
21
50
fn restore_callee_saves ( ) -> vec[ str ] {
22
51
ret vec ( "popl %ebx" ,
23
52
"popl %esi" ,
@@ -211,9 +240,11 @@ fn native_glue(int n_args, bool pass_task) -> vec[str] {
211
240
auto carg = bind copy_arg ( pass_task, _) ;
212
241
213
242
ret
214
- save_callee_saves ( )
243
+ start( )
244
+ + save_callee_saves_with_cfi ( )
215
245
216
246
+ vec ( "movl %esp, %ebp # ebp = rust_sp" )
247
+ + vec ( ".cfi_def_cfa_register 5" )
217
248
218
249
+ store_esp_to_rust_sp_second_arg ( )
219
250
+ load_esp_from_runtime_sp_second_arg ( )
@@ -229,7 +260,8 @@ fn native_glue(int n_args, bool pass_task) -> vec[str] {
229
260
230
261
+ load_esp_from_rust_sp_second_arg ( )
231
262
+ restore_callee_saves ( )
232
- + vec ( "ret" ) ;
263
+ + vec ( "ret" )
264
+ + end ( ) ;
233
265
234
266
}
235
267
0 commit comments