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 Hoaginline __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 Hoagint unused() { 320005efd4SEllis Hoag static int c = 0; 330005efd4SEllis Hoag return ++c; 340005efd4SEllis Hoag } 350005efd4SEllis Hoag foo()360005efd4SEllis Hoagint 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