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-llvminline __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-llvmint unused() { 25b61ac4a8Savl-llvm static int c = 0; 26b61ac4a8Savl-llvm return ++c; 27b61ac4a8Savl-llvm } 28b61ac4a8Savl-llvm foo()29b61ac4a8Savl-llvmint 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