From: Peter Collingbourne Date: Wed, 18 Jul 2018 00:27:07 +0000 (+0000) Subject: Re-land r337333, "Teach Clang to emit address-significance tables.", X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=641d6452c92bbb41eb207365a757b8026c7083ff;p=clang Re-land r337333, "Teach Clang to emit address-significance tables.", which was reverted in r337336. The problem that required a revert was fixed in r337338. Also added a missing "REQUIRES: x86-registered-target" to one of the tests. Original commit message: > Teach Clang to emit address-significance tables. > > By default, we emit an address-significance table on all ELF > targets when the integrated assembler is enabled. The emission of an > address-significance table can be controlled with the -faddrsig and > -fno-addrsig flags. > > Differential Revision: https://reviews.llvm.org/D48155 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@337339 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/ReleaseNotes.rst b/docs/ReleaseNotes.rst index c0ce10d6eb..99be2fdfe0 100644 --- a/docs/ReleaseNotes.rst +++ b/docs/ReleaseNotes.rst @@ -98,6 +98,14 @@ Non-comprehensive list of changes in this release finding out the warning hierarchy, and which of them are enabled by default or for a particular compiler invocation. +- By default, Clang emits an address-significance table into + every ELF object file when using the integrated assembler. + Address-significance tables allow linkers to implement `safe ICF + `_ without the false + positives that can result from other implementation techniques such as + relocation scanning. The ``-faddrsig`` and ``-fno-addrsig`` flags can be + used to control whether to emit the address-significance table. + - ... New Compiler Flags diff --git a/docs/UsersManual.rst b/docs/UsersManual.rst index 4470dab947..418afb2d54 100644 --- a/docs/UsersManual.rst +++ b/docs/UsersManual.rst @@ -1382,6 +1382,15 @@ are listed below. // value of -fmax-type-align. } +.. option:: -faddrsig, -fno-addrsig + + Controls whether Clang emits an address-significance table into the object + file. Address-significance tables allow linkers to implement `safe ICF + `_ without the false + positives that can result from other implementation techniques such as + relocation scanning. Address-significance tables are enabled by default + on ELF targets when using the integrated assembler. This flag currently + only has an effect on ELF targets. Profile Guided Optimization --------------------------- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 9035a91ce2..b71d1e15ae 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -758,6 +758,10 @@ def fno_profile_instr_use : Flag<["-"], "fno-profile-instr-use">, def fno_profile_use : Flag<["-"], "fno-profile-use">, Alias; +def faddrsig : Flag<["-"], "faddrsig">, Group, Flags<[CoreOption, CC1Option]>, + HelpText<"Emit an address-significance table">; +def fno_addrsig : Flag<["-"], "fno-addrsig">, Group, Flags<[CoreOption]>, + HelpText<"Don't emit an address-significance table">; def fblocks : Flag<["-"], "fblocks">, Group, Flags<[CC1Option]>, HelpText<"Enable the 'blocks' language feature">; def fbootclasspath_EQ : Joined<["-"], "fbootclasspath=">, Group; diff --git a/include/clang/Frontend/CodeGenOptions.def b/include/clang/Frontend/CodeGenOptions.def index 99567e04ba..c199b5428e 100644 --- a/include/clang/Frontend/CodeGenOptions.def +++ b/include/clang/Frontend/CodeGenOptions.def @@ -335,6 +335,9 @@ CODEGENOPT(EmbedSource, 1, 0) /// Whether to emit all vtables CODEGENOPT(ForceEmitVTables, 1, 0) +/// Whether to emit an address-significance table into the object file. +CODEGENOPT(Addrsig, 1, 0) + #undef CODEGENOPT #undef ENUM_CODEGENOPT diff --git a/lib/CodeGen/BackendUtil.cpp b/lib/CodeGen/BackendUtil.cpp index 226a27b216..415bd96262 100644 --- a/lib/CodeGen/BackendUtil.cpp +++ b/lib/CodeGen/BackendUtil.cpp @@ -454,6 +454,7 @@ static void initTargetOptions(llvm::TargetOptions &Options, Options.ExplicitEmulatedTLS = CodeGenOpts.ExplicitEmulatedTLS; Options.DebuggerTuning = CodeGenOpts.getDebuggerTuning(); Options.EmitStackSizeSection = CodeGenOpts.StackSizeSection; + Options.EmitAddrsig = CodeGenOpts.Addrsig; if (CodeGenOpts.EnableSplitDwarf) Options.MCOptions.SplitDwarfFile = CodeGenOpts.SplitDwarfFile; diff --git a/lib/Driver/ToolChains/Clang.cpp b/lib/Driver/ToolChains/Clang.cpp index e7b15c7ad8..4db4dc19a8 100644 --- a/lib/Driver/ToolChains/Clang.cpp +++ b/lib/Driver/ToolChains/Clang.cpp @@ -4777,6 +4777,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, } } + if (Args.hasFlag(options::OPT_faddrsig, options::OPT_fno_addrsig, + getToolChain().getTriple().isOSBinFormatELF() && + getToolChain().useIntegratedAs())) + CmdArgs.push_back("-faddrsig"); + // Finally add the compile command to the compilation. if (Args.hasArg(options::OPT__SLASH_fallback) && Output.getType() == types::TY_Object && diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index d62429dc78..c26d5fb79b 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1119,6 +1119,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true); + Opts.Addrsig = Args.hasArg(OPT_faddrsig); + return Success; } diff --git a/test/CodeGen/addrsig.c b/test/CodeGen/addrsig.c new file mode 100644 index 0000000000..d7141092bb --- /dev/null +++ b/test/CodeGen/addrsig.c @@ -0,0 +1,20 @@ +// REQUIRES: x86-registered-target + +// RUN: %clang_cc1 -triple=x86_64-unknown-linux -S %s -faddrsig -O -o - | FileCheck --check-prefix=ADDRSIG %s +// RUN: %clang_cc1 -triple=x86_64-unknown-linux -S %s -O -o - | FileCheck --check-prefix=NO-ADDRSIG %s + +// ADDRSIG: .addrsig +// ADDRSIG: .addrsig_sym g1 +// ADDRSIG-NOT: .addrsig_sym g2 + +// NO-ADDRSIG-NOT: .addrsig + +extern const int g1[], g2[]; + +const int *f1() { + return g1; +} + +int f2() { + return g2[0]; +} diff --git a/test/Driver/addrsig.c b/test/Driver/addrsig.c new file mode 100644 index 0000000000..fd5598c472 --- /dev/null +++ b/test/Driver/addrsig.c @@ -0,0 +1,8 @@ +// RUN: %clang -### -target x86_64-unknown-linux -c %s 2>&1 | FileCheck -check-prefix=ADDRSIG %s +// RUN: %clang -### -target x86_64-unknown-linux -fno-integrated-as -c %s 2>&1 | FileCheck -check-prefix=NO-ADDRSIG %s +// RUN: %clang -### -target x86_64-unknown-linux -fno-integrated-as -faddrsig -c %s 2>&1 | FileCheck -check-prefix=ADDRSIG %s +// RUN: %clang -### -target x86_64-unknown-linux -fno-addrsig -c %s 2>&1 | FileCheck -check-prefix=NO-ADDRSIG %s +// RUN: %clang -### -target x86_64-apple-darwin -c %s 2>&1 | FileCheck -check-prefix=NO-ADDRSIG %s + +// ADDRSIG: -faddrsig +// NO-ADDRSIG-NOT: -faddrsig