Index: include/clang/Driver/ToolChain.h =================================================================== --- include/clang/Driver/ToolChain.h +++ include/clang/Driver/ToolChain.h @@ -408,9 +408,10 @@ /// This checks for presence of the -Ofast, -ffast-math or -funsafe-math flags. virtual bool AddFastMathRuntimeIfAvailable( const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; - /// addProfileRTLibs - When -fprofile-instr-profile is specified, try to pass + + /// addProfileRTOpts - When -fprofile-instr-profile is specified, try to pass /// a suitable profile runtime library to the linker. - virtual void addProfileRTLibs(const llvm::opt::ArgList &Args, + virtual void addProfileRTOpts(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; /// \brief Add arguments to use system-specific CUDA includes. Index: lib/Driver/ToolChain.cpp =================================================================== --- lib/Driver/ToolChain.cpp +++ lib/Driver/ToolChain.cpp @@ -518,7 +518,7 @@ void ToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {} -void ToolChain::addProfileRTLibs(const llvm::opt::ArgList &Args, +void ToolChain::addProfileRTOpts(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const { if (!needsProfileRT(Args)) return; Index: lib/Driver/ToolChains.h =================================================================== --- lib/Driver/ToolChains.h +++ lib/Driver/ToolChains.h @@ -289,7 +289,7 @@ /// Add any profiling runtime libraries that are needed. This is essentially a /// MachO specific version of addProfileRT in Tools.cpp. - void addProfileRTLibs(const llvm::opt::ArgList &Args, + void addProfileRTOpts(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override { // There aren't any profiling libs for embedded targets currently. } @@ -403,7 +403,7 @@ !isTargetWatchOS()); } - void addProfileRTLibs(const llvm::opt::ArgList &Args, + void addProfileRTOpts(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; protected: @@ -808,7 +808,7 @@ llvm::opt::ArgStringList &CC1Args) const override; bool isPIEDefault() const override; SanitizerMask getSupportedSanitizers() const override; - void addProfileRTLibs(const llvm::opt::ArgList &Args, + void addProfileRTOpts(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; virtual std::string computeSysRoot() const; Index: lib/Driver/ToolChains.cpp =================================================================== --- lib/Driver/ToolChains.cpp +++ lib/Driver/ToolChains.cpp @@ -30,6 +30,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" +#include "llvm/Support/Process.h" #include "llvm/Support/Program.h" #include "llvm/Support/TargetParser.h" #include "llvm/Support/raw_ostream.h" @@ -349,13 +350,25 @@ llvm_unreachable("Unsupported platform"); } -void Darwin::addProfileRTLibs(const ArgList &Args, +void Darwin::addProfileRTOpts(const ArgList &Args, ArgStringList &CmdArgs) const { if (!needsProfileRT(Args)) return; AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") + getOSLibraryNameSuffix() + ".a").str(), /*AlwaysLink*/ true); + + const char *PageSizeStr = Args.MakeArgString( + "0x" + llvm::utohexstr(llvm::sys::Process::getPageSize())); + auto AlignSection = [&](StringRef SectionName) { + CmdArgs.push_back("-sectalign"); + CmdArgs.push_back("__DATA"); + CmdArgs.push_back(SectionName.data()); + CmdArgs.push_back(PageSizeStr); + }; + + // Try to page-align the counter section so that it can be mmap'd to disk. + AlignSection(llvm::getInstrProfCountersSectionName(/*AddSegment*/ false)); } void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args, @@ -4158,7 +4171,7 @@ return Res; } -void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args, +void Linux::addProfileRTOpts(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const { if (!needsProfileRT(Args)) return; @@ -4167,7 +4180,7 @@ if (!Args.hasArg(options::OPT_coverage)) CmdArgs.push_back(Args.MakeArgString( Twine("-u", llvm::getInstrProfRuntimeHookVarName()))); - ToolChain::addProfileRTLibs(Args, CmdArgs); + ToolChain::addProfileRTOpts(Args, CmdArgs); } /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -7583,7 +7583,7 @@ if (Args.hasArg(options::OPT_fnested_functions)) CmdArgs.push_back("-allow_stack_execute"); - getMachOToolChain().addProfileRTLibs(Args, CmdArgs); + getMachOToolChain().addProfileRTOpts(Args, CmdArgs); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { if (getToolChain().getDriver().CCCIsCXX()) @@ -7779,7 +7779,7 @@ } CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); - getToolChain().addProfileRTLibs(Args, CmdArgs); + getToolChain().addProfileRTOpts(Args, CmdArgs); const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); @@ -8384,7 +8384,7 @@ CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); } - ToolChain.addProfileRTLibs(Args, CmdArgs); + ToolChain.addProfileRTOpts(Args, CmdArgs); const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); @@ -8677,7 +8677,7 @@ CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); } - getToolChain().addProfileRTLibs(Args, CmdArgs); + getToolChain().addProfileRTOpts(Args, CmdArgs); const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); @@ -9217,7 +9217,7 @@ bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs); AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); // The profile runtime also needs access to system libraries. - getToolChain().addProfileRTLibs(Args, CmdArgs); + getToolChain().addProfileRTOpts(Args, CmdArgs); if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { @@ -9526,7 +9526,7 @@ AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); - getToolChain().addProfileRTLibs(Args, CmdArgs); + getToolChain().addProfileRTOpts(Args, CmdArgs); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { if (D.CCCIsCXX()) { @@ -9695,7 +9695,7 @@ CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); } - getToolChain().addProfileRTLibs(Args, CmdArgs); + getToolChain().addProfileRTOpts(Args, CmdArgs); const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); @@ -9865,7 +9865,7 @@ A.renderAsInput(Args, CmdArgs); } - TC.addProfileRTLibs(Args, CmdArgs); + TC.addProfileRTOpts(Args, CmdArgs); // We need to special case some linker paths. In the case of lld, we need to // translate 'lld' into 'lld-link', and in the case of the regular msvc Index: test/Driver/instrprof-ld.c =================================================================== --- test/Driver/instrprof-ld.c +++ test/Driver/instrprof-ld.c @@ -73,6 +73,7 @@ // // CHECK-DARWIN-X86-64: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" // CHECK-DARWIN-X86-64: "{{.*}}/Inputs/resource_dir{{/|\\\\}}lib{{/|\\\\}}darwin{{/|\\\\}}libclang_rt.profile_osx.a" +// CHECK-DARWIN-X86-64: "-sectalign" "__DATA" "__llvm_prf_cnts" "0x{{[0-9a-f]+}}" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target x86_64-apple-darwin14 -fprofile-instr-generate -nostdlib \ @@ -81,6 +82,7 @@ // // CHECK-DARWIN-NOSTDLIB-X86-64: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" // CHECK-DARWIN-NOSTDLIB-X86-64: "{{.*}}/Inputs/resource_dir{{/|\\\\}}lib{{/|\\\\}}darwin{{/|\\\\}}libclang_rt.profile_osx.a" +// CHECK-DARWIN-NOSTDLIB-X86-64: "-sectalign" "__DATA" "__llvm_prf_cnts" "0x{{[0-9a-f]+}}" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm64-apple-ios -fprofile-instr-generate \ @@ -89,6 +91,7 @@ // // CHECK-DARWIN-ARM64: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" // CHECK-DARWIN-ARM64: "{{.*}}/Inputs/resource_dir{{/|\\\\}}lib{{/|\\\\}}darwin{{/|\\\\}}libclang_rt.profile_ios.a" +// CHECK-DARWIN-ARM64-X86-64: "-sectalign" "__DATA" "__llvm_prf_cnts" "0x{{[0-9a-f]+}}" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target armv7-apple-darwin -mtvos-version-min=8.3 -fprofile-instr-generate \ @@ -97,6 +100,7 @@ // // CHECK-TVOS-ARMV7: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" // CHECK-TVOS-ARMV7: "{{.*}}/Inputs/resource_dir{{/|\\\\}}lib{{/|\\\\}}darwin{{/|\\\\}}libclang_rt.profile_tvos.a" +// CHECK-TVOS-ARMV7: "-sectalign" "__DATA" "__llvm_prf_cnts" "0x{{[0-9a-f]+}}" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target armv7s-apple-darwin10 -mwatchos-version-min=2.0 -arch armv7k -fprofile-instr-generate \ @@ -105,6 +109,7 @@ // // CHECK-WATCHOS-ARMV7: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}" // CHECK-WATCHOS-ARMV7: "{{.*}}/Inputs/resource_dir{{/|\\\\}}lib{{/|\\\\}}darwin{{/|\\\\}}libclang_rt.profile_watchos.a" +// CHECK-WATCHOS-ARMV7: "-sectalign" "__DATA" "__llvm_prf_cnts" "0x{{[0-9a-f]+}}" // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target i386-pc-win32 -fprofile-instr-generate \