From: Teresa Johnson Date: Thu, 13 Oct 2016 18:05:53 +0000 (+0000) Subject: Pass -ffunction-sections/-fdata-sections along to gold-plugin X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9c9d4a4909de34b02fc881e76742301db8487f0b;p=clang Pass -ffunction-sections/-fdata-sections along to gold-plugin Summary: These options need to be passed to the plugin in order to have an effect on LTO/ThinLTO compiles. Reviewers: mehdi_amini, pcc Subscribers: jfb, dschuff, mehdi_amini, cfe-commits Differential Revision: https://reviews.llvm.org/D24644 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284140 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index eb27cb486b..b7a323faa5 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2002,6 +2002,14 @@ static unsigned getLTOParallelism(const ArgList &Args, const Driver &D) { return Parallelism; } +// CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by +// default. +static bool isUseSeparateSections(const llvm::Triple &Triple) { + return Triple.getOS() == llvm::Triple::CloudABI || + Triple.getArch() == llvm::Triple::wasm32 || + Triple.getArch() == llvm::Triple::wasm64; +} + static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args, ArgStringList &CmdArgs, bool IsThinLTO, const Driver &D) { @@ -2051,6 +2059,19 @@ static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args, else CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb"); } + + bool UseSeparateSections = + isUseSeparateSections(ToolChain.getEffectiveTriple()); + + if (Args.hasFlag(options::OPT_ffunction_sections, + options::OPT_fno_function_sections, UseSeparateSections)) { + CmdArgs.push_back("-plugin-opt=-function-sections"); + } + + if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections, + UseSeparateSections)) { + CmdArgs.push_back("-plugin-opt=-data-sections"); + } } /// This is a helper function for validating the optional refinement step @@ -4763,11 +4784,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-generate-type-units"); } - // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by - // default. - bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI || - Triple.getArch() == llvm::Triple::wasm32 || - Triple.getArch() == llvm::Triple::wasm64; + bool UseSeparateSections = isUseSeparateSections(Triple); if (Args.hasFlag(options::OPT_ffunction_sections, options::OPT_fno_function_sections, UseSeparateSections)) { diff --git a/test/Driver/gold-lto-sections.c b/test/Driver/gold-lto-sections.c new file mode 100644 index 0000000000..83d72cf7f9 --- /dev/null +++ b/test/Driver/gold-lto-sections.c @@ -0,0 +1,8 @@ +// RUN: touch %t.o +// +// RUN: %clang -target x86_64-unknown-linux -### %t.o -flto 2>&1 \ +// RUN: -Wl,-plugin-opt=foo -O3 \ +// RUN: -ffunction-sections -fdata-sections \ +// RUN: | FileCheck %s +// CHECK: "-plugin-opt=-function-sections" +// CHECK: "-plugin-opt=-data-sections"