xref: /llvm-project/llvm/test/tools/dsymutil/X86/DWARFLinkerParallel/inlined-static-variable.cpp (revision f1fdfe6888f93b9f6dfb4689e1f3206de584ff5b)
1*f1fdfe68SAlexey Lapshin // RUN: dsymutil --linker parallel -f -y %p/../dummy-debug-map.map -oso-prepend-path \
2b61ac4a8Savl-llvm // RUN:   %p/../../Inputs/inlined-static-variable -o - -keep-function-for-static | \
3b61ac4a8Savl-llvm // RUN:   llvm-dwarfdump - | FileCheck %s --implicit-check-not \
4b61ac4a8Savl-llvm // RUN: "{{DW_AT_low_pc|DW_AT_high_pc|DW_AT_location|DW_TAG|NULL}}" \
5b61ac4a8Savl-llvm // RUN: --check-prefixes=CHECK
6b61ac4a8Savl-llvm 
7b61ac4a8Savl-llvm // clang -g -c inlined-static-variable.cpp -o 4.o
8b61ac4a8Savl-llvm 
9b61ac4a8Savl-llvm // The functions removed and not_removed are not in the debug map and are
10b61ac4a8Savl-llvm // considered dead, but they are also inlined into the function foo which is
11b61ac4a8Savl-llvm // in the debug map. Those function-local globals are alive and thus should
12b61ac4a8Savl-llvm // have locations in the debug info even if their functions do not.
13b61ac4a8Savl-llvm 
removed()14b61ac4a8Savl-llvm inline __attribute__((always_inline)) int removed() {
15b61ac4a8Savl-llvm   static int a = 0;
16b61ac4a8Savl-llvm   return ++a;
17b61ac4a8Savl-llvm }
18b61ac4a8Savl-llvm 
not_removed()19b61ac4a8Savl-llvm __attribute__((always_inline)) int not_removed() {
20b61ac4a8Savl-llvm   static int b = 0;
21b61ac4a8Savl-llvm   return ++b;
22b61ac4a8Savl-llvm }
23b61ac4a8Savl-llvm 
unused()24b61ac4a8Savl-llvm int unused() {
25b61ac4a8Savl-llvm   static int c = 0;
26b61ac4a8Savl-llvm   return ++c;
27b61ac4a8Savl-llvm }
28b61ac4a8Savl-llvm 
foo()29b61ac4a8Savl-llvm int foo() {
30b61ac4a8Savl-llvm   return removed() + not_removed();
31b61ac4a8Savl-llvm }
32b61ac4a8Savl-llvm 
33b61ac4a8Savl-llvm // CHECK: DW_TAG_compile_unit
34b61ac4a8Savl-llvm // CHECK: DW_AT_name{{.*}}"__artificial_type_unit"
35b61ac4a8Savl-llvm // CHECK: DW_TAG_base_type
36b61ac4a8Savl-llvm // CHECK:   DW_AT_name{{.*}}"int"
37b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram
38b61ac4a8Savl-llvm // CHECK:   DW_AT_name{{.*}}"not_removed"
39b61ac4a8Savl-llvm // CHECK: DW_TAG_subprogram
40b61ac4a8Savl-llvm // CHECK:   DW_AT_name{{.*}}"removed"
41b61ac4a8Savl-llvm // CHECK: NULL
42b61ac4a8Savl-llvm 
43b61ac4a8Savl-llvm // CHECK: DW_TAG_compile_unit
44b61ac4a8Savl-llvm // CHECK:   DW_AT_low_pc
45b61ac4a8Savl-llvm // CHECK:   DW_AT_high_pc
46b61ac4a8Savl-llvm // CHECK:   DW_TAG_subprogram
47b61ac4a8Savl-llvm // CHECK:   DW_AT_name{{.*}}"removed"
48b61ac4a8Savl-llvm // CHECK-NOT: DW_AT_low_pc
49b61ac4a8Savl-llvm // CHECK-NOT: DW_AT_low_pc
50b61ac4a8Savl-llvm // CHECK:   DW_TAG_variable
51b61ac4a8Savl-llvm // CHECK:   DW_AT_name{{.*}}"a"
52b61ac4a8Savl-llvm // CHECK:   {{.*}}DW_OP_addr
53b61ac4a8Savl-llvm // CHECK:   NULL
54b61ac4a8Savl-llvm // CHECK:   DW_TAG_base_type
55b61ac4a8Savl-llvm // CHECK:   DW_TAG_subprogram
56b61ac4a8Savl-llvm // CHECK:   DW_AT_name{{.*}}"not_removed"
57b61ac4a8Savl-llvm // CHECK-NOT: DW_AT_low_pc
58b61ac4a8Savl-llvm // CHECK-NOT: DW_AT_low_pc
59b61ac4a8Savl-llvm // CHECK:   DW_TAG_variable
60b61ac4a8Savl-llvm // CHECK:   DW_AT_name{{.*}}"b"
61b61ac4a8Savl-llvm // CHECK:   {{.*}}DW_OP_addr
62b61ac4a8Savl-llvm // CHECK:   NULL
63b61ac4a8Savl-llvm // CHECK:   DW_TAG_subprogram
64b61ac4a8Savl-llvm // CHECK:     DW_AT_low_pc
65b61ac4a8Savl-llvm // CHECK:     DW_AT_high_pc
66b61ac4a8Savl-llvm // CHECK:     DW_AT_name	("foo")
67b61ac4a8Savl-llvm // CHECK:     DW_TAG_inlined_subroutine
68b61ac4a8Savl-llvm // CHECK:       DW_AT_low_pc
69b61ac4a8Savl-llvm // CHECK:       DW_AT_high_pc
70b61ac4a8Savl-llvm // CHECK:     DW_TAG_inlined_subroutine
71b61ac4a8Savl-llvm // CHECK:       DW_AT_low_pc
72b61ac4a8Savl-llvm // CHECK:       DW_AT_high_pc
73b61ac4a8Savl-llvm // CHECK:     NULL
74b61ac4a8Savl-llvm // CHECK:   NULL
75