Skip to content

Commit

Permalink
Re-land r337333, "Teach Clang to emit address-significance tables.",
Browse files Browse the repository at this point in the history
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

llvm-svn: 337339
  • Loading branch information
pcc committed Jul 18, 2018
1 parent fc50498 commit 14b468b
Show file tree
Hide file tree
Showing 9 changed files with 60 additions and 0 deletions.
8 changes: 8 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
<https://research.google.com/pubs/archive/36912.pdf>`_ 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
Expand Down
9 changes: 9 additions & 0 deletions clang/docs/UsersManual.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
<https://research.google.com/pubs/archive/36912.pdf>`_ 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
---------------------------
Expand Down
4 changes: 4 additions & 0 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -758,6 +758,10 @@ def fno_profile_instr_use : Flag<["-"], "fno-profile-instr-use">,
def fno_profile_use : Flag<["-"], "fno-profile-use">,
Alias<fno_profile_instr_use>;

def faddrsig : Flag<["-"], "faddrsig">, Group<f_Group>, Flags<[CoreOption, CC1Option]>,
HelpText<"Emit an address-significance table">;
def fno_addrsig : Flag<["-"], "fno-addrsig">, Group<f_Group>, Flags<[CoreOption]>,
HelpText<"Don't emit an address-significance table">;
def fblocks : Flag<["-"], "fblocks">, Group<f_Group>, Flags<[CC1Option]>,
HelpText<"Enable the 'blocks' language feature">;
def fbootclasspath_EQ : Joined<["-"], "fbootclasspath=">, Group<f_Group>;
Expand Down
3 changes: 3 additions & 0 deletions clang/include/clang/Frontend/CodeGenOptions.def
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions clang/lib/CodeGen/BackendUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 5 additions & 0 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 &&
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Frontend/CompilerInvocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
20 changes: 20 additions & 0 deletions clang/test/CodeGen/addrsig.c
Original file line number Diff line number Diff line change
@@ -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];
}
8 changes: 8 additions & 0 deletions clang/test/Driver/addrsig.c
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 14b468b

Please sign in to comment.