Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -758,6 +758,10 @@ 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; Index: clang/include/clang/Frontend/CodeGenOptions.def =================================================================== --- clang/include/clang/Frontend/CodeGenOptions.def +++ clang/include/clang/Frontend/CodeGenOptions.def @@ -335,6 +335,9 @@ /// 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 Index: clang/lib/CodeGen/BackendUtil.cpp =================================================================== --- clang/lib/CodeGen/BackendUtil.cpp +++ clang/lib/CodeGen/BackendUtil.cpp @@ -454,6 +454,7 @@ Options.ExplicitEmulatedTLS = CodeGenOpts.ExplicitEmulatedTLS; Options.DebuggerTuning = CodeGenOpts.getDebuggerTuning(); Options.EmitStackSizeSection = CodeGenOpts.StackSizeSection; + Options.EmitAddrsig = CodeGenOpts.Addrsig; if (CodeGenOpts.EnableSplitDwarf) Options.MCOptions.SplitDwarfFile = CodeGenOpts.SplitDwarfFile; Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -4798,6 +4798,11 @@ options::OPT_fno_complete_member_pointers, false)) CmdArgs.push_back("-fcomplete-member-pointers"); + 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 && Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -1119,6 +1119,8 @@ Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true); + Opts.Addrsig = Args.hasArg(OPT_faddrsig); + return Success; } Index: clang/test/CodeGen/addrsig.c =================================================================== --- /dev/null +++ clang/test/CodeGen/addrsig.c @@ -0,0 +1,18 @@ +// 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]; +} Index: clang/test/Driver/addrsig.c =================================================================== --- /dev/null +++ clang/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