Xinliang David Li via cfe-commits <cfe-commits@lists.llvm.org> writes: > Author: davidxl > Date: Tue Oct 27 00:15:35 2015 > New Revision: 251385 > > URL: http://llvm.org/viewvc/llvm-project?rev=251385&view=rev > Log: > Create undef reference to profile hook symbol > > Create undef reference to profile hook symbol when > PGO instrumentation is turned on. This allows > LLVM to omit emission of hook variable use method > for every single module instrumented.
Nick: This approach should work for ld64 as well, right? David: This seems like a good idea, but it's buggy as implemented. Details below. > > Modified: > cfe/trunk/lib/Driver/ToolChains.cpp > cfe/trunk/lib/Driver/ToolChains.h > > Modified: cfe/trunk/lib/Driver/ToolChains.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=251385&r1=251384&r2=251385&view=diff > ============================================================================== > --- cfe/trunk/lib/Driver/ToolChains.cpp (original) > +++ cfe/trunk/lib/Driver/ToolChains.cpp Tue Oct 27 00:15:35 2015 > @@ -25,6 +25,7 @@ > #include "llvm/Option/ArgList.h" > #include "llvm/Option/OptTable.h" > #include "llvm/Option/Option.h" > +#include "llvm/ProfileData/InstrProf.h" > #include "llvm/Support/ErrorHandling.h" > #include "llvm/Support/FileSystem.h" > #include "llvm/Support/MemoryBuffer.h" > @@ -3811,6 +3812,18 @@ SanitizerMask Linux::getSupportedSanitiz > return Res; > } > > +void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args, > + llvm::opt::ArgStringList &CmdArgs) const { > + if (!needsProfileRT(Args)) return; > + > + // Add linker option -u__llvm_runtime_variable to cause runtime > + // initialization module to be linked in. > + if (!Args.hasArg(options::OPT_coverage)) This check isn't right. What about the other gcov-style flags like -fprofile-args? What if both kinds of coverage are on for some strange reason? It's also a maintenance burden, since the logic needs to be duplicated from needsProfileRT. I think we need finer grained helpers - maybe something like needsGCOVRT and needsInstrProfRT, either of which will pull in the profileRTLibs. > + CmdArgs.push_back(Args.MakeArgString( > + Twine("-u", llvm::getInstrProfRuntimeHookVarName()))); > + ToolChain::addProfileRTLibs(Args, CmdArgs); > +} > + > /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. > > DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple, > > Modified: cfe/trunk/lib/Driver/ToolChains.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=251385&r1=251384&r2=251385&view=diff > ============================================================================== > --- cfe/trunk/lib/Driver/ToolChains.h (original) > +++ cfe/trunk/lib/Driver/ToolChains.h Tue Oct 27 00:15:35 2015 > @@ -744,6 +744,8 @@ public: > llvm::opt::ArgStringList &CC1Args) const override; > bool isPIEDefault() const override; > SanitizerMask getSupportedSanitizers() const override; > + void addProfileRTLibs(const llvm::opt::ArgList &Args, > + llvm::opt::ArgStringList &CmdArgs) const override; > > std::string Linker; > std::vector<std::string> ExtraOpts; > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits