C 如何理解“的输出”;llvm profdata show“数据显示”;

C 如何理解“的输出”;llvm profdata show“数据显示”;,c,linux,llvm,profiler,llvm-clang,C,Linux,Llvm,Profiler,Llvm Clang,我使用clang-3.8构建/链接为我的流程获得了一些分析数据(code.profdata): 我使用以下方法生成输出: llvm-profdata show -all-functions -counts -ic-targets -output=llvm_prof.log code.profdata 我试图弄明白,但我不知道如何解释它,输出中的每个字段意味着什么 是否有任何llvm工具可以像kcachegrind一样处理这些数据 谢谢 数据: Counters: fn1: Has

我使用clang-3.8构建/链接为我的流程获得了一些分析数据(
code.profdata
):

我使用以下方法生成输出:

llvm-profdata show -all-functions -counts -ic-targets -output=llvm_prof.log  code.profdata
  • 我试图弄明白,但我不知道如何解释它,输出中的每个字段意味着什么
  • 是否有任何llvm工具可以像kcachegrind一样处理这些数据
  • 谢谢

    数据:

    Counters:
      fn1:
        Hash: 0x878e8bfe5d1b6a20
        Counters: 8
        Function count: 4464
        Indirect Call Site Count: 0
        Block counts: [4464, 0, 294838272, 0, 4464, 0, 4464]
        Indirect Target Results:
      file1.c:fn2:
        Hash: 0x36804e8dae059d63
        Counters: 6
        Function count: 24576
        Indirect Call Site Count: 0
        Block counts: [24576, 24576, 0, 24576, 24576]
        Indirect Target Results:
      file2.c:fn3:
        Hash: 0x000000000000028a
        Counters: 3
        Function count: 0
        Indirect Call Site Count: 0
        Block counts: [0, 0]
        Indirect Target Results:
      file3.c:fn4:
        Hash: 0x0000000000000000
        Counters: 1
        Function count: 0
        Indirect Call Site Count: 0
        Block counts: []
        Indirect Target Results:
    

    我错过了一步。
    LLVM工具链提供了另一个工具-
    LLVM cov
    需要将
    llvm profdata merge
    的输出传递到
    llvm cov
    以将函数计数器数据链接到源代码,如下所示:

    llvm-cov show test.bin -instr-profile=merge.out
    
    它将生成以下输出:

           |    1|#include <stdio.h>
           |    2|#include <stdlib.h>
      1.11k|    3|#define CTR 10
           |    4|
           |    5|int
           |    6|main()
          1|    7|{
          1|    8|    int i, j, k;
         11|    9|    for(i=0; i < CTR; ++i) {
         10|   10|        printf("3: %d", i);
         10|   11|    }
        101|   12|    for(i=0; i < CTR*10; ++i) {
        100|   13|        printf("3: %d", i);
        100|   14|    }
      1.00k|   15|    for(i=0; i < CTR*100; ++i) {
      1.00k|   16|        printf("3: %d", i);
      1.00k|   17|    }
          1|   18|    //  exit(0);
          1|   19|    return 0;
    
          1|   20|}
    
    #2运行二进制程序并获取prof数据

    export LLVM_PROFILE_FILE=./llvm_%p.prof 
    ./profile_coverage > /dev/null
    // when program exits, it produces output file llvm_9150.prof
    
    #3合并

    #4仪器化源的覆盖范围

    $  llvm-cov-9 show profile_coverage  -instr-profile=merge.out
    
    写了一篇涵盖整个流程的博文:

    export LLVM_PROFILE_FILE=./llvm_%p.prof 
    ./profile_coverage > /dev/null
    // when program exits, it produces output file llvm_9150.prof
    
    $  llvm-profdata-9 merge -output=merge.out -instr llvm_9150.prof
    // outputs merge.out
    
    $  llvm-cov-9 show profile_coverage  -instr-profile=merge.out