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

Duncan P. N. Exon Smith dexonsmith at apple.com
Wed May 27 09:51:36 PDT 2015


> On 2015 May 27, at 09:44, Diego Novillo <dnovillo at google.com> wrote:
> 
> 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

Testcase?

> 
> 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);
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list