Skip to content

Commit 2381233

Browse files
committed
Add flag -swift-async-framepointer=auto,never,always to
control swift extended frame information emission On linux we default to disable the extended frame info (since the system libraries don't support it). On darwin the default is to automatically choose based on the deployment target. The Concurrency library explicitly forces extended frame information and the back deployment library explicitly disables it.
1 parent e1e3824 commit 2381233

File tree

7 files changed

+90
-2
lines changed

7 files changed

+90
-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::Auto),
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: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,6 +1908,24 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
19081908
Opts.VirtualFunctionElimination = true;
19091909
}
19101910

1911+
// Default to disabling swift async extended frame info on linux.
1912+
if (Triple.getOS() == llvm::Triple::Linux) {
1913+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
1914+
}
1915+
if (const Arg *A = Args.getLastArg(OPT_swift_async_frame_pointer_EQ)) {
1916+
StringRef mode(A->getValue());
1917+
if (mode == "auto")
1918+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Auto;
1919+
else if (mode == "always")
1920+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Always;
1921+
else if (mode == "never")
1922+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
1923+
else {
1924+
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_value,
1925+
A->getAsString(Args), A->getValue());
1926+
}
1927+
}
1928+
19111929
return false;
19121930
}
19131931

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: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,25 @@ 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 linux, system backtracer and system debugger
43+
# are unlikely to support it.
44+
if(CMAKE_SYSTEM_NAME STREQUAL Linux)
45+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS "-fswift-async-fp=never")
46+
elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
47+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS "-fswift-async-fp=${swift_concurrency_async_fp_mode}")
48+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS
49+
"-Xfrontend"
50+
"-swift-async-frame-pointer=${swift_concurrency_async_fp_mode}")
51+
endif()
52+
3453
add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB
3554
../CompatibilityOverride/CompatibilityOverride.cpp
3655
Actor.cpp
@@ -91,13 +110,14 @@ add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
91110
LINK_LIBRARIES ${swift_concurrency_link_libraries}
92111

93112
C_COMPILE_FLAGS
94-
-Dswift_Concurrency_EXPORTS
113+
-Dswift_Concurrency_EXPORTS ${SWIFT_RUNTIME_CONCURRENCY_C_FLAGS}
95114
SWIFT_COMPILE_FLAGS
96115
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
97116
-parse-stdlib
98117
-Xfrontend -enable-experimental-concurrency
99118
-Xfrontend -define-availability
100119
-Xfrontend "SwiftStdlib 5.5:macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0"
120+
${SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS}
101121
LINK_FLAGS "${SWIFT_RUNTIME_CONCURRENCY_SWIFT_LINK_FLAGS}"
102122
${swift_concurrency_options}
103123
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=AUTO %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)