[PATCH] D14030: Use linker option to reference profile runtime hook (Linux)

David Li via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 23 15:52:04 PDT 2015

davidxl created this revision.
davidxl added a reviewer: bogner.
davidxl added a subscriber: cfe-commits.

Currently when profile instrumentation is on, the compiler emits a runtime hook use function (__llvm_profile_runtime_use) for every module that is instrumented. The generated function references hook __llvm_profile_runtime in order for linker to link in runtime initialization module (InstrProfilingRuntime.o) that registers the profile dumper atexit.  The cost (though very small) can be avoided by changing the driver to emit the right linker option.

The clang patch itself does not change any functionality. There will be a follow up patch in LLVM that disables the hook use emission once this one is committed.



Index: lib/Driver/ToolChains.h
--- lib/Driver/ToolChains.h
+++ lib/Driver/ToolChains.h
@@ -744,6 +744,8 @@
       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;
Index: lib/Driver/ToolChains.cpp
--- lib/Driver/ToolChains.cpp
+++ lib/Driver/ToolChains.cpp
@@ -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 @@
   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))
+    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,

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14030.38272.patch
Type: text/x-patch
Size: 1649 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151023/d50cf708/attachment.bin>

More information about the cfe-commits mailing list