[cfe-dev] unexpected coverage results for inline function with conditional #ifdef

Sam Toliman via cfe-dev cfe-dev at lists.llvm.org
Tue Nov 28 05:15:25 PST 2017


Hi all,

I have faced unexpected coverage results for inline function with
conditional #ifdef

// -- header.h
#pragma once

inline int bar(int x) {
    int y = 10;
#ifdef IE
    if (x)
        y *= 2;
#else
    y -= 5;
#endif
    return x * y;
}

// -- lib1.cpp
#include "header.h"

int lib1_foo(int x) {
    return bar(x) + x;
}

// -- main.cpp
#include <iostream>
#include "header.h"

extern int lib1_foo(int);

int main_foo(int x) {
    return bar(x) + x;
}

int main(int c, char**) {
    std::cout << lib1_foo(c) << " " << main_foo(c) << std::endl;
    return 0;
}

clang++ -fprofile-instr-generate -fcoverage-mapping -O2 -c -g lib1.cpp -o
lib1.o *-DIE*
clang++ -fprofile-instr-generate -fcoverage-mapping -O2 -c -g main.cpp -o
main.o
clang++ -fprofile-instr-generate -fcoverage-mapping -O2 -g main.o lib1.o -o
bin
./bin
llvm-profdata merge -o merged.prof default.profraw
llvm-cov export -instr-profile merged.prof -object bin

Output of the program will be "21 6"
However, segments for header.h will be:
[3,23,2,1,1],[5,2,0,0,1],[8,2,2,1,0],[12,2,0,0,0] ("y -= 5;" was performed
twice)
Looks like coverage wasn't able to connect source code with counters
properly.

-Sam
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20171128/2c674690/attachment.html>


More information about the cfe-dev mailing list