Expose function sections option (#28088)

* Expose separate function sections option to compiler

* Add function sections test
This commit is contained in:
Alex Suhan
2020-01-13 14:45:01 -08:00
committed by Saleem Abdulrasool
parent d8cc616602
commit eed6a4eb94
8 changed files with 41 additions and 1 deletions

View File

@@ -146,6 +146,9 @@ public:
/// objects. /// objects.
unsigned EmitStackPromotionChecks : 1; unsigned EmitStackPromotionChecks : 1;
/// Emit functions to separate sections.
unsigned FunctionSections : 1;
/// The maximum number of bytes used on a stack frame for stack promotion /// The maximum number of bytes used on a stack frame for stack promotion
/// (includes alloc_stack allocations). /// (includes alloc_stack allocations).
unsigned StackPromotionSizeLimit = 1024; unsigned StackPromotionSizeLimit = 1024;
@@ -253,7 +256,7 @@ public:
IntegratedREPL(false), DisableLLVMOptzns(false), IntegratedREPL(false), DisableLLVMOptzns(false),
DisableSwiftSpecificLLVMOptzns(false), DisableLLVMSLPVectorizer(false), DisableSwiftSpecificLLVMOptzns(false), DisableLLVMSLPVectorizer(false),
DisableFPElim(true), Playground(false), EmitStackPromotionChecks(false), DisableFPElim(true), Playground(false), EmitStackPromotionChecks(false),
PrintInlineTree(false), EmbedMode(IRGenEmbedMode::None), FunctionSections(false), PrintInlineTree(false), EmbedMode(IRGenEmbedMode::None),
HasValueNamesSetting(false), ValueNames(false), HasValueNamesSetting(false), ValueNames(false),
EnableReflectionMetadata(true), EnableReflectionNames(true), EnableReflectionMetadata(true), EnableReflectionNames(true),
EnableAnonymousContextMangledNames(false), ForcePublicLinkage(false), EnableAnonymousContextMangledNames(false), ForcePublicLinkage(false),

View File

@@ -334,6 +334,10 @@ def disable_reflection_names : Flag<["-"], "disable-reflection-names">,
HelpText<"Disable emission of names of stored properties and enum cases in" HelpText<"Disable emission of names of stored properties and enum cases in"
"reflection metadata">; "reflection metadata">;
def function_sections: Flag<["-"], "function-sections">,
Flags<[FrontendOption, NoInteractiveOption]>,
HelpText<"Emit functions to separate sections.">;
def stack_promotion_checks : Flag<["-"], "emit-stack-promotion-checks">, def stack_promotion_checks : Flag<["-"], "emit-stack-promotion-checks">,
HelpText<"Emit runtime checks for correct stack promotion of objects.">; HelpText<"Emit runtime checks for correct stack promotion of objects.">;

View File

@@ -1136,6 +1136,8 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
Opts.StackPromotionSizeLimit = limit; Opts.StackPromotionSizeLimit = limit;
} }
Opts.FunctionSections = Args.hasArg(OPT_function_sections);
if (Args.hasArg(OPT_autolink_force_load)) if (Args.hasArg(OPT_autolink_force_load))
Opts.ForceLoadSymbolName = Args.getLastArgValue(OPT_module_link_name); Opts.ForceLoadSymbolName = Args.getLastArgValue(OPT_module_link_name);

View File

@@ -162,6 +162,7 @@ swift::getIRTargetOptions(IRGenOptions &Opts, ASTContext &Ctx) {
// Explicitly request debugger tuning for LLDB which is the default // Explicitly request debugger tuning for LLDB which is the default
// on Darwin platforms but not on others. // on Darwin platforms but not on others.
TargetOpts.DebuggerTuning = llvm::DebuggerKind::LLDB; TargetOpts.DebuggerTuning = llvm::DebuggerKind::LLDB;
TargetOpts.FunctionSections = Opts.FunctionSections;
auto *Clang = static_cast<ClangImporter *>(Ctx.getClangModuleLoader()); auto *Clang = static_cast<ClangImporter *>(Ctx.getClangModuleLoader());
clang::TargetOptions &ClangOpts = Clang->getTargetInfo().getTargetOpts(); clang::TargetOptions &ClangOpts = Clang->getTargetInfo().getTargetOpts();

View File

@@ -0,0 +1,5 @@
public typealias Void = ()
public func func1() -> Void {}
public func func2() -> Void {}

View File

@@ -0,0 +1,3 @@
import FunctionSections
func1()

View File

@@ -0,0 +1,10 @@
// REQUIRES: OS=linux-gnu || OS=linux-androideabi || OS=linux-android || OS=freebsd
// RUN: %empty-directory(%t)
// RUN: %target-build-swift -Xfrontend -function-sections -emit-module -emit-library -static -parse-stdlib %S/Inputs/FunctionSections.swift
// RUN: %target-build-swift -Xlinker --gc-sections -Xlinker -Map=%t/../../FunctionSections.map -I%t/../.. -L%t/../.. -lFunctionSections %S/Inputs/FunctionSectionsUse.swift
// RUN: %FileCheck %s < %t/../../FunctionSections.map
// CHECK: Discarded input sections
// CHECK: .text.$s16FunctionSections5func2yyF
// CHECK: Memory map
// CHECK: .text.$s16FunctionSections5func1yyF

View File

@@ -0,0 +1,12 @@
// RUN: %empty-directory(%t)
// RUN: %target-build-swift -Xfrontend -function-sections -emit-library -emit-ir -static -parse-stdlib %S/Inputs/FunctionSections.swift | %FileCheck %s
// CHECK: define {{(dllexport |protected )?}}swiftcc void @"$s16FunctionSections5func1yyF"() #0 {
// CHECK: entry:
// CHECK: ret void
// CHECK: }
// CHECK: define {{(dllexport |protected )?}}swiftcc void @"$s16FunctionSections5func2yyF"() #0 {
// CHECK: entry:
// CHECK: ret void
// CHECK: }