[llvm] 603d58b - [InstrProfiling] Use !associated metadata for counters, data and values

Arthur Eubanks via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 9 12:35:54 PDT 2020


Hi, this causes 37 failures under check-profile. Reverting this change
fixes those. Could you take a look and fix/revert?

They mostly seem to fail with
/usr/bin/ld: __llvm_prf_data has both ordered and unordered sections
/usr/bin/ld: final link failed: bad value
clang-11: error: linker command failed with exit code 1 (use -v to see
invocation)

  Profile-i386 :: Linux/comdat_rename.test
  Profile-i386 :: Linux/counter_promo_for.c
  Profile-i386 :: Linux/counter_promo_nest.c
  Profile-i386 :: Linux/counter_promo_while.c
  Profile-i386 :: Linux/coverage_test.cpp
  Profile-i386 :: Linux/extern_template.test
  Profile-i386 :: Linux/instrprof-cs.c
  Profile-i386 :: Linux/instrprof-dynamic-two-shared.test
  Profile-i386 :: Linux/instrprof-merge-vp.c
  Profile-i386 :: Linux/instrprof-value-merge.c
  Profile-i386 :: Linux/instrprof-value-prof-warn.test
  Profile-i386 :: Posix/instrprof-dlopen.test
  Profile-i386 :: Posix/instrprof-dynamic-one-shared.test
  Profile-i386 :: Posix/instrprof-dynamic-two-shared.test
  Profile-i386 :: Posix/instrprof-value-prof-shared.test
  Profile-i386 :: Posix/instrprof-visibility.cpp
  Profile-i386 :: coverage-inline.cpp
  Profile-i386 :: infinite_loop.c
  Profile-i386 :: instrprof-basic.c
  Profile-i386 :: instrprof-dump.c
  Profile-i386 :: instrprof-gc-sections.c
  Profile-i386 :: instrprof-icall-promo.test
  Profile-i386 :: instrprof-merge-match.test
  Profile-i386 :: instrprof-merge.c
  Profile-i386 :: instrprof-merging.cpp
  Profile-i386 :: instrprof-override-filename-with-env.c
  Profile-i386 :: instrprof-override-filename.c
  Profile-i386 :: instrprof-reset-counters.c
  Profile-i386 :: instrprof-set-dir-mode.c
  Profile-i386 :: instrprof-value-prof-2.c
  Profile-i386 :: instrprof-value-prof-evict.test
  Profile-i386 :: instrprof-value-prof-reset.c
  Profile-i386 :: instrprof-value-prof.c
  Profile-i386 :: instrprof-value-prof.test
  Profile-i386 :: instrprof-write-file-only.c
  Profile-i386 :: instrprof-write-file.c
  Profile-i386 :: runtime_infinite.c


On Mon, Jun 8, 2020 at 3:08 PM Petr Hosek via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

>
> Author: Petr Hosek
> Date: 2020-06-08T15:07:43-07:00
> New Revision: 603d58b5e49c76e4a2e5bf1450b71b100a3396ba
>
> URL:
> https://github.com/llvm/llvm-project/commit/603d58b5e49c76e4a2e5bf1450b71b100a3396ba
> DIFF:
> https://github.com/llvm/llvm-project/commit/603d58b5e49c76e4a2e5bf1450b71b100a3396ba.diff
>
> LOG: [InstrProfiling] Use !associated metadata for counters, data and
> values
>
> The !associated metadata may be attached to a global object declaration
> with a single argument that references another global object. This
> metadata prevents discarding of the global object in linker GC unless
> the referenced object is also discarded.
>
> Furthermore, when a function symbol is discarded by the linker, setting
> up !associated metadata allows linker to discard counters, data and
> values associated with that function symbol. This is not possible today
> because there's metadata to guide the linker. This approach is also used
> by other instrumentations like sanitizers.
>
> Note that !associated metadata is only supported by ELF, it does not have
> any effect on non-ELF targets.
>
> Differential Revision: https://reviews.llvm.org/D76802
>
> Added:
>     compiler-rt/test/profile/instrprof-gc-sections.c
>     llvm/test/Instrumentation/InstrProfiling/associated.ll
>     llvm/test/Transforms/PGOProfile/associated.ll
>
> Modified:
>     compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
>     llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
>     llvm/test/Transforms/PGOProfile/counter_promo.ll
>     llvm/test/Transforms/PGOProfile/counter_promo_mexits.ll
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
> b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
> index becfe1fd9f5a..4e3230bfb24c 100644
> --- a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
> +++ b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c
> @@ -24,27 +24,21 @@
>  #define PROF_VNODES_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_VNODES_COMMON)
>
>  /* Declare section start and stop symbols for various sections
> - * generated by compiler instrumentation.
> + * generated by compiler instrumentation. These symbols are
> + * declared as weak, which means that they'll end up as NULL if
> + * those sections are empty, and any code that iterates over the
> + * content using __llvm_profile_begin_* and __llvm_profile_end_*
> + * functions defined below will be a no-op.
>   */
> -extern __llvm_profile_data PROF_DATA_START COMPILER_RT_VISIBILITY;
> -extern __llvm_profile_data PROF_DATA_STOP COMPILER_RT_VISIBILITY;
> -extern uint64_t PROF_CNTS_START COMPILER_RT_VISIBILITY;
> -extern uint64_t PROF_CNTS_STOP COMPILER_RT_VISIBILITY;
> -extern uint32_t PROF_ORDERFILE_START COMPILER_RT_VISIBILITY;
> -extern char PROF_NAME_START COMPILER_RT_VISIBILITY;
> -extern char PROF_NAME_STOP COMPILER_RT_VISIBILITY;
> -extern ValueProfNode PROF_VNODES_START COMPILER_RT_VISIBILITY;
> -extern ValueProfNode PROF_VNODES_STOP COMPILER_RT_VISIBILITY;
> -
> -/* Add dummy data to ensure the section is always created. */
> -__llvm_profile_data
> -    __prof_data_sect_data[0]
> COMPILER_RT_SECTION(INSTR_PROF_DATA_SECT_NAME);
> -uint64_t
> -    __prof_cnts_sect_data[0]
> COMPILER_RT_SECTION(INSTR_PROF_CNTS_SECT_NAME);
> -uint32_t
> -    __prof_orderfile_sect_data[0]
> COMPILER_RT_SECTION(INSTR_PROF_ORDERFILE_SECT_NAME);
> -char __prof_nms_sect_data[0]
> COMPILER_RT_SECTION(INSTR_PROF_NAME_SECT_NAME);
> -ValueProfNode __prof_vnodes_sect_data[0]
> COMPILER_RT_SECTION(INSTR_PROF_VNODES_SECT_NAME);
> +extern __llvm_profile_data PROF_DATA_START COMPILER_RT_VISIBILITY
> COMPILER_RT_WEAK;
> +extern __llvm_profile_data PROF_DATA_STOP COMPILER_RT_VISIBILITY
> COMPILER_RT_WEAK;
> +extern uint64_t PROF_CNTS_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK;
> +extern uint64_t PROF_CNTS_STOP COMPILER_RT_VISIBILITY COMPILER_RT_WEAK;
> +extern uint32_t PROF_ORDERFILE_START COMPILER_RT_VISIBILITY
> COMPILER_RT_WEAK;
> +extern char PROF_NAME_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK;
> +extern char PROF_NAME_STOP COMPILER_RT_VISIBILITY COMPILER_RT_WEAK;
> +extern ValueProfNode PROF_VNODES_START COMPILER_RT_VISIBILITY
> COMPILER_RT_WEAK;
> +extern ValueProfNode PROF_VNODES_STOP COMPILER_RT_VISIBILITY
> COMPILER_RT_WEAK;
>
>  COMPILER_RT_VISIBILITY const __llvm_profile_data *
>  __llvm_profile_begin_data(void) {
>
> diff  --git a/compiler-rt/test/profile/instrprof-gc-sections.c
> b/compiler-rt/test/profile/instrprof-gc-sections.c
> new file mode 100644
> index 000000000000..a3d0fa466c30
> --- /dev/null
> +++ b/compiler-rt/test/profile/instrprof-gc-sections.c
> @@ -0,0 +1,91 @@
> +// REQUIRES: linux, lld-available
> +
> +// RUN: %clang_profgen=%t.profraw -fuse-ld=lld -fcoverage-mapping -mllvm
> -enable-name-compression=false -DCODE=1 -ffunction-sections -fdata-sections
> -Wl,--gc-sections -o %t %s
> +// RUN: %run %t
> +// RUN: llvm-profdata merge -o %t.profdata %t.profraw
> +// RUN: llvm-profdata show --all-functions %t.profdata | FileCheck %s
> -check-prefix=PROF
> +// RUN: llvm-cov show %t -instr-profile %t.profdata | FileCheck %s
> -check-prefix=COV
> +// RUN: llvm-nm %t | FileCheck %s -check-prefix=NM
> +// RUN: llvm-readelf -x __llvm_prf_names %t | FileCheck %s
> -check-prefix=PRF_NAMES
> +// RUN: llvm-readelf -x __llvm_prf_cnts %t | FileCheck %s
> -check-prefix=PRF_CNTS
> +
> +// RUN: %clang_lto_profgen=%t.lto.profraw -fuse-ld=lld -fcoverage-mapping
> -mllvm -enable-name-compression=false -DCODE=1 -ffunction-sections
> -fdata-sections -Wl,--gc-sections -flto -o %t.lto %s
> +// RUN: %run %t.lto
> +// RUN: llvm-profdata merge -o %t.lto.profdata %t.lto.profraw
> +// RUN: llvm-profdata show --all-functions %t.lto.profdata | FileCheck %s
> -check-prefix=PROF
> +// RUN: llvm-cov show %t.lto -instr-profile %t.lto.profdata | FileCheck
> %s -check-prefix=COV
> +// RUN: llvm-nm %t.lto | FileCheck %s -check-prefix=NM
> +// RUN: llvm-readelf -x __llvm_prf_names %t.lto | FileCheck %s
> -check-prefix=PRF_NAMES
> +// RUN: llvm-readelf -x __llvm_prf_cnts %t.lto | FileCheck %s
> -check-prefix=PRF_CNTS
> +
> +// Note: We expect foo() and some of the profiling data associated with
> it to
> +// be garbage collected.
> +
> +// Note: When there is no code in a program, we expect to see the exact
> same
> +// set of external functions provided by the profile runtime.
> +
> +// RUN: %clang_profgen -fcoverage-mapping -ffunction-sections
> -fdata-sections -Wl,--gc-sections -shared -o %t.nocode.so %s
> +// RUN: llvm-nm -jgU %t.nocode.so | grep -vE "__start_.*|__stop_.*" >
> %t.nocode.syms
> +// RUN: llvm-nm -jgU %t | grep -vE "main|foo|_start|__libc_.*" >
> %t.code.syms
> +// RUN:
> diff  %t.nocode.syms %t.code.syms
> +
> +// Note: We also check the IR instrumentation and expect foo() to be
> garbage
> +// collected as well.
> +
> +// RUN: %clang_pgogen=%t.pgo.profraw -fuse-ld=lld -DCODE=1
> -ffunction-sections -fdata-sections -Wl,--gc-sections -o %t.pgo %s
> +// RUN: %run %t.pgo
> +// RUN: llvm-profdata merge -o %t.pgo.profdata %t.pgo.profraw
> +// RUN: llvm-profdata show --all-functions %t.pgo.profdata | FileCheck %s
> -check-prefix=PGO
> +// RUN: llvm-nm %t.pgo | FileCheck %s -check-prefix=NM
> +
> +#ifdef CODE
> +
> +// COV: [[@LINE+1]]{{ *}}|{{ *}}0|void foo()
> +void foo() {}
> +
> +// COV: [[@LINE+1]]{{ *}}|{{ *}}1|int main
> +int main() { return 0; }
> +
> +#endif // CODE
> +
> +// NM-NOT: foo
> +
> +// PROF: Counters:
> +// PROF-NEXT:   main:
> +// PROF-NEXT:     Hash:
> +// PROF-NEXT:     Counters: 1
> +// PROF-NEXT:     Function count: 1
> +// PROF-NEXT: Instrumentation level: Front-end
> +// PROF-NEXT: Functions shown: 1
> +// PROF-NEXT: Total functions: 1
> +// PROF-NEXT: Maximum function count:
> +// PROF-NEXT: Maximum internal block count:
> +
> +// Note: We don't expect the names of garbage collected functions to
> disappear
> +// from __llvm_prf_names, because collectPGOFuncNameStrings() glues the
> names
> +// together.
> +
> +// PRF_NAMES: Hex dump of section '__llvm_prf_names':
> +// PRF_NAMES-NEXT: {{.*}} 0800666f 6f016d61 696e {{.*$}}
> +//                        | | f o  o # m a  i n
> +//                        | |___________|
> +//                        |             |
> +//               UncompressedLen = 8    |
> +//                                      |
> +//                               CompressedLen = 0
> +
> +// Note: We expect the profile counters for garbage collected functions
> to also
> +// be garbage collected.
> +
> +// PRF_CNTS: Hex dump of section '__llvm_prf_cnts':
> +// PRF_CNTS-NEXT: {{.*}} 00000000 00000000 {{.*$}}
> +
> +// PGO: Counters:
> +// PGO-NEXT:   main:
> +// PGO-NEXT:     Hash:
> +// PGO-NEXT:     Counters: 1
> +// PGO-NEXT: Instrumentation level: IR
> +// PGO-NEXT: Functions shown: 1
> +// PGO-NEXT: Total functions: 1
> +// PGO-NEXT: Maximum function count:
> +// PGO-NEXT: Maximum internal block count:
>
> diff  --git a/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
> b/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
> index ceceafa86030..06ccf439501a 100644
> --- a/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
> +++ b/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp
> @@ -844,6 +844,8 @@
> InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
>    CounterPtr->setAlignment(Align(8));
>    MaybeSetComdat(CounterPtr);
>    CounterPtr->setLinkage(Linkage);
> +  CounterPtr->setMetadata(LLVMContext::MD_associated,
> +                          MDNode::get(Ctx,
> ValueAsMetadata::get(CounterPtr)));
>
>    auto *Int8PtrTy = Type::getInt8PtrTy(Ctx);
>    // Allocate statically the array of pointers to value profile nodes for
> @@ -865,6 +867,8 @@
> InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
>            getInstrProfSectionName(IPSK_vals, TT.getObjectFormat()));
>        ValuesVar->setAlignment(Align(8));
>        MaybeSetComdat(ValuesVar);
> +      ValuesVar->setMetadata(LLVMContext::MD_associated,
> +                             MDNode::get(Ctx,
> ValueAsMetadata::get(CounterPtr)));
>        ValuesPtrExpr =
>            ConstantExpr::getBitCast(ValuesVar, Type::getInt8PtrTy(Ctx));
>      }
> @@ -899,6 +903,8 @@
> InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
>    Data->setAlignment(Align(INSTR_PROF_DATA_ALIGNMENT));
>    MaybeSetComdat(Data);
>    Data->setLinkage(Linkage);
> +  Data->setMetadata(LLVMContext::MD_associated,
> +                    MDNode::get(Ctx, ValueAsMetadata::get(CounterPtr)));
>
>    PD.RegionCounters = CounterPtr;
>    PD.DataVar = Data;
>
> diff  --git a/llvm/test/Instrumentation/InstrProfiling/associated.ll
> b/llvm/test/Instrumentation/InstrProfiling/associated.ll
> new file mode 100644
> index 000000000000..dbb496dd8bdb
> --- /dev/null
> +++ b/llvm/test/Instrumentation/InstrProfiling/associated.ll
> @@ -0,0 +1,16 @@
> +; RUN: opt < %s -instrprof -S | FileCheck %s
> +; RUN: opt < %s -passes=instrprof -S | FileCheck %s
> +
> + at __profn_foo = hidden constant [3 x i8] c"foo"
> +
> +; CHECK: @__profc_foo = hidden global [1 x i64] zeroinitializer, section
> "__llvm_prf_cnts", align 8, !associated !0
> +; CHECK: @__profd_foo = hidden global {{.*}}, section "__llvm_prf_data",
> align 8, !associated !0
> +
> +define void @foo() {
> +  call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x
> i8], [3 x i8]* @__profn_foo, i32 0, i32 0), i64 0, i32 1, i32 0)
> +  ret void
> +}
> +
> +declare void @llvm.instrprof.increment(i8*, i64, i32, i32)
> +
> +; CHECK: !0 = !{[1 x i64]* @__profc_foo}
>
> diff  --git a/llvm/test/Transforms/PGOProfile/associated.ll
> b/llvm/test/Transforms/PGOProfile/associated.ll
> new file mode 100644
> index 000000000000..2d12d19d05ed
> --- /dev/null
> +++ b/llvm/test/Transforms/PGOProfile/associated.ll
> @@ -0,0 +1,11 @@
> +; RUN: opt < %s -pgo-instr-gen -instrprof -S | FileCheck %s
> +; RUN: opt < %s -passes=pgo-instr-gen,instrprof -S | FileCheck %s
> +
> +; CHECK: @__profc_foo = private global [1 x i64] zeroinitializer, section
> "__llvm_prf_cnts", align 8, !associated !0
> +; CHECK: @__profd_foo = private global {{.*}}, section "__llvm_prf_data",
> align 8, !associated !0
> +
> +define void @foo() {
> +  ret void
> +}
> +
> +; CHECK: !0 = !{[1 x i64]* @__profc_foo}
>
> diff  --git a/llvm/test/Transforms/PGOProfile/counter_promo.ll
> b/llvm/test/Transforms/PGOProfile/counter_promo.ll
> index 812d0fefaa79..da08ace84933 100644
> --- a/llvm/test/Transforms/PGOProfile/counter_promo.ll
> +++ b/llvm/test/Transforms/PGOProfile/counter_promo.ll
> @@ -60,7 +60,7 @@ bb12:                                             ;
> preds = %bb9
>  ; ATOMIC_PROMO: atomicrmw add {{.*}} @__profc_foo{{.*}}0), i64
> %[[LIVEOUT1]] seq_cst
>  ; ATOMIC_PROMO-NEXT: atomicrmw add {{.*}} @__profc_foo{{.*}}1), i64
> %[[LIVEOUT2]] seq_cst
>  ; ATOMIC_PROMO-NEXT: atomicrmw add {{.*}} @__profc_foo{{.*}}2), i64
> %[[LIVEOUT3]] seq_cst
> -; PROMO-NOT: @__profc_foo
> +; PROMO-NOT: @__profc_foo{{.*}})
>
>
>  }
>
> diff  --git a/llvm/test/Transforms/PGOProfile/counter_promo_mexits.ll
> b/llvm/test/Transforms/PGOProfile/counter_promo_mexits.ll
> index bb799757a47c..8e907acb34da 100644
> --- a/llvm/test/Transforms/PGOProfile/counter_promo_mexits.ll
> +++ b/llvm/test/Transforms/PGOProfile/counter_promo_mexits.ll
> @@ -69,7 +69,7 @@ bb15_0:                                             ;
> preds = %bb11
>  ; PROMO-NEXT:  %pgocount{{.*}} = load {{.*}} @__profc_foo{{.*}} 4)
>  ; PROMO-NEXT: add
>  ; PROMO-NEXT: store {{.*}}@__profc_foo{{.*}}4)
> -; PROMO-NOT: @__profc_foo
> +; PROMO-NOT: @__profc_foo{{.*}})
>
>
>  bb15:                                             ; preds = %bb14, %bb4
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200609/fa2dc3b9/attachment.html>


More information about the llvm-commits mailing list