summaryrefslogtreecommitdiff
path: root/llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp')
-rw-r--r--llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp b/llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp
new file mode 100644
index 000000000000..5593b2638147
--- /dev/null
+++ b/llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp
@@ -0,0 +1,59 @@
+// RUN: dsymutil -f -y %p/dummy-debug-map.map -oso-prepend-path %p/../Inputs/inlined-static-variable -o - | llvm-dwarfdump - | FileCheck %s --implicit-check-not "{{DW_AT_low_pc|DW_AT_high_pc|DW_AT_location|DW_TAG|NULL}}"
+
+// clang -g -c inlined-static-variable.cpp -o 4.o
+
+// The functions removed and not_removed are not in the debug map and are
+// considered dead, but they are also inlined into the function foo which is
+// in the debug map. Those function-local globals are alive and thus should
+// have locations in the debug info even if their functions do not.
+
+inline __attribute__((always_inline)) int removed() {
+ static int a = 0;
+ return ++a;
+}
+
+__attribute__((always_inline)) int not_removed() {
+ static int b = 0;
+ return ++b;
+}
+
+int unused() {
+ static int c = 0;
+ return ++c;
+}
+
+int foo() {
+ return removed() + not_removed();
+}
+
+// CHECK: DW_TAG_compile_unit
+// CHECK: DW_AT_low_pc
+// CHECK: DW_AT_high_pc
+
+// CHECK: DW_TAG_subprogram
+// CHECK: DW_AT_name ("removed")
+// CHECK: DW_TAG_variable
+// CHECK: DW_AT_name ("a")
+// CHECK: DW_AT_location
+// CHECK: NULL
+
+// CHECK: DW_TAG_base_type
+// CHECK: DW_TAG_subprogram
+// CHECK: DW_AT_name ("not_removed")
+// CHECK: DW_TAG_variable
+// CHECK: DW_AT_name ("b")
+// CHECK: DW_AT_location
+// CHECK: NULL
+
+// CHECK: DW_TAG_subprogram
+// CHECK: DW_AT_low_pc
+// CHECK: DW_AT_high_pc
+// CHECK: DW_AT_name ("foo")
+// CHECK: DW_TAG_inlined_subroutine
+// CHECK: DW_AT_low_pc
+// CHECK: DW_AT_high_pc
+// CHECK: DW_TAG_inlined_subroutine
+// CHECK: DW_AT_low_pc
+// CHECK: DW_AT_high_pc
+// CHECK: NULL
+// CHECK: NULL