| 1 | // RUN: %clang_cc1 -triple=x86_64-pc-windows-msvc -debug-info-kind=limited \ |
| 2 | // RUN: -std=c++11 -gcodeview -emit-llvm -o - %s \ |
| 3 | // RUN: | FileCheck -check-prefix=NONEST %s |
| 4 | // RUN: %clang_cc1 -triple=x86_64-pc-windows-msvc -debug-info-kind=limited \ |
| 5 | // RUN: -std=c++11 -gcodeview -dwarf-column-info -emit-llvm -o - %s \ |
| 6 | // RUN: | FileCheck -check-prefix=COLUMNS %s |
| 7 | // RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -debug-info-kind=limited \ |
| 8 | // RUN: -std=c++11 -emit-llvm -o - %s | FileCheck -check-prefix=NESTED %s |
| 9 | // RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -debug-info-kind=limited \ |
| 10 | // RUN: -std=c++11 -dwarf-column-info -emit-llvm -o - %s \ |
| 11 | // RUN: | FileCheck -check-prefix=COLUMNS %s |
| 12 | |
| 13 | class Foo { |
| 14 | public: |
| 15 | static Foo create(); |
| 16 | void func(); |
| 17 | int *begin(); |
| 18 | int *end(); |
| 19 | }; |
| 20 | |
| 21 | int bar(int x, int y); |
| 22 | int baz(int x, int y); |
| 23 | int qux(int x, int y); |
| 24 | int onearg(int x); |
| 25 | int noargs(); |
| 26 | int noargs1(); |
| 27 | Foo range(int x); |
| 28 | |
| 29 | int foo(int x, int y, int z) { |
| 30 | int a = bar(x, y) + |
| 31 | baz(x, z) + |
| 32 | qux(y, z); |
| 33 | // NONEST: call i32 @{{.*}}bar{{.*}}, !dbg ![[LOC:[0-9]+]] |
| 34 | // NONEST: call i32 @{{.*}}baz{{.*}}, !dbg ![[LOC]] |
| 35 | // NONEST: call i32 @{{.*}}qux{{.*}}, !dbg ![[LOC]] |
| 36 | // NONEST: store i32 {{.*}}, i32* %a,{{.*}} !dbg ![[LOC]] |
| 37 | // NESTED: call i32 @{{.*}}bar{{.*}}, !dbg ![[BAR:[0-9]+]] |
| 38 | // NESTED: call i32 @{{.*}}baz{{.*}}, !dbg ![[BAZ:[0-9]+]] |
| 39 | // NESTED: call i32 @{{.*}}qux{{.*}}, !dbg ![[QUX:[0-9]+]] |
| 40 | // NESTED: store i32 {{.*}}, i32* %a,{{.*}} !dbg ![[BAR]] |
| 41 | // COLUMNS: call i32 @{{.*}}bar{{.*}}, !dbg ![[BAR:[0-9]+]] |
| 42 | // COLUMNS: call i32 @{{.*}}baz{{.*}}, !dbg ![[BAZ:[0-9]+]] |
| 43 | // COLUMNS: call i32 @{{.*}}qux{{.*}}, !dbg ![[QUX:[0-9]+]] |
| 44 | // COLUMNS: store i32 {{.*}}, i32* %a,{{.*}} !dbg ![[DECLA:[0-9]+]] |
| 45 | |
| 46 | int i = 1, b = 0, c = 0; |
| 47 | // NONEST: store i32 1, i32* %i,{{.*}} !dbg ![[ILOC:[0-9]+]] |
| 48 | // NONEST: store i32 0, i32* %b,{{.*}} !dbg ![[ILOC]] |
| 49 | // NONEST: store i32 0, i32* %c,{{.*}} !dbg ![[ILOC]] |
| 50 | // NESTED: store i32 1, i32* %i,{{.*}} !dbg ![[ILOC:[0-9]+]] |
| 51 | // NESTED: store i32 0, i32* %b,{{.*}} !dbg ![[ILOC]] |
| 52 | // NESTED: store i32 0, i32* %c,{{.*}} !dbg ![[ILOC]] |
| 53 | // COLUMNS: store i32 1, i32* %i,{{.*}} !dbg ![[ILOC:[0-9]+]] |
| 54 | // COLUMNS: store i32 0, i32* %b,{{.*}} !dbg ![[BLOC:[0-9]+]] |
| 55 | // COLUMNS: store i32 0, i32* %c,{{.*}} !dbg ![[CLOC:[0-9]+]] |
| 56 | |
| 57 | while (i > 0) { |
| 58 | b = bar(a, b); |
| 59 | --i; |
| 60 | } |
| 61 | // NONEST: call i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] |
| 62 | // NONEST: store i32 %{{[^,]+}}, i32* %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] |
| 63 | // NESTED: call i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] |
| 64 | // NESTED: store i32 %{{[^,]+}}, i32* %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] |
| 65 | // COLUMNS: call i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] |
| 66 | // COLUMNS: store i32 %{{[^,]+}}, i32* %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] |
| 67 | |
| 68 | for (i = 0; i < 1; i++) { |
| 69 | b = bar(a, b); |
| 70 | c = qux(a, c); |
| 71 | } |
| 72 | // NONEST: call i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] |
| 73 | // NONEST: call i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] |
| 74 | // NESTED: call i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] |
| 75 | // NESTED: call i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] |
| 76 | // COLUMNS: call i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] |
| 77 | // COLUMNS: call i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] |
| 78 | |
| 79 | if (a < b) { |
| 80 | int t = a; |
| 81 | a = b; |
| 82 | b = t; |
| 83 | } |
| 84 | // NONEST: store i32 %{{[^,]+}}, i32* %t,{{.*}} !dbg ![[IF1:[0-9]+]] |
| 85 | // NONEST: store i32 %{{[^,]+}}, i32* %a,{{.*}} !dbg ![[IF2:[0-9]+]] |
| 86 | // NONEST: store i32 %{{[^,]+}}, i32* %b,{{.*}} !dbg ![[IF3:[0-9]+]] |
| 87 | // NESTED: store i32 %{{[^,]+}}, i32* %t,{{.*}} !dbg ![[IF1:[0-9]+]] |
| 88 | // NESTED: store i32 %{{[^,]+}}, i32* %a,{{.*}} !dbg ![[IF2:[0-9]+]] |
| 89 | // NESTED: store i32 %{{[^,]+}}, i32* %b,{{.*}} !dbg ![[IF3:[0-9]+]] |
| 90 | // COLUMNS: store i32 %{{[^,]+}}, i32* %t,{{.*}} !dbg ![[IF1:[0-9]+]] |
| 91 | // COLUMNS: store i32 %{{[^,]+}}, i32* %a,{{.*}} !dbg ![[IF2:[0-9]+]] |
| 92 | // COLUMNS: store i32 %{{[^,]+}}, i32* %b,{{.*}} !dbg ![[IF3:[0-9]+]] |
| 93 | |
| 94 | int d = onearg( |
| 95 | noargs()); |
| 96 | // NONEST: call i32 @{{.*}}noargs{{.*}}, !dbg ![[DECLD:[0-9]+]] |
| 97 | // NONEST: call i32 @{{.*}}onearg{{.*}}, !dbg ![[DECLD]] |
| 98 | // NONEST: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD]] |
| 99 | // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[DNOARGS:[0-9]+]] |
| 100 | // NESTED: call i32 @{{.*}}onearg{{.*}}, !dbg ![[DECLD:[0-9]+]] |
| 101 | // NESTED: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD]] |
| 102 | // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[DNOARGS:[0-9]+]] |
| 103 | // COLUMNS: call i32 @{{.*}}onearg{{.*}}, !dbg ![[DONEARG:[0-9]+]] |
| 104 | // COLUMNS: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD:[0-9]+]] |
| 105 | |
| 106 | d = onearg(noargs()); |
| 107 | // NONEST: call i32 @{{.*}}noargs{{.*}}, !dbg ![[SETD:[0-9]+]] |
| 108 | // NONEST: call i32 @{{.*}}onearg{{.*}}, !dbg ![[SETD]] |
| 109 | // NONEST: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[SETD]] |
| 110 | // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[SETD:[0-9]+]] |
| 111 | // NESTED: call i32 @{{.*}}onearg{{.*}}, !dbg ![[SETD]] |
| 112 | // NESTED: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[SETD]] |
| 113 | // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[SETDNOARGS:[0-9]+]] |
| 114 | // COLUMNS: call i32 @{{.*}}onearg{{.*}}, !dbg ![[SETDONEARG:[0-9]+]] |
| 115 | // COLUMNS: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[SETD:[0-9]+]] |
| 116 | |
| 117 | for (const auto x : range(noargs())) noargs1(); |
| 118 | // NONEST: call i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR:[0-9]+]] |
| 119 | // NONEST: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR]] |
| 120 | // NONEST: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] |
| 121 | // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR:[0-9]+]] |
| 122 | // NESTED: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR]] |
| 123 | // NESTED: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] |
| 124 | // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR_NOARGS:[0-9]+]] |
| 125 | // COLUMNS: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR_RANGE:[0-9]+]] |
| 126 | // COLUMNS: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] |
| 127 | |
| 128 | if (noargs() && noargs1()) { |
| 129 | Foo::create().func(); |
| 130 | } |
| 131 | // NONEST: call i32 @{{.*}}noargs{{.*}}, !dbg ![[AND:[0-9]+]] |
| 132 | // NONEST: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[AND]] |
| 133 | // NONEST: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_BODY:[0-9]+]] |
| 134 | // NONEST: call void @{{.*}}func{{.*}}, !dbg ![[AND_BODY]] |
| 135 | // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[AND:[0-9]+]] |
| 136 | // NESTED: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[AND]] |
| 137 | // NESTED: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_BODY:[0-9]+]] |
| 138 | // NESTED: call void @{{.*}}func{{.*}}, !dbg ![[AND_BODY]] |
| 139 | // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[ANDLHS:[0-9]+]] |
| 140 | // COLUMNS: call i32 @{{.*}}noargs1{{.*}}, !dbg ![[ANDRHS:[0-9]+]] |
| 141 | // COLUMNS: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_CREATE:[0-9]+]] |
| 142 | // COLUMNS: call void @{{.*}}func{{.*}}, !dbg ![[AND_FUNC:[0-9]+]] |
| 143 | |
| 144 | return a - |
| 145 | (b * z); |
| 146 | // NONEST: mul nsw i32 {{.*}}, !dbg ![[RETLOC:[0-9]+]] |
| 147 | // NONEST: sub nsw i32 {{.*}}, !dbg ![[RETLOC]] |
| 148 | // NONEST: ret i32 {{.*}}, !dbg ![[RETLOC]] |
| 149 | // NESTED: mul nsw i32 {{.*}}, !dbg ![[RETMUL:[0-9]+]] |
| 150 | // NESTED: sub nsw i32 {{.*}}, !dbg ![[RETSUB:[0-9]+]] |
| 151 | // NESTED: ret i32 {{.*}}, !dbg ! |
| 152 | // COLUMNS: mul nsw i32 {{.*}}, !dbg ![[RETMUL:[0-9]+]] |
| 153 | // COLUMNS: sub nsw i32 {{.*}}, !dbg ![[RETSUB:[0-9]+]] |
| 154 | // COLUMNS: ret i32 {{.*}}, !dbg ! |
| 155 | } |
| 156 | |
| 157 | // NONEST: ![[WHILE1]] = !DILocation( |
| 158 | // NONEST: ![[WHILE2]] = !DILocation( |
| 159 | // NONEST: ![[FOR1]] = !DILocation( |
| 160 | // NONEST: ![[FOR2]] = !DILocation( |
| 161 | // NONEST: ![[IF1]] = !DILocation( |
| 162 | // NONEST: ![[IF2]] = !DILocation( |
| 163 | // NONEST: ![[IF3]] = !DILocation( |
| 164 | // NONEST: ![[RANGEFOR]] = !DILocation( |
| 165 | // NONEST-SAME: line: [[RANGEFOR_LINE:[0-9]+]] |
| 166 | // NONEST: ![[RANGEFOR_BODY]] = !DILocation( |
| 167 | // NONEST-SAME: line: [[RANGEFOR_LINE]] |
| 168 | |
| 169 | // NESTED: ![[BAR]] = !DILocation( |
| 170 | // NESTED: ![[BAZ]] = !DILocation( |
| 171 | // NESTED: ![[QUX]] = !DILocation( |
| 172 | // NESTED: ![[DECLD]] = !DILocation |
| 173 | // NESTED: ![[DNOARGS]] = !DILocation |
| 174 | // NESTED: ![[RANGEFOR]] = !DILocation( |
| 175 | // NESTED-SAME: line: [[RANGEFOR_LINE:[0-9]+]] |
| 176 | // NESTED: ![[RANGEFOR_BODY]] = !DILocation( |
| 177 | // NESTED-SAME: line: [[RANGEFOR_LINE]] |
| 178 | // NESTED: ![[RETSUB]] = !DILocation( |
| 179 | // NESTED: ![[RETMUL]] = !DILocation( |
| 180 | |
| 181 | // COLUMNS: ![[DECLA]] = !DILocation( |
| 182 | // COLUMNS: ![[BAR]] = !DILocation( |
| 183 | // COLUMNS: ![[BAZ]] = !DILocation( |
| 184 | // COLUMNS: ![[QUX]] = !DILocation( |
| 185 | // COLUMNS: ![[ILOC]] = !DILocation( |
| 186 | // COLUMNS: ![[BLOC]] = !DILocation( |
| 187 | // COLUMNS: ![[CLOC]] = !DILocation( |
| 188 | // COLUMNS: ![[DECLD]] = !DILocation( |
| 189 | // COLUMNS: ![[DNOARGS]] = !DILocation( |
| 190 | // COLUMNS: ![[DONEARG]] = !DILocation( |
| 191 | // COLUMNS: ![[SETDNOARGS]] = !DILocation( |
| 192 | // COLUMNS: ![[SETDONEARG]] = !DILocation( |
| 193 | // COLUMNS: ![[SETD]] = !DILocation( |
| 194 | // COLUMNS: ![[RANGEFOR_NOARGS]] = !DILocation( |
| 195 | // COLUMNS: ![[RANGEFOR_RANGE]] = !DILocation( |
| 196 | // COLUMNS: ![[RANGEFOR_BODY]] = !DILocation( |
| 197 | // COLUMNS: ![[ANDLHS]] = !DILocation |
| 198 | // COLUMNS: ![[ANDRHS]] = !DILocation |
| 199 | // COLUMNS: ![[AND_CREATE]] = !DILocation |
| 200 | // COLUMNS: ![[AND_FUNC]] = !DILocation |
| 201 | // COLUNMS: ![[RETSUB]] = !DILocation( |
| 202 | // COLUMNS: ![[RETMUL]] = !DILocation( |
| 203 | |