mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-15 04:00:56 +00:00
Add cdb test for inline line tables
This creates an integration test for inlined call line tables, and in particular, ones that are discontiguous. We've had issues in the past with discontiguous inline line tables, and until r362429 LLD didn't write the inlinees section into the PDB. The test was reduced from https://crbug.com/965670 Reviewers: thakis Differential Revision: https://reviews.llvm.org/D62758 llvm-svn: 362431
This commit is contained in:
parent
c061b99c5b
commit
479568e645
45
debuginfo-tests/win_cdb/inline-line-gap.cpp
Normal file
45
debuginfo-tests/win_cdb/inline-line-gap.cpp
Normal file
@ -0,0 +1,45 @@
|
||||
// RUN: %clang_cl -MD -Od %s -o %t.exe -fuse-ld=lld -Z7
|
||||
// RUN: grep DE[B]UGGER: %s | sed -e 's/.*DE[B]UGGER: //' > %t.script
|
||||
// RUN: %cdb -cf %t.script %t.exe | FileCheck %s --check-prefixes=DEBUGGER,CHECK
|
||||
//
|
||||
// RUN: %clang_cl -MD -O2 %s -o %t.exe -fuse-ld=lld -Z7
|
||||
// RUN: grep DE[B]UGGER: %s | sed -e 's/.*DE[B]UGGER: //' > %t.script
|
||||
// RUN: %cdb -cf %t.script %t.exe | FileCheck %s --check-prefixes=DEBUGGER,CHECK
|
||||
|
||||
// This code is structured to have an early exit with an epilogue in the middle
|
||||
// of the function, which creates a gap between the beginning of the inlined
|
||||
// code region and the end. Previously, this confused cdb.
|
||||
|
||||
volatile bool shutting_down_ = true;
|
||||
volatile bool tearing_down_ = true;
|
||||
|
||||
void __attribute__((optnone)) setCrashString(const char *) {}
|
||||
void __attribute__((optnone)) doTailCall() {}
|
||||
extern "C" void __declspec(noreturn) abort();
|
||||
|
||||
void __forceinline inlineCrashFrame() {
|
||||
if (shutting_down_ || tearing_down_) {
|
||||
setCrashString("crashing");
|
||||
__debugbreak();
|
||||
// MSVC lays out calls to abort out of line, gets the layout we want.
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
void __declspec(noinline) callerOfInlineCrashFrame(bool is_keeping_alive) {
|
||||
if (is_keeping_alive)
|
||||
inlineCrashFrame();
|
||||
else
|
||||
doTailCall();
|
||||
}
|
||||
|
||||
int __attribute__((optnone)) main() {
|
||||
callerOfInlineCrashFrame(true);
|
||||
}
|
||||
|
||||
// DEBUGGER: g
|
||||
// DEBUGGER: k3
|
||||
// CHECK: {{.*}}!inlineCrashFrame
|
||||
// CHECK: {{.*}}!callerOfInlineCrashFrame
|
||||
// CHECK: {{.*}}!main
|
||||
// DEBUGGER: q
|
Loading…
Reference in New Issue
Block a user