103 lines · cpp
1// RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping -fcoverage-mcdc | FileCheck %s -check-prefix=MCDCCTOR2// RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping -fcoverage-mcdc | FileCheck %s -check-prefix=MCDCDTOR3 4extern void foo();5extern void bar();6class Value {7 public:8 void setValue(int len);9 int getValue(void);10 Value(); // This is the constructor declaration11 ~Value(); // This is the destructor declaration12 13 private:14 int value;15};16 17// Member functions definitions including constructor18Value::Value(void) {19 if (value != 2 || value != 6)20 foo();21}22Value::~Value(void) {23 if (value != 2 || value != 3)24 bar();25}26 27// MCDC BOOKKEEPING.28// MCDCCTOR: @__profbm__ZN5ValueC2Ev = private global [1 x i8] zeroinitializer29// MCDCCTOR: @__profc__ZN5ValueC2Ev = private global [4 x i64] zeroinitializer30 31// ALLOCATE MCDC TEMP AND ZERO IT.32// MCDCCTOR-LABEL: @_ZN5ValueC2Ev(33// MCDCCTOR: %mcdc.addr = alloca i32, align 434// MCDCCTOR: store i32 0, ptr %mcdc.addr, align 435 36// SHIFT FIRST CONDITION WITH ID = 0.37// MCDCCTOR: %[[LAB1:[0-9]+]] = load i32, ptr %value, align 438// MCDCCTOR-DAG: %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 239// MCDCCTOR-DAG: %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 440// MCDCCTOR-DAG: %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 041// MCDCCTOR-DAG: %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 042// MCDCCTOR-DAG: %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]43// MCDCCTOR-DAG: store i32 %[[LAB4]], ptr %mcdc.addr, align 444 45// SHIFT SECOND CONDITION WITH ID = 1.46// MCDCCTOR: %[[LAB1:[0-9]+]] = load i32, ptr %value2, align 447// MCDCCTOR-DAG: %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 648// MCDCCTOR-DAG: %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 449// MCDCCTOR-DAG: %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 250// MCDCCTOR-DAG: %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 151// MCDCCTOR-DAG: %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]52// MCDCCTOR-DAG: store i32 %[[LAB4]], ptr %mcdc.addr, align 453 54// UPDATE FINAL BITMASK WITH RESULT.55// MCDCCTOR-DAG: %[[TEMP0:mcdc.temp[0-9]*]] = load i32, ptr %mcdc.addr, align 456// MCDCCTOR: %[[TEMP:[0-9]+]] = add i32 %[[TEMP0]], 057// MCDCCTOR: %[[LAB1:[0-9]+]] = lshr i32 %[[TEMP]], 358// MCDCCTOR: %[[LAB4:[0-9]+]] = getelementptr inbounds i8, ptr @__profbm__ZN5ValueC2Ev, i32 %[[LAB1]]59// MCDCCTOR: %[[LAB5:[0-9]+]] = and i32 %[[TEMP]], 760// MCDCCTOR: %[[LAB6:[0-9]+]] = trunc i32 %[[LAB5]] to i861// MCDCCTOR: %[[LAB7:[0-9]+]] = shl i8 1, %[[LAB6]]62// MCDCCTOR: %[[BITS:.+]] = load i8, ptr %[[LAB4]], align 163// MCDCCTOR: %[[LAB8:[0-9]+]] = or i8 %[[BITS]], %[[LAB7]]64// MCDCCTOR: store i8 %[[LAB8]], ptr %[[LAB4]], align 165 66// MCDCDTOR: @__profbm__ZN5ValueD2Ev = private global [1 x i8] zeroinitializer67// MCDCDTOR: @__profc__ZN5ValueD2Ev = private global [4 x i64] zeroinitializer68 69// ALLOCATE MCDC TEMP AND ZERO IT.70// MCDCDTOR-LABEL: @_ZN5ValueD2Ev(71// MCDCDTOR: %mcdc.addr = alloca i32, align 472// MCDCDTOR: store i32 0, ptr %mcdc.addr, align 473 74// SHIFT FIRST CONDITION WITH ID = 0.75// MCDCDTOR: %[[LAB1:[0-9]+]] = load i32, ptr %value, align 476// MCDCDTOR-DAG: %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 277// MCDCDTOR-DAG: %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 478// MCDCDTOR-DAG: %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 079// MCDCDTOR-DAG: %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 080// MCDCDTOR-DAG: %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]81// MCDCDTOR-DAG: store i32 %[[LAB4]], ptr %mcdc.addr, align 482 83// SHIFT SECOND CONDITION WITH ID = 1.84// MCDCDTOR: %[[LAB1:[0-9]+]] = load i32, ptr %value2, align 485// MCDCDTOR-DAG: %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 386// MCDCDTOR-DAG: %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 487// MCDCDTOR-DAG: %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 288// MCDCDTOR-DAG: %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 189// MCDCDTOR-DAG: %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]90// MCDCDTOR-DAG: store i32 %[[LAB4]], ptr %mcdc.addr, align 491 92// UPDATE FINAL BITMASK WITH RESULT.93// MCDCDTOR-DAG: %[[TEMP0:mcdc.temp[0-9]*]] = load i32, ptr %mcdc.addr, align 494// MCDCDTOR: %[[TEMP:[0-9]+]] = add i32 %[[TEMP0]], 095// MCDCDTOR: %[[LAB1:[0-9]+]] = lshr i32 %[[TEMP]], 396// MCDCDTOR: %[[LAB4:[0-9]+]] = getelementptr inbounds i8, ptr @__profbm__ZN5ValueD2Ev, i32 %[[LAB1]]97// MCDCDTOR: %[[LAB5:[0-9]+]] = and i32 %[[TEMP]], 798// MCDCDTOR: %[[LAB6:[0-9]+]] = trunc i32 %[[LAB5]] to i899// MCDCDTOR: %[[LAB7:[0-9]+]] = shl i8 1, %[[LAB6]]100// MCDCDTOR: %[[BITS:.+]] = load i8, ptr %[[LAB4]], align 1101// MCDCDTOR: %[[LAB8:[0-9]+]] = or i8 %[[BITS]], %[[LAB7]]102// MCDCDTOR: store i8 %[[LAB8]], ptr %[[LAB4]], align 1103