[llvm] r238335 - Fix PR 23499 - Avoid multiple profile counters for functions in comdat sections.

Diego Novillo dnovillo at google.com
Wed May 27 09:44:47 PDT 2015


Author: dnovillo
Date: Wed May 27 11:44:47 2015
New Revision: 238335

URL: http://llvm.org/viewvc/llvm-project?rev=238335&view=rev
Log:
Fix PR 23499 - Avoid multiple profile counters for functions in comdat sections.

Counter symbols created for linkonce functions are not discarded by ELF
linkers unless the symbols are placed in the same comdat section as its
associated function.

Modified:
    llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp

Modified: llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp?rev=238335&r1=238334&r2=238335&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp Wed May 27 11:44:47 2015
@@ -203,6 +203,7 @@ InstrProfiling::getOrCreateRegionCounter
   uint64_t NumCounters = Inc->getNumCounters()->getZExtValue();
   LLVMContext &Ctx = M->getContext();
   ArrayType *CounterTy = ArrayType::get(Type::getInt64Ty(Ctx), NumCounters);
+  Function *Fn = Inc->getParent()->getParent();
 
   // Create the counters variable.
   auto *Counters = new GlobalVariable(*M, CounterTy, false, Name->getLinkage(),
@@ -211,6 +212,10 @@ InstrProfiling::getOrCreateRegionCounter
   Counters->setVisibility(Name->getVisibility());
   Counters->setSection(getCountersSection());
   Counters->setAlignment(8);
+  // Place the counters in the same comdat section as its parent function.
+  // Otherwise, we may get multiple counters for the same function in certain
+  // cases.
+  Counters->setComdat(Fn->getComdat());
 
   RegionCounters[Inc->getName()] = Counters;
 
@@ -235,6 +240,7 @@ InstrProfiling::getOrCreateRegionCounter
   Data->setVisibility(Name->getVisibility());
   Data->setSection(getDataSection());
   Data->setAlignment(8);
+  Data->setComdat(Fn->getComdat());
 
   // Mark the data variable as used so that it isn't stripped out.
   UsedVars.push_back(Data);





More information about the llvm-commits mailing list