Skip to content

Commit f3d5ad5

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 9c5b3a1 commit f3d5ad5

File tree

6 files changed

+89
-2
lines changed

6 files changed

+89
-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;
@@ -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::Auto),
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: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,6 +1768,24 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
17681768
}
17691769
}
17701770

1771+
// Default to disabling swift async extended frame info on linux.
1772+
if (Triple.getOS() == llvm::Triple::Linux) {
1773+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
1774+
}
1775+
if (const Arg *A = Args.getLastArg(OPT_swift_async_frame_pointer_EQ)) {
1776+
StringRef mode(A->getValue());
1777+
if (mode == "auto")
1778+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Auto;
1779+
else if (mode == "always")
1780+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Always;
1781+
else if (mode == "never")
1782+
Opts.SwiftAsyncFramePointer = SwiftAsyncFramePointerKind::Never;
1783+
else {
1784+
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_value,
1785+
A->getAsString(Args), A->getValue());
1786+
}
1787+
}
1788+
17711789
return false;
17721790
}
17731791

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: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,24 @@ 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 linux, system backtracer and system debugger
49+
# are unlikely to support it.
50+
if(CMAKE_SYSTEM_NAME STREQUAL Linux)
51+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS "-fswift-async-fp=never")
52+
elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
53+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS "-fswift-async-fp=${swift_concurrency_async_fp_mode}")
54+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS
55+
"-Xfrontend"
56+
"-swift-async-frame-pointer=${swift_concurrency_async_fp_mode}")
57+
endif()
58+
4159
add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB
4260
../CompatibilityOverride/CompatibilityOverride.cpp
4361
Actor.cpp
@@ -99,13 +117,14 @@ add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
99117
LINK_LIBRARIES ${swift_concurrency_link_libraries}
100118

101119
C_COMPILE_FLAGS
102-
-Dswift_Concurrency_EXPORTS
120+
-Dswift_Concurrency_EXPORTS ${SWIFT_RUNTIME_CONCURRENCY_C_FLAGS}
103121
SWIFT_COMPILE_FLAGS
104122
${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
105123
-parse-stdlib
106124
-Xfrontend -enable-experimental-concurrency
107125
-Xfrontend -define-availability
108126
-Xfrontend \"SwiftStdlib 5.5:macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0\"
127+
${SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS}
109128
LINK_FLAGS "${SWIFT_RUNTIME_CONCURRENCY_SWIFT_LINK_FLAGS}"
110129
INSTALL_IN_COMPONENT stdlib
111130
)
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)