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