Files
clang-p2996/llvm/test/tools/dsymutil/X86/DWARFLinkerParallel/odr-member-functions.cpp
Alexey Lapshin f1fdfe6888 [dsymutil][llvm-dwarfutil] Rename command line options to avoid using vendor names. (#78135)
This patch renames values of dsymutil/llvm-dwarfutil options:

--linker apple -> --linker classic
--linker llvm -> --linker parallel

The purpose to rename options is to avoid using vendor names and to
match with library names. It should be safe to rename options at current
stage as they are not seemed widely used(we may not preserve backward
compatibility).
2024-01-18 12:55:04 +03:00

193 lines
5.8 KiB
C++

/* Compile with:
for FILE in `seq 3`; do
clang -g -c odr-member-functions.cpp -DFILE$FILE -o
odr-member-functions/$FILE.o done
*/
// RUN: dsymutil --linker=parallel -f \
// RUN: -oso-prepend-path=%p/../../Inputs/odr-member-functions \
// RUN: -y %p/../dummy-debug-map.map -o %t1.out
// RUN: llvm-dwarfdump -debug-info %t1.out | FileCheck %s
struct S {
__attribute__((always_inline)) void foo() { bar(); }
__attribute__((always_inline)) void foo(int i) {
if (i)
bar();
}
void bar();
template <typename T> void baz(T t) {}
};
#ifdef FILE1
void foo() { S s; }
// First chack that types are moved into the type table unit.
// CHECK: TAG_compile_unit
// CHECK: AT_name{{.*}}"__artificial_type_unit"
// CHECK: 0x[[INT_BASE:[0-9a-f]*]]: DW_TAG_base_type
// CHECK-NEXT: DW_AT_name{{.*}}"int"
// CHECK: 0x[[PTR_S:[0-9a-f]*]]:{{.*}}DW_TAG_pointer_type
// CHECK-NEXT: DW_AT_type{{.*}}0x[[STRUCT_S:[0-9a-f]*]] "S")
// CHECK: 0x[[STRUCT_S]]:{{.*}}DW_TAG_structure_type
// CHECK-NEXT: DW_AT_name{{.*}}"S"
// CHECK: DW_TAG_subprogram
// CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3barEv"
// CHECK: DW_AT_name{{.*}}"bar"
// CHECK: DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *"
// CHECK: 0x[[BAZ_SUBPROGRAM:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
// CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3bazIiEEvT_"
// CHECK: DW_AT_name{{.*}}"baz<int>"
// CHECK: DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *"
// CHECK: DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int"
// CHECK: DW_TAG_template_type_parameter
// CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int"
// CHECK-NEXT: DW_AT_name{{.*}}"T"
// CHECK: 0x[[FOO_Ei:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
// CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEi"
// CHECK: DW_AT_name{{.*}}"foo"
// CHECK: DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *"
// CHECK: DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_type{{.*}}0x[[INT_BASE]] "int"
// CHECK: 0x[[FOO_Ev:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
// CHECK: DW_AT_MIPS_linkage_name{{.*}}"_ZN1S3fooEv"
// CHECK: DW_AT_name{{.*}}"foo"
// CHECK: DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_type{{.*}}0x[[PTR_S]] "S *"
// For the second unit check that it references structure "S"
// CHECK: TAG_compile_unit
// CHECK-NOT: {{DW_TAG|NULL}}
// CHECK: AT_name{{.*}}"odr-member-functions.cpp"
// CHECK: DW_TAG_subprogram
// CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
// CHECK-NEXT: AT_name{{.*}}"foo"
// CHECK: DW_TAG_variable
// CHECK: DW_AT_name{{.*}}"s"
// CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S"
#elif defined(FILE2)
void foo() {
S s;
// Check that the overloaded member functions are resolved correctly
s.foo();
s.foo(1);
}
// For the third unit check that it references member functions of structure S.
// CHECK: TAG_compile_unit
// CHECK-NOT: DW_TAG
// CHECK: AT_name{{.*}}"odr-member-functions.cpp"
// CHECK: 0x[[ABASE_FOO_Ev:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
// CHECK-NEXT: DW_AT_specification {{.*}}(0x00000000[[FOO_Ev]] "_ZN1S3fooEv"
// CHECK-NEXT: DW_AT_inline (DW_INL_inlined)
// CHECK-NEXT: DW_AT_object_pointer {{.*}}(0x[[ABASE_FOO_Ev_PARAM1:[0-9a-f]*]]
// CHECK: 0x[[ABASE_FOO_Ev_PARAM1]]:{{.*}}DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_name{{.*}}"this"
// CHECK-NEXT: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *"
// CHECK: 0x[[ABASE_FOO_Ei:[0-9a-f]*]]:{{.*}}DW_TAG_subprogram
// CHECK-NEXT: DW_AT_specification {{.*}}(0x00000000[[FOO_Ei]] "_ZN1S3fooEi"
// CHECK-NEXT: DW_AT_inline (DW_INL_inlined)
// CHECK-NEXT: DW_AT_object_pointer {{.*}}(0x[[ABASE_FOO_Ei_PARAM1:[0-9a-f]*]]
// CHECK: 0x[[ABASE_FOO_Ei_PARAM1]]:{{.*}}DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_name{{.*}}"this"
// CHECK-NEXT: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *"
// CHECK: 0x[[ABASE_FOO_Ei_PARAM2:[0-9a-f]*]]:{{.*}}DW_TAG_formal_parameter
// CHECK-NEXT: DW_AT_name{{.*}}"i"
// CHECK: DW_AT_type (0x00000000[[INT_BASE]] "int"
// CHECK: DW_TAG_subprogram
// CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
// CHECK: DW_AT_name{{.*}}"foo"
// CHECK: DW_TAG_variable
// CHECK: DW_AT_name{{.*}}"s"
// CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S"
// CHECK: DW_TAG_inlined_subroutine
// CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ev]] "_ZN1S3fooEv"
// CHECK: DW_AT_low_pc
// CHECK: DW_AT_high_pc
// CHECK: DW_TAG_formal_parameter
// CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ev_PARAM1]] "this"
// CHECK: DW_TAG_inlined_subroutine
// CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei]] "_ZN1S3fooEi"
// CHECK: DW_AT_low_pc
// CHECK: DW_AT_high_pc
// CHECK: DW_TAG_formal_parameter
// CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei_PARAM1]] "this"
// CHECK: DW_TAG_formal_parameter
// CHECK: DW_AT_abstract_origin{{.*}}(0x[[ABASE_FOO_Ei_PARAM2]] "i"
#elif defined(FILE3)
void foo() {
S s;
s.baz<int>(42);
}
// For the fourth unit check that it references member functions of structure S.
// CHECK: TAG_compile_unit
// CHECK-NOT: DW_TAG
// CHECK: AT_name{{.*}}"odr-member-functions.cpp"
// CHECK: DW_TAG_subprogram
// CHECK: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
// CHECK: DW_AT_name{{.*}}"foo"
// CHECK: DW_TAG_variable
// CHECK: DW_AT_name{{.*}}"s"
// CHECK: DW_AT_type{{.*}}(0x00000000[[STRUCT_S]] "S"
// CHECK: DW_TAG_subprogram
// CHECK: DW_AT_object_pointer{{.*}}(0x[[INST_PARAM2:[0-9a-f]*]]
// CHECK: DW_AT_specification{{.*}}(0x00000000[[BAZ_SUBPROGRAM]] "_ZN1S3bazIiEEvT_"
// CHECK: 0x[[INST_PARAM2]]:{{.*}}DW_TAG_formal_parameter
// CHECK: DW_AT_name{{.*}}"this"
// CHECK: DW_AT_type{{.*}}(0x00000000[[PTR_S]] "S *"
// CHECK: DW_TAG_formal_parameter
// CHECK: DW_AT_name{{.*}}"t"
// CHECK: DW_AT_type{{.*}}(0x00000000[[INT_BASE]] "int"
// CHECK: DW_TAG_template_type_parameter
// CHECK: DW_AT_type{{.*}}(0x00000000[[INT_BASE]] "int"
// CHECK: DW_AT_name{{.*}}"T"
#else
#error "You must define which file you generate"
#endif