| // Tests for instrumentation of C++ constructors and destructors. |
| // |
| // RUN: %clang_cc1 -triple x86_64-apple-macosx10.11.0 -x c++ %s -o %t -emit-llvm -fprofile-instrument=clang |
| // RUN: FileCheck %s -input-file=%t -check-prefix=INSTR |
| // RUN: FileCheck %s -input-file=%t -check-prefix=NOINSTR |
| |
| struct Foo { |
| Foo() {} |
| Foo(int) {} |
| ~Foo() {} |
| }; |
| |
| struct Bar : public Foo { |
| Bar() {} |
| Bar(int x) : Foo(x) {} |
| ~Bar(); |
| }; |
| |
| struct Baz : virtual public Foo { |
| Baz() {} |
| Baz(int x) : Foo(x) {} |
| ~Baz(); |
| }; |
| |
| struct Quux : public Foo { |
| Quux(const char *y, ...) : Foo(0) {} |
| }; |
| |
| Foo foo; |
| Foo foo2(1); |
| Bar bar; |
| Baz baz; |
| Baz baz2(1); |
| Quux qux("fi", "fo", "fum"); |
| |
| // Profile data for complete constructors and destructors must be absent. |
| |
| // INSTR: @__profc__ZN3BazC1Ev = |
| // INSTR: @__profc__ZN3BazC1Ei = |
| // INSTR: @__profc__ZN4QuuxC1EPKcz = |
| // INSTR: @__profc_main = |
| // INSTR: @__profc__ZN3FooC2Ev = |
| // INSTR: @__profc__ZN3FooD2Ev = |
| // INSTR: @__profc__ZN3FooC2Ei = |
| // INSTR: @__profc__ZN3BarC2Ev = |
| |
| // NOINSTR-NOT: @__profc__ZN3FooC1Ev |
| // NOINSTR-NOT: @__profc__ZN3FooC1Ei |
| // NOINSTR-NOT: @__profc__ZN3FooD1Ev |
| // NOINSTR-NOT: @__profc__ZN3BarC1Ev |
| // NOINSTR-NOT: @__profc__ZN3BarD1Ev |
| // NOINSTR-NOT: @__profc__ZN3FooD1Ev |
| |
| int main() { |
| } |