xref: /llvm-project/llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp (revision f1fdfe6888f93b9f6dfb4689e1f3206de584ff5b)
1b61ac4a8Savl-llvm // RUN: dsymutil -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 //
7*f1fdfe68SAlexey Lapshin // RUN: dsymutil --linker parallel --no-odr -f -y %p/dummy-debug-map.map \
8b61ac4a8Savl-llvm // RUN:   -oso-prepend-path %p/../Inputs/inlined-static-variable -o - \
9b61ac4a8Savl-llvm // RUN:   -keep-function-for-static | llvm-dwarfdump - | FileCheck %s \
10b61ac4a8Savl-llvm // RUN:   --implicit-check-not \
11b61ac4a8Savl-llvm // RUN:   "{{DW_AT_low_pc|DW_AT_high_pc|DW_AT_location|DW_TAG|NULL}}" \
12b61ac4a8Savl-llvm // RUN:   --check-prefixes=CHECK
135f2a7fa6SAlexey Lapshin 
140005efd4SEllis Hoag // clang -g -c inlined-static-variable.cpp -o 4.o
150005efd4SEllis Hoag 
160005efd4SEllis Hoag // The functions removed and not_removed are not in the debug map and are
170005efd4SEllis Hoag // considered dead, but they are also inlined into the function foo which is
180005efd4SEllis Hoag // in the debug map. Those function-local globals are alive and thus should
190005efd4SEllis Hoag // have locations in the debug info even if their functions do not.
200005efd4SEllis Hoag 
removed()210005efd4SEllis Hoag inline __attribute__((always_inline)) int removed() {
220005efd4SEllis Hoag   static int a = 0;
230005efd4SEllis Hoag   return ++a;
240005efd4SEllis Hoag }
250005efd4SEllis Hoag 
not_removed()260005efd4SEllis Hoag __attribute__((always_inline)) int not_removed() {
270005efd4SEllis Hoag   static int b = 0;
280005efd4SEllis Hoag   return ++b;
290005efd4SEllis Hoag }
300005efd4SEllis Hoag 
unused()310005efd4SEllis Hoag int unused() {
320005efd4SEllis Hoag   static int c = 0;
330005efd4SEllis Hoag   return ++c;
340005efd4SEllis Hoag }
350005efd4SEllis Hoag 
foo()360005efd4SEllis Hoag int foo() {
370005efd4SEllis Hoag   return removed() + not_removed();
380005efd4SEllis Hoag }
390005efd4SEllis Hoag 
400005efd4SEllis Hoag // CHECK: DW_TAG_compile_unit
410005efd4SEllis Hoag // CHECK:   DW_AT_low_pc
420005efd4SEllis Hoag // CHECK:   DW_AT_high_pc
430005efd4SEllis Hoag 
440005efd4SEllis Hoag // CHECK:   DW_TAG_subprogram
450005efd4SEllis Hoag // CHECK:     DW_AT_name	("removed")
460005efd4SEllis Hoag // CHECK:     DW_TAG_variable
470005efd4SEllis Hoag // CHECK:       DW_AT_name	("a")
480005efd4SEllis Hoag // CHECK:       DW_AT_location
490005efd4SEllis Hoag // CHECK:     NULL
500005efd4SEllis Hoag 
510005efd4SEllis Hoag // CHECK:   DW_TAG_base_type
520005efd4SEllis Hoag // CHECK:   DW_TAG_subprogram
530005efd4SEllis Hoag // CHECK:     DW_AT_name	("not_removed")
540005efd4SEllis Hoag // CHECK:     DW_TAG_variable
550005efd4SEllis Hoag // CHECK:       DW_AT_name	("b")
560005efd4SEllis Hoag // CHECK:       DW_AT_location
570005efd4SEllis Hoag // CHECK:     NULL
580005efd4SEllis Hoag 
590005efd4SEllis Hoag // CHECK:   DW_TAG_subprogram
600005efd4SEllis Hoag // CHECK:     DW_AT_low_pc
610005efd4SEllis Hoag // CHECK:     DW_AT_high_pc
620005efd4SEllis Hoag // CHECK:     DW_AT_name	("foo")
630005efd4SEllis Hoag // CHECK:     DW_TAG_inlined_subroutine
640005efd4SEllis Hoag // CHECK:       DW_AT_low_pc
650005efd4SEllis Hoag // CHECK:       DW_AT_high_pc
660005efd4SEllis Hoag // CHECK:     DW_TAG_inlined_subroutine
670005efd4SEllis Hoag // CHECK:       DW_AT_low_pc
680005efd4SEllis Hoag // CHECK:       DW_AT_high_pc
690005efd4SEllis Hoag // CHECK:     NULL
700005efd4SEllis Hoag // CHECK:   NULL
71