| // RUN: dsymutil -f -y %p/dummy-debug-map.map -oso-prepend-path %p/../Inputs/dead-stripped -o - | llvm-dwarfdump - --debug-info | FileCheck %s |
| |
| // The test was compiled with: |
| // clang++ -O2 -g -c dead-strip.cpp -o 1.o |
| |
| // The goal of the test is to exercise dsymutil's behavior in presence of |
| // functions/variables that have been dead-stripped by the linker but |
| // that are still present in the linked debug info (in this case because |
| // they have been DW_TAG_import'd in another namespace). |
| |
| // Everything in the N namespace bellow doesn't have a debug map entry, and |
| // thus is considered dead (::foo() has a debug map entry, otherwse dsymutil |
| // would just drop the CU altogether). |
| |
| namespace N { |
| int blah = 42; |
| // This is actually a dsymutil-classic bug that we reproduced |
| // CHECK: DW_TAG_variable |
| // CHECK-NOT: DW_TAG |
| // CHECK: DW_AT_location |
| |
| __attribute__((always_inline)) int foo() { return blah; } |
| // CHECK: DW_TAG_subprogram |
| // CHECK-NOT: DW_AT_low_pc |
| // CHECK-NOT: DW_AT_high_pc |
| // CHECK: DW_AT_frame_base |
| |
| // CHECK: DW_TAG_subprogram |
| |
| int bar(unsigned i) { |
| int val = foo(); |
| if (i) |
| return val + bar(i-1); |
| return foo(); |
| } |
| // CHECK: DW_TAG_subprogram |
| // CHECK-NOT: DW_AT_low_pc |
| // CHECK-NOT: DW_AT_high_pc |
| // CHECK: DW_AT_frame_base |
| // CHECK-NOT: DW_AT_location |
| // CHECK-NOT: DW_AT_low_pc |
| // CHECK-NOT: DW_AT_high_pc |
| |
| } |
| // CHECK: TAG_imported_module |
| using namespace N; |
| |
| void foo() {} |