xref: /llvm-project/clang/test/Profile/c-mcdc-class.cpp (revision 7ef2bd4e447280015803cff7fc91ec4dd09cd4b3)
18b2bdfbcSAlan Phipps // RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping -fcoverage-mcdc | FileCheck %s -check-prefix=MCDCCTOR
28b2bdfbcSAlan Phipps // RUN: %clang_cc1 -triple %itanium_abi_triple %s -o - -emit-llvm -fprofile-instrument=clang -fcoverage-mapping -fcoverage-mcdc | FileCheck %s -check-prefix=MCDCDTOR
38b2bdfbcSAlan Phipps 
48b2bdfbcSAlan Phipps extern void foo();
58b2bdfbcSAlan Phipps extern void bar();
68b2bdfbcSAlan Phipps class Value {
78b2bdfbcSAlan Phipps   public:
88b2bdfbcSAlan Phipps     void setValue(int len);
98b2bdfbcSAlan Phipps     int getValue(void);
108b2bdfbcSAlan Phipps     Value();   // This is the constructor declaration
118b2bdfbcSAlan Phipps     ~Value();  // This is the destructor declaration
128b2bdfbcSAlan Phipps 
138b2bdfbcSAlan Phipps   private:
148b2bdfbcSAlan Phipps     int value;
158b2bdfbcSAlan Phipps };
168b2bdfbcSAlan Phipps 
178b2bdfbcSAlan Phipps // Member functions definitions including constructor
Value(void)188b2bdfbcSAlan Phipps Value::Value(void) {
198b2bdfbcSAlan Phipps   if (value != 2 || value != 6)
208b2bdfbcSAlan Phipps     foo();
218b2bdfbcSAlan Phipps }
~Value(void)228b2bdfbcSAlan Phipps Value::~Value(void) {
238b2bdfbcSAlan Phipps   if (value != 2 || value != 3)
248b2bdfbcSAlan Phipps     bar();
258b2bdfbcSAlan Phipps }
268b2bdfbcSAlan Phipps 
278b2bdfbcSAlan Phipps // MCDC BOOKKEEPING.
288b2bdfbcSAlan Phipps // MCDCCTOR: @__profbm__ZN5ValueC2Ev = private global [1 x i8] zeroinitializer
298b2bdfbcSAlan Phipps // MCDCCTOR: @__profc__ZN5ValueC2Ev = private global [4 x i64] zeroinitializer
308b2bdfbcSAlan Phipps 
318b2bdfbcSAlan Phipps // ALLOCATE MCDC TEMP AND ZERO IT.
328b2bdfbcSAlan Phipps // MCDCCTOR-LABEL: @_ZN5ValueC2Ev(
338b2bdfbcSAlan Phipps // MCDCCTOR: %mcdc.addr = alloca i32, align 4
348b2bdfbcSAlan Phipps // MCDCCTOR: store i32 0, ptr %mcdc.addr, align 4
358b2bdfbcSAlan Phipps 
368b2bdfbcSAlan Phipps // SHIFT FIRST CONDITION WITH ID = 0.
378b2bdfbcSAlan Phipps // MCDCCTOR:  %[[LAB1:[0-9]+]] = load i32, ptr %value, align 4
388b2bdfbcSAlan Phipps // MCDCCTOR-DAG:  %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 2
3971f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
4071f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 0
4171f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 0
4271f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
438b2bdfbcSAlan Phipps // MCDCCTOR-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
448b2bdfbcSAlan Phipps 
458b2bdfbcSAlan Phipps // SHIFT SECOND CONDITION WITH ID = 1.
468b2bdfbcSAlan Phipps // MCDCCTOR:  %[[LAB1:[0-9]+]] = load i32, ptr %value2, align 4
478b2bdfbcSAlan Phipps // MCDCCTOR-DAG:  %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 6
4871f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
4971f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 2
5071f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 1
5171f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
528b2bdfbcSAlan Phipps // MCDCCTOR-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
538b2bdfbcSAlan Phipps 
548b2bdfbcSAlan Phipps // UPDATE FINAL BITMASK WITH RESULT.
5571f8b441SNAKAMURA Takumi // MCDCCTOR-DAG:  %[[TEMP0:mcdc.temp[0-9]*]] = load i32, ptr %mcdc.addr, align 4
5671f8b441SNAKAMURA Takumi // MCDCCTOR:  %[[TEMP:[0-9]+]] = add i32 %[[TEMP0]], 0
578b2bdfbcSAlan Phipps // MCDCCTOR:  %[[LAB1:[0-9]+]] = lshr i32 %[[TEMP]], 3
58cc53707aSNAKAMURA Takumi // MCDCCTOR:  %[[LAB4:[0-9]+]] = getelementptr inbounds i8, ptr @__profbm__ZN5ValueC2Ev, i32 %[[LAB1]]
598b2bdfbcSAlan Phipps // MCDCCTOR:  %[[LAB5:[0-9]+]] = and i32 %[[TEMP]], 7
608b2bdfbcSAlan Phipps // MCDCCTOR:  %[[LAB6:[0-9]+]] = trunc i32 %[[LAB5]] to i8
618b2bdfbcSAlan Phipps // MCDCCTOR:  %[[LAB7:[0-9]+]] = shl i8 1, %[[LAB6]]
62*7ef2bd4eSNAKAMURA Takumi // MCDCCTOR:  %[[BITS:.+]] = load i8, ptr %[[LAB4]], align 1
63*7ef2bd4eSNAKAMURA Takumi // MCDCCTOR:  %[[LAB8:[0-9]+]] = or i8 %[[BITS]], %[[LAB7]]
648b2bdfbcSAlan Phipps // MCDCCTOR:  store i8 %[[LAB8]], ptr %[[LAB4]], align 1
658b2bdfbcSAlan Phipps 
668b2bdfbcSAlan Phipps // MCDCDTOR: @__profbm__ZN5ValueD2Ev = private global [1 x i8] zeroinitializer
678b2bdfbcSAlan Phipps // MCDCDTOR: @__profc__ZN5ValueD2Ev = private global [4 x i64] zeroinitializer
688b2bdfbcSAlan Phipps 
698b2bdfbcSAlan Phipps // ALLOCATE MCDC TEMP AND ZERO IT.
708b2bdfbcSAlan Phipps // MCDCDTOR-LABEL: @_ZN5ValueD2Ev(
718b2bdfbcSAlan Phipps // MCDCDTOR: %mcdc.addr = alloca i32, align 4
728b2bdfbcSAlan Phipps // MCDCDTOR: store i32 0, ptr %mcdc.addr, align 4
738b2bdfbcSAlan Phipps 
748b2bdfbcSAlan Phipps // SHIFT FIRST CONDITION WITH ID = 0.
758b2bdfbcSAlan Phipps // MCDCDTOR:  %[[LAB1:[0-9]+]] = load i32, ptr %value, align 4
768b2bdfbcSAlan Phipps // MCDCDTOR-DAG:  %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 2
7771f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
7871f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 0
7971f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 0
8071f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
818b2bdfbcSAlan Phipps // MCDCDTOR-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
828b2bdfbcSAlan Phipps 
838b2bdfbcSAlan Phipps // SHIFT SECOND CONDITION WITH ID = 1.
848b2bdfbcSAlan Phipps // MCDCDTOR:  %[[LAB1:[0-9]+]] = load i32, ptr %value2, align 4
858b2bdfbcSAlan Phipps // MCDCDTOR-DAG:  %[[BOOL:cmp[0-9]*]] = icmp ne i32 %[[LAB1]], 3
8671f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[TEMP:mcdc.*]] = load i32, ptr %mcdc.addr, align 4
8771f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[LAB2:[0-9]+]] = add i32 %[[TEMP]], 2
8871f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[LAB3:[0-9]+]] = add i32 %[[TEMP]], 1
8971f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[LAB4:[0-9]+]] = select i1 %[[BOOL]], i32 %[[LAB2]], i32 %[[LAB3]]
908b2bdfbcSAlan Phipps // MCDCDTOR-DAG:  store i32 %[[LAB4]], ptr %mcdc.addr, align 4
918b2bdfbcSAlan Phipps 
928b2bdfbcSAlan Phipps // UPDATE FINAL BITMASK WITH RESULT.
9371f8b441SNAKAMURA Takumi // MCDCDTOR-DAG:  %[[TEMP0:mcdc.temp[0-9]*]] = load i32, ptr %mcdc.addr, align 4
9471f8b441SNAKAMURA Takumi // MCDCDTOR:  %[[TEMP:[0-9]+]] = add i32 %[[TEMP0]], 0
958b2bdfbcSAlan Phipps // MCDCDTOR:  %[[LAB1:[0-9]+]] = lshr i32 %[[TEMP]], 3
96cc53707aSNAKAMURA Takumi // MCDCDTOR:  %[[LAB4:[0-9]+]] = getelementptr inbounds i8, ptr @__profbm__ZN5ValueD2Ev, i32 %[[LAB1]]
978b2bdfbcSAlan Phipps // MCDCDTOR:  %[[LAB5:[0-9]+]] = and i32 %[[TEMP]], 7
988b2bdfbcSAlan Phipps // MCDCDTOR:  %[[LAB6:[0-9]+]] = trunc i32 %[[LAB5]] to i8
998b2bdfbcSAlan Phipps // MCDCDTOR:  %[[LAB7:[0-9]+]] = shl i8 1, %[[LAB6]]
100*7ef2bd4eSNAKAMURA Takumi // MCDCDTOR:  %[[BITS:.+]] = load i8, ptr %[[LAB4]], align 1
101*7ef2bd4eSNAKAMURA Takumi // MCDCDTOR:  %[[LAB8:[0-9]+]] = or i8 %[[BITS]], %[[LAB7]]
1028b2bdfbcSAlan Phipps // MCDCDTOR:  store i8 %[[LAB8]], ptr %[[LAB4]], align 1
103