@@ -27,15 +27,24 @@ check_stack_alignment() __attribute__ ((aligned (16)));
27
27
static void check_stack_alignment () { }
28
28
#endif
29
29
30
- #define SWITCH_STACK (A, F ) upcall_call_shim_on_c_stack((void *)A, (void *)F)
30
+ #define UPCALL_SWITCH_STACK (A, F ) call_upcall_on_c_stack((void *)A, (void *)F)
31
+
32
+ inline void
33
+ call_upcall_on_c_stack (void *args, void *fn_ptr) {
34
+ check_stack_alignment ();
35
+ rust_task *task = rust_scheduler::get_task ();
36
+ rust_scheduler *sched = task->sched ;
37
+ sched->c_context .call_shim_on_c_stack (args, fn_ptr);
38
+ }
31
39
32
40
extern " C" void record_sp (void *limit);
33
41
34
42
/* *********************************************************************
35
43
* Switches to the C-stack and invokes |fn_ptr|, passing |args| as argument.
36
44
* This is used by the C compiler to call native functions and by other
37
45
* upcalls to switch to the C stack. The return value is passed through a
38
- * field in the args parameter.
46
+ * field in the args parameter. This upcall is specifically for switching
47
+ * to the shim functions generated by rustc.
39
48
*/
40
49
extern " C" CDECL void
41
50
upcall_call_shim_on_c_stack (void *args, void *fn_ptr) {
@@ -51,10 +60,9 @@ upcall_call_shim_on_c_stack(void *args, void *fn_ptr) {
51
60
try {
52
61
sched->c_context .call_shim_on_c_stack (args, fn_ptr);
53
62
} catch (...) {
54
- task = rust_scheduler::get_task ();
55
- task->record_stack_limit ();
56
- throw ;
63
+ A (sched, false , " Native code threw an exception" );
57
64
}
65
+
58
66
task = rust_scheduler::get_task ();
59
67
task->record_stack_limit ();
60
68
}
@@ -80,8 +88,12 @@ extern "C" CDECL void
80
88
upcall_fail (char const *expr,
81
89
char const *file,
82
90
size_t line) {
83
- s_fail_args args = {expr,file,line};
84
- SWITCH_STACK (&args, upcall_s_fail);
91
+ try {
92
+ s_fail_args args = {expr,file,line};
93
+ UPCALL_SWITCH_STACK (&args, upcall_s_fail);
94
+ } catch (rust_task*) {
95
+ throw ;
96
+ }
85
97
}
86
98
87
99
/* *********************************************************************
@@ -124,7 +136,7 @@ upcall_s_malloc(s_malloc_args *args) {
124
136
extern " C" CDECL uintptr_t
125
137
upcall_malloc (size_t nbytes, type_desc *td) {
126
138
s_malloc_args args = {0 , nbytes, td};
127
- SWITCH_STACK (&args, upcall_s_malloc);
139
+ UPCALL_SWITCH_STACK (&args, upcall_s_malloc);
128
140
return args.retval ;
129
141
}
130
142
@@ -156,7 +168,7 @@ upcall_s_free(s_free_args *args) {
156
168
extern " C" CDECL void
157
169
upcall_free (void * ptr, uintptr_t is_gc) {
158
170
s_free_args args = {ptr, is_gc};
159
- SWITCH_STACK (&args, upcall_s_free);
171
+ UPCALL_SWITCH_STACK (&args, upcall_s_free);
160
172
}
161
173
162
174
/* *********************************************************************
@@ -189,7 +201,7 @@ upcall_s_shared_malloc(s_shared_malloc_args *args) {
189
201
extern " C" CDECL uintptr_t
190
202
upcall_shared_malloc (size_t nbytes, type_desc *td) {
191
203
s_shared_malloc_args args = {0 , nbytes, td};
192
- SWITCH_STACK (&args, upcall_s_shared_malloc);
204
+ UPCALL_SWITCH_STACK (&args, upcall_s_shared_malloc);
193
205
return args.retval ;
194
206
}
195
207
@@ -216,7 +228,7 @@ upcall_s_shared_free(s_shared_free_args *args) {
216
228
extern " C" CDECL void
217
229
upcall_shared_free (void * ptr) {
218
230
s_shared_free_args args = {ptr};
219
- SWITCH_STACK (&args, upcall_s_shared_free);
231
+ UPCALL_SWITCH_STACK (&args, upcall_s_shared_free);
220
232
}
221
233
222
234
/* *********************************************************************
@@ -262,7 +274,7 @@ void upcall_s_create_shared_type_desc(s_create_shared_type_desc_args *args)
262
274
extern " C" CDECL type_desc *
263
275
upcall_create_shared_type_desc (type_desc *td) {
264
276
s_create_shared_type_desc_args args = { td, 0 };
265
- SWITCH_STACK (&args, upcall_s_create_shared_type_desc);
277
+ UPCALL_SWITCH_STACK (&args, upcall_s_create_shared_type_desc);
266
278
return args.res ;
267
279
}
268
280
@@ -285,7 +297,7 @@ void upcall_s_free_shared_type_desc(type_desc *td)
285
297
286
298
extern " C" CDECL void
287
299
upcall_free_shared_type_desc (type_desc *td) {
288
- SWITCH_STACK (td, upcall_s_free_shared_type_desc);
300
+ UPCALL_SWITCH_STACK (td, upcall_s_free_shared_type_desc);
289
301
}
290
302
291
303
/* *********************************************************************
@@ -325,7 +337,7 @@ upcall_get_type_desc(void *curr_crate, // ignored, legacy compat.
325
337
type_desc const **descs,
326
338
uintptr_t n_obj_params) {
327
339
s_get_type_desc_args args = {0 ,size,align,n_descs,descs,n_obj_params};
328
- SWITCH_STACK (&args, upcall_s_get_type_desc);
340
+ UPCALL_SWITCH_STACK (&args, upcall_s_get_type_desc);
329
341
return args.retval ;
330
342
}
331
343
@@ -347,7 +359,7 @@ upcall_s_vec_grow(s_vec_grow_args *args) {
347
359
extern " C" CDECL void
348
360
upcall_vec_grow (rust_vec** vp, size_t new_sz) {
349
361
s_vec_grow_args args = {vp, new_sz};
350
- SWITCH_STACK (&args, upcall_s_vec_grow);
362
+ UPCALL_SWITCH_STACK (&args, upcall_s_vec_grow);
351
363
}
352
364
353
365
// Copy elements from one vector to another,
@@ -414,7 +426,7 @@ upcall_s_dynastack_mark(s_dynastack_mark_args *args) {
414
426
extern " C" CDECL void *
415
427
upcall_dynastack_mark () {
416
428
s_dynastack_mark_args args = {0 };
417
- SWITCH_STACK (&args, upcall_s_dynastack_mark);
429
+ UPCALL_SWITCH_STACK (&args, upcall_s_dynastack_mark);
418
430
return args.retval ;
419
431
}
420
432
@@ -439,7 +451,7 @@ upcall_s_dynastack_alloc(s_dynastack_alloc_args *args) {
439
451
extern " C" CDECL void *
440
452
upcall_dynastack_alloc (size_t sz) {
441
453
s_dynastack_alloc_args args = {0 , sz};
442
- SWITCH_STACK (&args, upcall_s_dynastack_alloc);
454
+ UPCALL_SWITCH_STACK (&args, upcall_s_dynastack_alloc);
443
455
return args.retval ;
444
456
}
445
457
@@ -465,7 +477,7 @@ upcall_s_dynastack_alloc_2(s_dynastack_alloc_2_args *args) {
465
477
extern " C" CDECL void *
466
478
upcall_dynastack_alloc_2 (size_t sz, type_desc *ty) {
467
479
s_dynastack_alloc_2_args args = {0 , sz, ty};
468
- SWITCH_STACK (&args, upcall_s_dynastack_alloc_2);
480
+ UPCALL_SWITCH_STACK (&args, upcall_s_dynastack_alloc_2);
469
481
return args.retval ;
470
482
}
471
483
@@ -482,7 +494,7 @@ upcall_s_dynastack_free(s_dynastack_free_args *args) {
482
494
extern " C" CDECL void
483
495
upcall_dynastack_free (void *ptr) {
484
496
s_dynastack_free_args args = {ptr};
485
- SWITCH_STACK (&args, upcall_s_dynastack_free);
497
+ UPCALL_SWITCH_STACK (&args, upcall_s_dynastack_free);
486
498
}
487
499
488
500
extern " C" _Unwind_Reason_Code
@@ -524,7 +536,7 @@ upcall_rust_personality(int version,
524
536
s_rust_personality_args args = {(_Unwind_Reason_Code)0 ,
525
537
version, actions, exception_class,
526
538
ue_header, context};
527
- SWITCH_STACK (&args, upcall_s_rust_personality);
539
+ UPCALL_SWITCH_STACK (&args, upcall_s_rust_personality);
528
540
return args.retval ;
529
541
}
530
542
@@ -553,7 +565,7 @@ upcall_cmp_type(int8_t *result, const type_desc *tydesc,
553
565
const type_desc **subtydescs, uint8_t *data_0,
554
566
uint8_t *data_1, uint8_t cmp_type) {
555
567
s_cmp_type_args args = {result, tydesc, subtydescs, data_0, data_1, cmp_type};
556
- SWITCH_STACK (&args, upcall_s_cmp_type);
568
+ UPCALL_SWITCH_STACK (&args, upcall_s_cmp_type);
557
569
}
558
570
559
571
extern " C" void
@@ -573,7 +585,7 @@ upcall_s_log_type(s_log_type_args *args) {
573
585
extern " C" void
574
586
upcall_log_type (const type_desc *tydesc, uint8_t *data, uint32_t level) {
575
587
s_log_type_args args = {tydesc, data, level};
576
- SWITCH_STACK (&args, upcall_s_log_type);
588
+ UPCALL_SWITCH_STACK (&args, upcall_s_log_type);
577
589
}
578
590
579
591
struct rust_new_stack2_args {
0 commit comments