| // RUN: %clang_cc1 -triple x86_64-unknown-linux -fexperimental-call-graph-section -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s | |
| // Check that we generate callee_type metadata for indirect calls | |
| // to functions with internal linkage (e.g., types in anonymous namespaces), | |
| // using the generalized type metadata form. | |
| namespace { | |
| class a; | |
| class b { | |
| public: | |
| virtual void c(a); | |
| }; | |
| class a { | |
| public: | |
| b &e; | |
| void d() { e.c(*this); } | |
| }; | |
| void b::c(a) {} | |
| void f() { | |
| a *g = nullptr; | |
| g->d(); | |
| } | |
| } // namespace | |
| void test() { | |
| f(); | |
| } | |
| // CHECK-LABEL: define {{.*}} void @{{.*}}1a1dEv | |
| // CHECK: %[[VFN:.*]] = getelementptr inbounds ptr, ptr %{{.*}}, i{{[0-9]+}} 0 | |
| // CHECK: %[[FP:.*]] = load ptr, ptr %[[VFN]], align {{[0-9]+}} | |
| // CHECK: call void %[[FP]]({{.*}}), !callee_type [[HEX_TYPE:![0-9]+]] | |
| // CHECK: ret void | |
| // CHECK: [[HEX_TYPE]] = !{[[HEX_TYPE_INNER:![0-9]+]]} | |
| // CHECK: [[HEX_TYPE_INNER]] = !{!"_ZTSFvN12_GLOBAL__N_11aEE"} |