diff options
Diffstat (limited to 'llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp')
-rw-r--r-- | llvm/test/tools/dsymutil/X86/inlined-static-variable.cpp | 59 |
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 |