94 lines · c
1// Tests that we assign appropriate identifiers to indirect calls and targets.2 3// RUN: %clang_cc1 -triple x86_64-unknown-linux -fexperimental-call-graph-section \4// RUN: -emit-llvm -o - %s | FileCheck --check-prefixes=CHECK,ITANIUM %s5 6// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -fexperimental-call-graph-section \7// RUN: -emit-llvm -o - %s | FileCheck --check-prefixes=CHECK,MS %s8 9// CHECK-LABEL: define {{(dso_local)?}} void @foo(10// CHECK-SAME: {{.*}} !type [[F_TVOID:![0-9]+]]11void foo() {12}13 14// CHECK-LABEL: define {{(dso_local)?}} void @bar(15// CHECK-SAME: {{.*}} !type [[F_TVOID]]16void bar() {17 void (*fp)() = foo;18 // ITANIUM: call {{.*}}, !callee_type [[F_TVOID_CT:![0-9]+]]19 // MS: call {{.*}}, !callee_type [[F_TVOID_CT:![0-9]+]]20 fp();21}22 23// CHECK-LABEL: define {{(dso_local)?}} i32 @baz(24// CHECK-SAME: {{.*}} !type [[F_TPRIMITIVE:![0-9]+]]25int baz(char a, float b, double c) {26 return 1;27}28 29// CHECK-LABEL: define {{(dso_local)?}} ptr @qux(30// CHECK-SAME: {{.*}} !type [[F_TPTR:![0-9]+]]31int *qux(char *a, float *b, double *c) {32 return 0;33}34 35// CHECK-LABEL: define {{(dso_local)?}} void @corge(36// CHECK-SAME: {{.*}} !type [[F_TVOID]]37void corge() {38 int (*fp_baz)(char, float, double) = baz; 39 // CHECK: call i32 {{.*}}, !callee_type [[F_TPRIMITIVE_CT:![0-9]+]]40 fp_baz('a', .0f, .0);41 42 int *(*fp_qux)(char *, float *, double *) = qux; 43 // CHECK: call ptr {{.*}}, !callee_type [[F_TPTR_CT:![0-9]+]]44 fp_qux(0, 0, 0);45}46 47struct st1 {48 int *(*fp)(char *, float *, double *);49};50 51struct st2 {52 struct st1 m;53};54 55// CHECK-LABEL: define {{(dso_local)?}} void @stparam(56// CHECK-SAME: {{.*}} !type [[F_TSTRUCT:![0-9]+]]57void stparam(struct st2 a, struct st2 *b) {}58 59// CHECK-LABEL: define {{(dso_local)?}} void @stf(60// CHECK-SAME: {{.*}} !type [[F_TVOID]]61void stf() {62 struct st1 St1;63 St1.fp = qux; 64 // CHECK: call ptr {{.*}}, !callee_type [[F_TPTR_CT:![0-9]+]]65 St1.fp(0, 0, 0);66 67 struct st2 St2;68 St2.m.fp = qux; 69 // CHECK: call ptr {{.*}}, !callee_type [[F_TPTR_CT:![0-9]+]]70 St2.m.fp(0, 0, 0);71 72 // CHECK: call void {{.*}}, !callee_type [[F_TSTRUCT_CT:![0-9]+]]73 void (*fp_stparam)(struct st2, struct st2 *) = stparam;74 fp_stparam(St2, &St2);75}76 77// ITANIUM: [[F_TVOID]] = !{i64 0, !"_ZTSFvE.generalized"}78// ITANIUM: [[F_TVOID_CT]] = !{[[F_TVOID:![0-9]+]]}79// ITANIUM: [[F_TPRIMITIVE]] = !{i64 0, !"_ZTSFicfdE.generalized"}80// ITANIUM: [[F_TPTR]] = !{i64 0, !"_ZTSFPiPcPfPdE.generalized"}81// ITANIUM: [[F_TPRIMITIVE_CT]] = !{[[F_TPRIMITIVE:![0-9]+]]}82// ITANIUM: [[F_TPTR_CT]] = !{[[F_TPTR:![0-9]+]]}83// ITANIUM: [[F_TSTRUCT]] = !{i64 0, !"_ZTSFv3st2PS_E.generalized"}84// ITANIUM: [[F_TSTRUCT_CT]] = !{[[F_TSTRUCT:![0-9]+]]}85 86// MS: [[F_TVOID]] = !{i64 0, !"?6AX@Z.generalized"}87// MS: [[F_TVOID_CT]] = !{[[F_TVOID:![0-9]+]]}88// MS: [[F_TPRIMITIVE]] = !{i64 0, !"?6AHDMN@Z.generalized"}89// MS: [[F_TPTR]] = !{i64 0, !"?6APEAHPEADPEAMPEAN@Z.generalized"}90// MS: [[F_TPRIMITIVE_CT]] = !{[[F_TPRIMITIVE:![0-9]+]]}91// MS: [[F_TPTR_CT]] = !{[[F_TPTR:![0-9]+]]}92// MS: [[F_TSTRUCT]] = !{i64 0, !"?6AXUst2@@PEAU0@@Z.generalized"}93// MS: [[F_TSTRUCT_CT]] = !{[[F_TSTRUCT:![0-9]+]]}94