Fix PR 23499

Justin Bogner mail at justinbogner.com
Wed May 27 08:51:07 PDT 2015


Diego Novillo <dnovillo at google.com> writes:
> Based on our IRC discussion, I think this will address the multiple
> copy problem on ELF systems.  By placing the counters in the same
> comdat section as its associated function, we get the linker to
> discard them together with the discarded function.

Is setting the comdat on Data sufficient, or should we do it for
Counters (and possibly even name) also? I guess that could lead to some
more space savings, even if it doesn't have a visible effect.

> I don't think we need to create another test case just to trigger this
> bug.  A small modification to the existing test case exposes it. I can
> create a new one, if you'd rather have a different test case for this,
> though.
>
> OK to commit?

I agree about the test. This LGTM once you've looked into the comment
above.

>
> Thanks.  Diego.
>
> diff --git a/lib/Transforms/Instrumentation/InstrProfiling.cpp b/lib/Transforms/Instrumentation/InstrProfiling.cpp
> index 0718ddc..b12c475 100644
> --- a/lib/Transforms/Instrumentation/InstrProfiling.cpp
> +++ b/lib/Transforms/Instrumentation/InstrProfiling.cpp
> @@ -235,6 +235,12 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
>    Data->setVisibility(Name->getVisibility());
>    Data->setSection(getDataSection());
>    Data->setAlignment(8);
> +  // Place the data variable in the same comdat section as
> +  // its parent function. Otherwise, we may get multiple
> +  // counters for the same function in certain cases
> +  // (https://llvm.org/bugs/show_bug.cgi?id=23499).

We usually wrap comments a little wider than this, and there's no need
to refer to the bug number here.

> +  Function* F = Inc->getParent()->getParent();
> +  Data->setComdat(F->getComdat());
>  
>    // Mark the data variable as used so that it isn't stripped out.
>    UsedVars.push_back(Data);
> diff --git a/test/profile/Inputs/instrprof-dynamic-header.h b/test/profile/Inputs/instrprof-dynamic-header.h
> index 1dc2e37..4d4a513 100644
> --- a/test/profile/Inputs/instrprof-dynamic-header.h
> +++ b/test/profile/Inputs/instrprof-dynamic-header.h
> @@ -1,5 +1,8 @@
> +extern int X;
>  template <class T> void bar() {
> -  if (true) {}
> +  if (X) {
> +    X *= 4;
> +  }
>  }
>  void a();
>  void b();
> diff --git a/test/profile/Inputs/instrprof-dynamic-main.cpp b/test/profile/Inputs/instrprof-dynamic-main.cpp
> index 0dd6021..5ba46ad 100644
> --- a/test/profile/Inputs/instrprof-dynamic-main.cpp
> +++ b/test/profile/Inputs/instrprof-dynamic-main.cpp
> @@ -1,7 +1,9 @@
>  #include "instrprof-dynamic-header.h"
> +int X = 0;
>  void foo(int K) { if (K) {} }
>  int main(int argc, char *argv[]) {
>    foo(5);
> +  X++;
>    bar<void>();
>    a();
>    b();



More information about the llvm-commits mailing list