There are some limitations with emitting regions in macro expansions because we don't gather file IDs within the expansions. Fix the check that prevents us from emitting deferred regions in expansions to make an exception for headers, which is something we can handle. rdar://35373009 llvm-svn: 317760
205 lines
4.4 KiB
C++
205 lines
4.4 KiB
C++
// RUN: %clang_cc1 -std=c++11 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -fexceptions -fcxx-exceptions -emit-llvm-only -triple %itanium_abi_triple -main-file-name deferred-region.cpp -I %S/Inputs %s | FileCheck %s
|
|
|
|
#define IF if
|
|
#define STMT(S) S
|
|
|
|
// CHECK-LABEL: _Z3fooi:
|
|
void foo(int x) {
|
|
if (x == 0) {
|
|
return;
|
|
} // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:2 = (#0 - #1)
|
|
|
|
}
|
|
|
|
// CHECK-NEXT: _Z4foooi:
|
|
void fooo(int x) {
|
|
if (x == 0) {
|
|
return;
|
|
} // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:3 = (#0 - #1)
|
|
|
|
if (x == 1) {
|
|
return;
|
|
} // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:2 = ((#0 - #1) - #2)
|
|
|
|
}
|
|
|
|
// CHECK-LABEL: _Z3bazv:
|
|
void baz() { // CHECK: [[@LINE]]:12 -> [[@LINE+2]]:2
|
|
return; // CHECK-NOT: File
|
|
}
|
|
|
|
// CHECK-LABEL: _Z3mazv:
|
|
void maz() {
|
|
if (true)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
|
|
|
|
return; // CHECK-NOT: Gap
|
|
}
|
|
|
|
// CHECK-LABEL: _Z4maazv:
|
|
void maaz() {
|
|
if (true)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:11
|
|
else
|
|
return; // CHECK-NOT: Gap,File 0, [[@LINE]]
|
|
}
|
|
|
|
// CHECK-LABEL: _Z5maaazv:
|
|
void maaaz() {
|
|
if (true) {
|
|
return;
|
|
} else { // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE]]:10
|
|
return; // CHECK-NOT: Gap,File 0, [[@LINE]]
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: _Z3bari:
|
|
void bar(int x) {
|
|
IF (x)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
|
|
|
|
IF (!x)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = ((#0 - #1) - #2)
|
|
|
|
foo(x);
|
|
}
|
|
|
|
// CHECK-LABEL: _Z4quuxi:
|
|
// Deferred regions are not emitted within macro expansions.
|
|
void quux(int x) {
|
|
STMT(
|
|
if (x == 0)
|
|
return;)
|
|
|
|
// CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+2]]
|
|
|
|
if (x == 1)
|
|
STMT(return;)
|
|
|
|
// CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+3]]
|
|
|
|
STMT(
|
|
if (x == 2)
|
|
return;
|
|
|
|
// CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+2]]
|
|
|
|
if (x == 3)
|
|
return;
|
|
)
|
|
}
|
|
|
|
// CHECK-LABEL: _Z8weird_ifv:
|
|
void weird_if() {
|
|
int i = 0;
|
|
|
|
if (false)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
|
|
|
|
if (false)
|
|
i++;
|
|
|
|
if (i + 100 > 0) { // CHECK: [[@LINE]]:20 -> [[@LINE+6]]:4 = #3
|
|
if (false) // CHECK: [[@LINE+1]]:7 -> [[@LINE+1]]:13 = #4
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:13 -> [[@LINE+2]]:5 = (#3 - #4)
|
|
// CHECK: [[@LINE+1]]:5 -> [[@LINE+3]]:4 = (#3 - #4)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:5 -> [[@LINE+4]]:3 = ((#0 - #1) - #3)
|
|
|
|
}
|
|
|
|
if (false)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+1]]:2
|
|
}
|
|
|
|
// CHECK-LABEL: _Z8for_loopv:
|
|
void for_loop() {
|
|
if (false)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
|
|
|
|
for (int i = 0; i < 10; ++i) {
|
|
if (i % 2 == 0)
|
|
continue; // CHECK: Gap,File 0, [[@LINE]]:15 -> [[@LINE+2]]:5 = (#2 - #3)
|
|
|
|
if (i % 5 == 0)
|
|
break; // CHECK: Gap,File 0, [[@LINE]]:12 -> [[@LINE+2]]:5 = ((#2 - #3) - #4)
|
|
|
|
int x = i; // CHECK: [[@LINE]]:5 -> [[@LINE+3]]:4 = ((#2 - #3) - #4)
|
|
return; // CHECK-NOT: [[@LINE]]:11 -> [[@LINE+2]]
|
|
|
|
}
|
|
}
|
|
|
|
struct Error {};
|
|
|
|
// CHECK-LABEL: _Z10while_loopv:
|
|
void while_loop() {
|
|
if (false)
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
|
|
|
|
int x = 0;
|
|
while (++x < 10) {
|
|
if (x == 1)
|
|
continue; // CHECK: Gap,File 0, [[@LINE]]:15 -> [[@LINE+2]]:5 = (#2 - #3)
|
|
|
|
while (++x < 4) {
|
|
if (x == 3)
|
|
break; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+2]]:7 = (#4 - #5)
|
|
|
|
while (++x < 5) {}
|
|
}
|
|
|
|
if (x == 0)
|
|
throw Error(); // CHECK: Gap,File 0, [[@LINE]]:20 -> [[@LINE+2]]:5 = ((#2 - #3) - #7)
|
|
|
|
while (++x < 9) {
|
|
if (x == 0)
|
|
break; // CHECK-NOT: [[@LINE]]:14 -> [[@LINE+2]]
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: _Z5gotosv:
|
|
void gotos() {
|
|
if (false)
|
|
goto out; // CHECK: Gap,File 0, [[@LINE]]:13 -> [[@LINE+2]]:3 = (#0 - #1)
|
|
|
|
return; // CHECK: [[@LINE]]:3 -> [[@LINE+4]]:2 = (#0 - #1)
|
|
|
|
out:
|
|
return; // CHECK: Gap,File 0, [[@LINE]]:8 -> [[@LINE+1]]:2 = 0
|
|
}
|
|
|
|
#include "deferred-region-helper.h"
|
|
// CHECK-LABEL: _Z13included_funcv:
|
|
// CHECK: Gap,File 0, 2:13 -> 3:5 = #1
|
|
// CHECK: Gap,File 0, 3:11 -> 4:3 = (#0 - #1)
|
|
|
|
// CHECK-LABEL: _Z7includev:
|
|
void include() {
|
|
included_func();
|
|
}
|
|
|
|
int main() {
|
|
foo(0);
|
|
foo(1);
|
|
fooo(0);
|
|
fooo(1);
|
|
maz();
|
|
maaz();
|
|
maaaz();
|
|
baz();
|
|
bar(0);
|
|
bar(1);
|
|
quux(0);
|
|
quux(1);
|
|
quux(2);
|
|
quux(3);
|
|
weird_if();
|
|
for_loop();
|
|
while_loop();
|
|
gotos();
|
|
include();
|
|
return 0;
|
|
}
|