Skip to content

Commit cffc1b2

Browse files
Merge pull request swiftlang#39245 from aschwaighofer/swift_async_function_pointer_flags
Add flag -swift-async-framepointer=auto,never,always to control swift extended frame information emission
2 parents 680fb6a + a93f777 commit cffc1b2

File tree

7 files changed

+93
-2
lines changed

7 files changed

+93
-2
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;
@@ -393,7 +401,9 @@ class IRGenOptions {
393401
Playground(false),
394402
EmitStackPromotionChecks(false), FunctionSections(false),
395403
PrintInlineTree(false), EmbedMode(IRGenEmbedMode::None),
396-
LLVMLTOKind(IRGenLLVMLTOKind::None), HasValueNamesSetting(false),
404+
LLVMLTOKind(IRGenLLVMLTOKind::None),
405+
SwiftAsyncFramePointer(SwiftAsyncFramePointerKind::Always),
406+
HasValueNamesSetting(false),
397407
ValueNames(false), EnableReflectionMetadata(true),
398408
EnableReflectionNames(true), EnableAnonymousContextMangledNames(false),
399409
ForcePublicLinkage(false), LazyInitializeClassMetadata(false),

include/swift/Option/FrontendOptions.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,10 @@ def type_info_dump_filter_EQ : Joined<["-"], "type-info-dump-filter=">,
806806
Flags<[FrontendOption]>,
807807
HelpText<"One of 'all', 'resilient' or 'fragile'">;
808808

809+
def swift_async_frame_pointer_EQ : Joined<["-"], "swift-async-frame-pointer=">,
810+
Flags<[FrontendOption]>,
811+
HelpText<"One of 'auto', 'always' or 'never'">;
812+
809813
def previous_module_installname_map_file
810814
: Separate<["-"], "previous-module-installname-map-file">, MetaVarName<"<path>">,
811815
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
@@ -1908,6 +1908,26 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
19081908
Opts.VirtualFunctionElimination = true;
19091909
}
19101910

1911+
// Default to disabling swift async extended frame info on anything but
1912+
// darwin. Other platforms are unlikely to have support for extended frame
1913+
// pointer information.
1914+
if (!Triple.isOSDarwin()) {
1915+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
1916+
}
1917+
if (const Arg *A = Args.getLastArg(OPT_swift_async_frame_pointer_EQ)) {
1918+
StringRef mode(A->getValue());
1919+
if (mode == "auto")
1920+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Auto;
1921+
else if (mode == "always")
1922+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Always;
1923+
else if (mode == "never")
1924+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
1925+
else {
1926+
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_value,
1927+
A->getAsString(Args), A->getValue());
1928+
}
1929+
}
1930+
19111931
return false;
19121932
}
19131933

lib/IRGen/IRGen.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,18 @@ swift::getIRTargetOptions(const IRGenOptions &Opts, ASTContext &Ctx) {
180180
TargetOpts.GlobalISelAbort = GlobalISelAbortMode::DisableWithDiag;
181181
}
182182

183+
switch (Opts.SwiftAsyncFramePointer) {
184+
case SwiftAsyncFramePointerKind::Never:
185+
TargetOpts.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Never;
186+
break;
187+
case SwiftAsyncFramePointerKind::Auto:
188+
TargetOpts.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::DeploymentBased;
189+
break;
190+
case SwiftAsyncFramePointerKind::Always:
191+
TargetOpts.SwiftAsyncFramePointer = SwiftAsyncFramePointerMode::Always;
192+
break;
193+
}
194+
183195
clang::TargetOptions &ClangOpts = Clang->getTargetInfo().getTargetOpts();
184196
return std::make_tuple(TargetOpts, ClangOpts.CPU, ClangOpts.Features, ClangOpts.Triple);
185197
}

stdlib/public/BackDeployConcurrency/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@ set(swift_concurrency_options
4646
set(swift_concurrency_extra_sources
4747
"../BackDeployConcurrency/Exclusivity.cpp"
4848
"../BackDeployConcurrency/Metadata.cpp")
49+
set(swift_concurrency_async_fp_mode "never")
4950

5051
add_subdirectory(../Concurrency stdlib/public/BackDeployConcurrency)

stdlib/public/Concurrency/CMakeLists.txt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,26 @@ if(SWIFT_CONCURRENCY_USES_DISPATCH)
3131
endif()
3232
endif()
3333

34+
35+
set(SWIFT_RUNTIME_CONCURRENCY_C_FLAGS)
36+
set(SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS)
37+
38+
if(NOT swift_concurrency_async_fp_mode)
39+
set(swift_concurrency_async_fp_mode "always")
40+
endif()
41+
42+
# Don't emit extended frame info on platforms other than darwin, system
43+
# backtracer and system debugger are unlikely to support it.
44+
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
45+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS
46+
"-fswift-async-fp=${swift_concurrency_async_fp_mode}")
47+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS
48+
"-Xfrontend"
49+
"-swift-async-frame-pointer=${swift_concurrency_async_fp_mode}")
50+
else()
51+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS "-fswift-async-fp=never")
52+
endif()
53+
3454
add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB
3555
../CompatibilityOverride/CompatibilityOverride.cpp
3656
Actor.cpp
@@ -91,13 +111,14 @@ add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
91111
LINK_LIBRARIES ${swift_concurrency_link_libraries}
92112

93113
C_COMPILE_FLAGS
94-
-Dswift_Concurrency_EXPORTS
114+
-Dswift_Concurrency_EXPORTS ${SWIFT_RUNTIME_CONCURRENCY_C_FLAGS}
95115
SWIFT_COMPILE_FLAGS
96116
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
97117
-parse-stdlib
98118
-Xfrontend -enable-experimental-concurrency
99119
-Xfrontend -define-availability
100120
-Xfrontend "SwiftStdlib 5.5:macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0"
121+
${SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS}
101122
LINK_FLAGS "${SWIFT_RUNTIME_CONCURRENCY_SWIFT_LINK_FLAGS}"
102123
${swift_concurrency_options}
103124
INSTALL_IN_COMPONENT ${swift_concurrency_install_component}
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)