mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-13 00:11:56 +00:00
![Frederic Riss](/assets/img/avatar_default.png)
When cloning the debug info for a function that hasn't been linked, strip the DIEs from all location attributes that wouldn't contain any meaningful information anyway. This kind of situation can happen when a function got discarded by the linker, but its debug information is still wanted in the final link because it was marked as required as some other DIE dependency. The easiest way to get into that situation is to have using directives. They get linked unconditionally, but their targets might not always be present. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247386 91177308-0d34-0410-b5e6-96231b3b80d8
49 lines
1.4 KiB
C++
49 lines
1.4 KiB
C++
// RUN: llvm-dsymutil -f -y %p/dummy-debug-map.map -oso-prepend-path %p/../Inputs/dead-stripped -o - | llvm-dwarfdump - -debug-dump=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() {}
|