@@ -682,6 +682,22 @@ AsyncTaskAndContext swift::swift_task_create(
682
682
initialContextSize);
683
683
}
684
684
685
+ #ifdef __ARM_ARCH_7K__
686
+ __attribute__ ((noinline))
687
+ SWIFT_CC(swiftasync) static void workaround_function_swift_task_future_waitImpl(
688
+ OpaqueValue *result, SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
689
+ AsyncTask *task, TaskContinuationFunction resumeFunction,
690
+ AsyncContext *callContext) {
691
+ // Make sure we don't eliminate calls to this function.
692
+ asm volatile (" " // Do nothing.
693
+ : // Output list, empty.
694
+ : " r" (result), " r" (callerContext), " r" (task) // Input list.
695
+ : // Clobber list, empty.
696
+ );
697
+ return ;
698
+ }
699
+ #endif
700
+
685
701
SWIFT_CC (swiftasync)
686
702
static void swift_task_future_waitImpl(
687
703
OpaqueValue *result,
@@ -701,7 +717,12 @@ static void swift_task_future_waitImpl(
701
717
result)) {
702
718
case FutureFragment::Status::Executing:
703
719
// The waiting task has been queued on the future.
720
+ #ifdef __ARM_ARCH_7K__
721
+ return workaround_function_swift_task_future_waitImpl (
722
+ result, callerContext, task, resumeFn, callContext);
723
+ #else
704
724
return ;
725
+ #endif
705
726
706
727
case FutureFragment::Status::Success: {
707
728
// Run the task with a successful result.
@@ -716,6 +737,22 @@ static void swift_task_future_waitImpl(
716
737
}
717
738
}
718
739
740
+ #ifdef __ARM_ARCH_7K__
741
+ __attribute__ ((noinline))
742
+ SWIFT_CC(swiftasync) static void workaround_function_swift_task_future_wait_throwingImpl(
743
+ OpaqueValue *result, SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
744
+ AsyncTask *task, ThrowingTaskFutureWaitContinuationFunction resumeFunction,
745
+ AsyncContext *callContext) {
746
+ // Make sure we don't eliminate calls to this function.
747
+ asm volatile (" " // Do nothing.
748
+ : // Output list, empty.
749
+ : " r" (result), " r" (callerContext), " r" (task) // Input list.
750
+ : // Clobber list, empty.
751
+ );
752
+ return ;
753
+ }
754
+ #endif
755
+
719
756
SWIFT_CC (swiftasync)
720
757
void swift_task_future_wait_throwingImpl(
721
758
OpaqueValue *result, SWIFT_ASYNC_CONTEXT AsyncContext *callerContext,
@@ -736,7 +773,12 @@ void swift_task_future_wait_throwingImpl(
736
773
result)) {
737
774
case FutureFragment::Status::Executing:
738
775
// The waiting task has been queued on the future.
776
+ #ifdef __ARM_ARCH_7K__
777
+ return workaround_function_swift_task_future_wait_throwingImpl (
778
+ result, callerContext, task, resumeFunction, callContext);
779
+ #else
739
780
return ;
781
+ #endif
740
782
741
783
case FutureFragment::Status::Success: {
742
784
auto future = task->futureFragment ();
0 commit comments