brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 69cdd59 Raw
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