| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 1 | // RUN: %clang_esan_frag -O0 %s -DPART1 -c -o %t-part1.o 2>&1 |
| 2 | // RUN: %clang_esan_frag -O0 %s -DPART2 -c -o %t-part2.o 2>&1 |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 3 | // RUN: %clang_esan_frag -O0 %s -DMAIN -c -o %t-main.o 2>&1 |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 4 | // RUN: %clang_esan_frag -O0 %t-part1.o %t-part2.o %t-main.o -o %t 2>&1 |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 5 | // RUN: %env_esan_opts=verbosity=2 %run %t 2>&1 | FileCheck %s |
| 6 | |
| 7 | // We generate two different object files from this file with different |
| 8 | // macros, and then link them together. We do this to test how we handle |
| 9 | // separate compilation with multiple compilation units. |
| 10 | |
| 11 | #include <stdio.h> |
| 12 | |
| 13 | extern "C" { |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 14 | void part1(); |
| 15 | void part2(); |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 16 | } |
| 17 | |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 18 | //===-- compilation unit part1 without main function ----------------------===// |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 19 | |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 20 | #ifdef PART1 |
| 21 | struct A { |
| 22 | int x; |
| 23 | int y; |
| 24 | }; |
| 25 | |
| 26 | struct B { |
| 27 | float m; |
| 28 | double n; |
| 29 | }; |
| 30 | |
| 31 | union U { |
| 32 | float f; |
| 33 | double d; |
| 34 | }; |
| 35 | |
| 36 | // Same struct in both main and part1. |
| 37 | struct S { |
| 38 | int s1; |
| 39 | int s2; |
| 40 | }; |
| 41 | |
| 42 | // Different structs with the same name in main and part1. |
| 43 | struct D { |
| 44 | int d1; |
| 45 | int d2; |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 46 | struct { |
| 47 | int x; |
| 48 | int y; |
| 49 | int z; |
| 50 | } ds[10]; |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 51 | }; |
| 52 | |
| 53 | void part1() |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 54 | { |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 55 | struct A a; |
| 56 | struct B b; |
| 57 | union U u; |
| 58 | struct S s; |
| 59 | struct D d; |
| 60 | for (int i = 0; i < (1 << 11); i++) |
| 61 | a.x = 0; |
| 62 | a.y = 1; |
| 63 | b.m = 2.0; |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 64 | for (int i = 0; i < (1 << 21); i++) { |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 65 | b.n = 3.0; |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 66 | d.ds[3].y = 0; |
| 67 | } |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 68 | u.f = 0.0; |
| 69 | u.d = 1.0; |
| 70 | s.s1 = 0; |
| 71 | d.d1 = 0; |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 72 | } |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 73 | #endif // PART1 |
| 74 | |
| 75 | //===-- compilation unit part2 without main function ----------------------===// |
| 76 | #ifdef PART2 |
| 77 | // No struct in this part. |
| 78 | void part2() |
| 79 | { |
| 80 | // do nothing |
| 81 | } |
| 82 | #endif // PART2 |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 83 | |
| 84 | //===-- compilation unit with main function -------------------------------===// |
| 85 | |
| 86 | #ifdef MAIN |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 87 | class C { |
| 88 | public: |
| 89 | struct { |
| 90 | int x; |
| 91 | int y; |
| 92 | } cs; |
| 93 | union { |
| 94 | float f; |
| 95 | double d; |
| 96 | } cu; |
| 97 | char c[10]; |
| 98 | }; |
| 99 | |
| 100 | // Same struct in both main and part1. |
| 101 | struct S { |
| 102 | int s1; |
| 103 | int s2; |
| 104 | }; |
| 105 | |
| 106 | // Different structs with the same name in main and part1. |
| 107 | struct D { |
| 108 | int d1; |
| 109 | int d2; |
| 110 | int d3; |
| 111 | }; |
| 112 | |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 113 | int main(int argc, char **argv) { |
| 114 | // CHECK: in esan::initializeLibrary |
| Qin Zhao | 7e4933f | 2016-05-25 17:49:00 +0000 | [diff] [blame] | 115 | // CHECK: in esan::initializeCacheFrag |
| 116 | // CHECK-NEXT: in esan::processCompilationUnitInit |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 117 | // CHECK-NEXT: in esan::processCacheFragCompilationUnitInit: {{.*}}struct-simple.cpp with 6 class(es)/struct(s) |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 118 | // CHECK-NEXT: Register struct.A#2#11#11: 2 fields |
| 119 | // CHECK-NEXT: Register struct.B#2#3#2: 2 fields |
| 120 | // CHECK-NEXT: Register union.U#1#3: 1 fields |
| 121 | // CHECK-NEXT: Register struct.S#2#11#11: 2 fields |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 122 | // CHECK-NEXT: Register struct.D#3#14#11#11: 3 fields |
| 123 | // CHECK-NEXT: Register struct.anon#3#11#11#11: 3 fields |
| Qin Zhao | 7e4933f | 2016-05-25 17:49:00 +0000 | [diff] [blame] | 124 | // CHECK-NEXT: in esan::processCompilationUnitInit |
| Qin Zhao | 9e39638 | 2016-05-31 21:27:39 +0000 | [diff] [blame] | 125 | // CHECK-NEXT: in esan::processCacheFragCompilationUnitInit: {{.*}}struct-simple.cpp with 0 class(es)/struct(s) |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 126 | // CHECK-NEXT: in esan::processCompilationUnitInit |
| 127 | // CHECK-NEXT: in esan::processCacheFragCompilationUnitInit: {{.*}}struct-simple.cpp with 5 class(es)/struct(s) |
| 128 | // CHECK-NEXT: Register class.C#3#14#13#13: 3 fields |
| 129 | // CHECK-NEXT: Register struct.anon#2#11#11: 2 fields |
| 130 | // CHECK-NEXT: Register union.anon#1#3: 1 fields |
| 131 | // CHECK-NEXT: Duplicated struct.S#2#11#11: 2 fields |
| 132 | // CHECK-NEXT: Register struct.D#3#11#11#11: 3 fields |
| 133 | struct C c[2]; |
| 134 | struct S s; |
| 135 | struct D d; |
| 136 | c[0].cs.x = 0; |
| 137 | c[1].cs.y = 1; |
| 138 | c[0].cu.f = 0.0; |
| 139 | c[1].cu.d = 1.0; |
| 140 | c[0].c[2] = 0; |
| 141 | s.s1 = 0; |
| 142 | d.d1 = 0; |
| 143 | d.d2 = 0; |
| 144 | part1(); |
| 145 | part2(); |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 146 | return 0; |
| Qin Zhao | 7e4933f | 2016-05-25 17:49:00 +0000 | [diff] [blame] | 147 | // CHECK: in esan::finalizeLibrary |
| 148 | // CHECK-NEXT: in esan::finalizeCacheFrag |
| Qin Zhao | 7e4933f | 2016-05-25 17:49:00 +0000 | [diff] [blame] | 149 | // CHECK-NEXT: in esan::processCompilationUnitExit |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 150 | // CHECK-NEXT: in esan::processCacheFragCompilationUnitExit: {{.*}}struct-simple.cpp with 5 class(es)/struct(s) |
| 151 | // CHECK-NEXT: Unregister class.C#3#14#13#13: 3 fields |
| Qin Zhao | bc929e4 | 2016-06-03 20:48:17 +0000 | [diff] [blame] | 152 | // CHECK-NEXT: {{.*}} class C |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 153 | // CHECK-NEXT: {{.*}} size = 32, count = 5, ratio = 3, array access = 5 |
| Qin Zhao | e24bc36 | 2016-06-17 04:50:11 +0000 | [diff] [blame] | 154 | // CHECK-NEXT: {{.*}} # 0: offset = 0, size = 8, count = 2, type = %struct.anon = type { i32, i32 } |
| 155 | // CHECK-NEXT: {{.*}} # 1: offset = 8, size = 8, count = 2, type = %union.anon = type { double } |
| 156 | // CHECK-NEXT: {{.*}} # 2: offset = 16, size = 10, count = 1, type = [10 x i8] |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 157 | // CHECK-NEXT: Unregister struct.anon#2#11#11: 2 fields |
| Qin Zhao | bc929e4 | 2016-06-03 20:48:17 +0000 | [diff] [blame] | 158 | // CHECK-NEXT: {{.*}} struct anon |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 159 | // CHECK-NEXT: {{.*}} size = 8, count = 2, ratio = 1, array access = 0 |
| Qin Zhao | e24bc36 | 2016-06-17 04:50:11 +0000 | [diff] [blame] | 160 | // CHECK-NEXT: {{.*}} # 0: offset = 0, size = 4, count = 1, type = i32 |
| 161 | // CHECK-NEXT: {{.*}} # 1: offset = 4, size = 4, count = 1, type = i32 |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 162 | // CHECK-NEXT: Unregister union.anon#1#3: 1 fields |
| 163 | // CHECK-NEXT: Unregister struct.S#2#11#11: 2 fields |
| Qin Zhao | bc929e4 | 2016-06-03 20:48:17 +0000 | [diff] [blame] | 164 | // CHECK-NEXT: {{.*}} struct S |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 165 | // CHECK-NEXT: {{.*}} size = 8, count = 2, ratio = 2, array access = 0 |
| Qin Zhao | e24bc36 | 2016-06-17 04:50:11 +0000 | [diff] [blame] | 166 | // CHECK-NEXT: {{.*}} # 0: offset = 0, size = 4, count = 2, type = i32 |
| 167 | // CHECK-NEXT: {{.*}} # 1: offset = 4, size = 4, count = 0, type = i32 |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 168 | // CHECK-NEXT: Unregister struct.D#3#11#11#11: 3 fields |
| Qin Zhao | bc929e4 | 2016-06-03 20:48:17 +0000 | [diff] [blame] | 169 | // CHECK-NEXT: {{.*}} struct D |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 170 | // CHECK-NEXT: {{.*}} size = 12, count = 2, ratio = 2, array access = 0 |
| Qin Zhao | e24bc36 | 2016-06-17 04:50:11 +0000 | [diff] [blame] | 171 | // CHECK-NEXT: {{.*}} # 0: offset = 0, size = 4, count = 1, type = i32 |
| 172 | // CHECK-NEXT: {{.*}} # 1: offset = 4, size = 4, count = 1, type = i32 |
| 173 | // CHECK-NEXT: {{.*}} # 2: offset = 8, size = 4, count = 0, type = i32 |
| Qin Zhao | 7e4933f | 2016-05-25 17:49:00 +0000 | [diff] [blame] | 174 | // CHECK-NEXT: in esan::processCompilationUnitExit |
| Qin Zhao | 9e39638 | 2016-05-31 21:27:39 +0000 | [diff] [blame] | 175 | // CHECK-NEXT: in esan::processCacheFragCompilationUnitExit: {{.*}}struct-simple.cpp with 0 class(es)/struct(s) |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 176 | // CHECK-NEXT: in esan::processCompilationUnitExit |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 177 | // CHECK-NEXT: in esan::processCacheFragCompilationUnitExit: {{.*}}struct-simple.cpp with 6 class(es)/struct(s) |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 178 | // CHECK-NEXT: Unregister struct.A#2#11#11: 2 fields |
| Qin Zhao | bc929e4 | 2016-06-03 20:48:17 +0000 | [diff] [blame] | 179 | // CHECK-NEXT: {{.*}} struct A |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 180 | // CHECK-NEXT: {{.*}} size = 8, count = 2049, ratio = 2048, array access = 0 |
| Qin Zhao | e24bc36 | 2016-06-17 04:50:11 +0000 | [diff] [blame] | 181 | // CHECK-NEXT: {{.*}} # 0: offset = 0, size = 4, count = 2048, type = i32 |
| 182 | // CHECK-NEXT: {{.*}} # 1: offset = 4, size = 4, count = 1, type = i32 |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 183 | // CHECK-NEXT: Unregister struct.B#2#3#2: 2 fields |
| Qin Zhao | bc929e4 | 2016-06-03 20:48:17 +0000 | [diff] [blame] | 184 | // CHECK-NEXT: {{.*}} struct B |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 185 | // CHECK-NEXT: {{.*}} size = 16, count = 2097153, ratio = 2097152, array access = 0 |
| Qin Zhao | e24bc36 | 2016-06-17 04:50:11 +0000 | [diff] [blame] | 186 | // CHECK-NEXT: {{.*}} # 0: offset = 0, size = 4, count = 1, type = float |
| 187 | // CHECK-NEXT: {{.*}} # 1: offset = 8, size = 8, count = 2097152, type = double |
| Qin Zhao | 4175a6d | 2016-06-02 18:45:25 +0000 | [diff] [blame] | 188 | // CHECK-NEXT: Unregister union.U#1#3: 1 fields |
| 189 | // CHECK-NEXT: Duplicated struct.S#2#11#11: 2 fields |
| Qin Zhao | 91ea3fb | 2016-07-02 03:25:55 +0000 | [diff] [blame] | 190 | // CHECK-NEXT: Unregister struct.D#3#14#11#11: 3 fields |
| 191 | // CHECK-NEXT: {{.*}} struct D |
| 192 | // CHECK-NEXT: {{.*}} size = 128, count = 2097153, ratio = 2097153, array access = 0 |
| 193 | // CHECK-NEXT: {{.*}} # 0: offset = 0, size = 4, count = 1, type = i32 |
| 194 | // CHECK-NEXT: {{.*}} # 1: offset = 4, size = 4, count = 0, type = i32 |
| 195 | // CHECK-NEXT: {{.*}} # 2: offset = 8, size = 120, count = 2097152, type = [10 x %struct.anon] |
| 196 | // CHECK-NEXT: Unregister struct.anon#3#11#11#11: 3 fields |
| 197 | // CHECK-NEXT: {{.*}} struct anon |
| 198 | // CHECK-NEXT: {{.*}} size = 12, count = 2097152, ratio = 4194304, array access = 2097152 |
| 199 | // CHECK-NEXT: {{.*}} # 0: offset = 0, size = 4, count = 0, type = i32 |
| 200 | // CHECK-NEXT: {{.*}} # 1: offset = 4, size = 4, count = 2097152, type = i32 |
| 201 | // CHECK-NEXT: {{.*}} # 2: offset = 8, size = 4, count = 0, type = i32 |
| 202 | // CHECK-NEXT: {{.*}}EfficiencySanitizer: total struct field access count = 6293518 |
| Derek Bruening | 515c15c | 2016-05-24 23:03:52 +0000 | [diff] [blame] | 203 | } |
| 204 | #endif // MAIN |