Skip to content

Commit c7dd41b

Browse files
authored
Merge pull request #39237 from aschwaighofer/swift_async_function_pointer_flags_5.5
[5.5] Add flag -swift-async-framepointer=auto,never,always
2 parents d64ffa9 + fa60720 commit c7dd41b

File tree

7 files changed

+92
-5
lines changed

7 files changed

+92
-5
lines changed

include/swift/AST/IRGenOptions.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ enum class IRGenEmbedMode : unsigned {
8181
EmbedBitcode
8282
};
8383

84+
enum class SwiftAsyncFramePointerKind : unsigned {
85+
Auto, // Choose Swift async extended frame info based on deployment target.
86+
Always, // Unconditionally emit Swift async extended frame info.
87+
Never, // Don't emit Swift async extended frame info.
88+
};
89+
8490
using clang::PointerAuthSchema;
8591

8692
struct PointerAuthOptions : clang::PointerAuthOptions {
@@ -282,6 +288,8 @@ class IRGenOptions {
282288

283289
IRGenLLVMLTOKind LLVMLTOKind : 2;
284290

291+
SwiftAsyncFramePointerKind SwiftAsyncFramePointer : 2;
292+
285293
/// Add names to LLVM values.
286294
unsigned HasValueNamesSetting : 1;
287295
unsigned ValueNames : 1;
@@ -390,7 +398,9 @@ class IRGenOptions {
390398
DisableLLVMSLPVectorizer(false), Playground(false),
391399
EmitStackPromotionChecks(false), FunctionSections(false),
392400
PrintInlineTree(false), EmbedMode(IRGenEmbedMode::None),
393-
LLVMLTOKind(IRGenLLVMLTOKind::None), HasValueNamesSetting(false),
401+
LLVMLTOKind(IRGenLLVMLTOKind::None),
402+
SwiftAsyncFramePointer(SwiftAsyncFramePointerKind::Always),
403+
HasValueNamesSetting(false),
394404
ValueNames(false), EnableReflectionMetadata(true),
395405
EnableReflectionNames(true), EnableAnonymousContextMangledNames(false),
396406
ForcePublicLinkage(false), LazyInitializeClassMetadata(false),

include/swift/Option/FrontendOptions.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,10 +765,15 @@ def type_info_dump_filter_EQ : Joined<["-"], "type-info-dump-filter=">,
765765
Flags<[FrontendOption]>,
766766
HelpText<"One of 'all', 'resilient' or 'fragile'">;
767767

768+
768769
def emit_ldadd_cfile_path
769770
: Separate<["-"], "emit-ldadd-cfile-path">, MetaVarName<"<path>">,
770771
HelpText<"Generate .c file defining symbols to add back">;
771772

773+
def swift_async_frame_pointer_EQ : Joined<["-"], "swift-async-frame-pointer=">,
774+
Flags<[FrontendOption]>,
775+
HelpText<"One of 'auto', 'always' or 'never'">;
776+
772777
def previous_module_installname_map_file
773778
: Separate<["-"], "previous-module-installname-map-file">, MetaVarName<"<path>">,
774779
HelpText<"Path to a Json file indicating module name to installname map for @_originallyDefinedIn">;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,6 +1768,26 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
17681768
}
17691769
}
17701770

1771+
// Default to disabling swift async extended frame info on anything but
1772+
// darwin. Other platforms are unlikely to have support for extended frame
1773+
// pointer information.
1774+
if (!Triple.isOSDarwin()) {
1775+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
1776+
}
1777+
if (const Arg *A = Args.getLastArg(OPT_swift_async_frame_pointer_EQ)) {
1778+
StringRef mode(A->getValue());
1779+
if (mode == "auto")
1780+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Auto;
1781+
else if (mode == "always")
1782+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Always;
1783+
else if (mode == "never")
1784+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
1785+
else {
1786+
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_value,
1787+
A->getAsString(Args), A->getValue());
1788+
}
1789+
}
1790+
17711791
return false;
17721792
}
17731793

lib/IRGen/IRGen.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@ swift::getIRTargetOptions(const IRGenOptions &Opts, ASTContext &Ctx) {
175175
if (Clang->getTargetInfo().getTriple().isOSBinFormatWasm())
176176
TargetOpts.ThreadModel = llvm::ThreadModel::Single;
177177

178+
switch (Opts.SwiftAsyncFramePointer) {
179+
case SwiftAsyncFramePointerKind::Never:
180+
TargetOpts.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Never;
181+
break;
182+
case SwiftAsyncFramePointerKind::Auto:
183+
TargetOpts.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::DeploymentBased;
184+
break;
185+
case SwiftAsyncFramePointerKind::Always:
186+
TargetOpts.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Always;
187+
break;
188+
}
189+
178190
clang::TargetOptions &ClangOpts = Clang->getTargetInfo().getTargetOpts();
179191
return std::make_tuple(TargetOpts, ClangOpts.CPU, ClangOpts.Features, ClangOpts.Triple);
180192
}

stdlib/public/Concurrency/CMakeLists.txt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,25 @@ if(SWIFT_HOST_VARIANT STREQUAL "android")
3838
-latomic)
3939
endif()
4040

41+
set(SWIFT_RUNTIME_CONCURRENCY_C_FLAGS)
42+
set(SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS)
43+
44+
if(NOT swift_concurrency_async_fp_mode)
45+
set(swift_concurrency_async_fp_mode "always")
46+
endif()
47+
48+
# Don't emit extended frame info on platforms other than darwin, system
49+
# backtracer and system debugger are unlikely to support it.
50+
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
51+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS
52+
"-fswift-async-fp=${swift_concurrency_async_fp_mode}")
53+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS
54+
"-Xfrontend"
55+
"-swift-async-frame-pointer=${swift_concurrency_async_fp_mode}")
56+
else()
57+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS "-fswift-async-fp=never")
58+
endif()
59+
4160
add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB
4261
../CompatibilityOverride/CompatibilityOverride.cpp
4362
Actor.cpp
@@ -99,13 +118,14 @@ add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
99118
LINK_LIBRARIES ${swift_concurrency_link_libraries}
100119

101120
C_COMPILE_FLAGS
102-
-Dswift_Concurrency_EXPORTS
121+
-Dswift_Concurrency_EXPORTS ${SWIFT_RUNTIME_CONCURRENCY_C_FLAGS}
103122
SWIFT_COMPILE_FLAGS
104123
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
105124
-parse-stdlib
106125
-Xfrontend -enable-experimental-concurrency
107126
-Xfrontend -define-availability
108127
-Xfrontend \"SwiftStdlib 5.5:macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0\"
128+
${SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS}
109129
LINK_FLAGS "${SWIFT_RUNTIME_CONCURRENCY_SWIFT_LINK_FLAGS}"
110130
INSTALL_IN_COMPONENT stdlib
111131
)

test/Concurrency/Runtime/exclusivity_custom_executors.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@
1010
// Disabled until test hang can be looked at.
1111
// UNSUPPORTED: OS=windows-msvc
1212

13-
// rdar://82973061
14-
// XFAIL: linux
15-
1613
// This test makes sure that we properly save/restore access when we
1714
// synchronously launch a task from a serial executor. The access from the task
1815
// should be merged into the already created access set while it runs and then
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// RUN: %target-swift-frontend -disable-availability-checking -target x86_64-apple-macosx11 %s -S | %FileCheck -check-prefix=ALWAYS %s
2+
// RUN: %target-swift-frontend -disable-availability-checking -target x86_64-apple-macosx12 %s -S | %FileCheck -check-prefix=ALWAYS %s
3+
// RUN: %target-swift-frontend -disable-availability-checking -swift-async-frame-pointer=auto -target x86_64-apple-macosx11 %s -S | %FileCheck -check-prefix=AUTO %s
4+
// RUN: %target-swift-frontend -disable-availability-checking -swift-async-frame-pointer=auto -target x86_64-apple-macosx12 %s -S | %FileCheck -check-prefix=ALWAYS %s
5+
// RUN: %target-swift-frontend -disable-availability-checking -swift-async-frame-pointer=never -target x86_64-apple-macosx11 %s -S | %FileCheck -check-prefix=NEVER %s
6+
// RUN: %target-swift-frontend -disable-availability-checking -swift-async-frame-pointer=never -target x86_64-apple-macosx12 %s -S | %FileCheck -check-prefix=NEVER %s
7+
// RUN: %target-swift-frontend -disable-availability-checking -swift-async-frame-pointer=always -target x86_64-apple-macosx11 %s -S | %FileCheck -check-prefix=ALWAYS %s
8+
// RUN: %target-swift-frontend -disable-availability-checking -swift-async-frame-pointer=always -target x86_64-apple-macosx12 %s -S | %FileCheck -check-prefix=ALWAYS %s
9+
10+
// REQUIRES: OS=macosx
11+
12+
public func someAsyncFunction() async {
13+
}
14+
15+
// AUTO: s31swift_async_extended_frame_info17someAsyncFunctionyyYaF:
16+
// AUTO: _swift_async_extendedFramePointerFlags
17+
18+
// ALWAYS: s31swift_async_extended_frame_info17someAsyncFunctionyyYaF:
19+
// ALWAYS: btsq $60
20+
21+
// NEVER: s31swift_async_extended_frame_info17someAsyncFunctionyyYaF:
22+
// NEVER-NOT: _swift_async_extendedFramePointerFlags
23+
// NEVER-NOT: btsq $60

0 commit comments

Comments
 (0)