xref: /llvm-project/cross-project-tests/debuginfo-tests/dexter-tests/inline-line-gap.cpp (revision 45a40c163932d12b72b33bd1d8a84519392b5d39)
11364750dSJames Henderson // REQUIRES: system-windows
21364750dSJames Henderson //
3*45a40c16SStephen Tozer // RUN: %clang_cl /Od /Z7 /Zi %s -o %t
4*45a40c16SStephen Tozer // RUN: %dexter --fail-lt 1.0 -w --binary %t --debugger 'dbgeng' -- %s
51364750dSJames Henderson //
6*45a40c16SStephen Tozer // RUN: %clang_cl /O2 /Z7 /Zi %s -o %t
7*45a40c16SStephen Tozer // RUN: %dexter --fail-lt 1.0 -w --binary %t \
8*45a40c16SStephen Tozer // RUN:      --debugger 'dbgeng' -- %s
91364750dSJames Henderson 
101364750dSJames Henderson // This code is structured to have an early exit with an epilogue in the middle
111364750dSJames Henderson // of the function, which creates a gap between the beginning of the inlined
121364750dSJames Henderson // code region and the end. Previously, this confused cdb.
131364750dSJames Henderson 
141364750dSJames Henderson volatile bool shutting_down_ = true;
151364750dSJames Henderson volatile bool tearing_down_ = true;
161364750dSJames Henderson 
setCrashString(const char *)171364750dSJames Henderson void __attribute__((optnone)) setCrashString(const char *) {}
doTailCall()181364750dSJames Henderson void __attribute__((optnone)) doTailCall() {}
191364750dSJames Henderson extern "C" void __declspec(noreturn) abort();
201364750dSJames Henderson 
inlineCrashFrame()211364750dSJames Henderson void __forceinline inlineCrashFrame() {
221364750dSJames Henderson   if (shutting_down_ || tearing_down_) {
231364750dSJames Henderson     setCrashString("crashing");
241364750dSJames Henderson     // MSVC lays out calls to abort out of line, gets the layout we want.
251364750dSJames Henderson     abort(); // DexLabel('stop')
261364750dSJames Henderson   }
271364750dSJames Henderson }
281364750dSJames Henderson 
callerOfInlineCrashFrame(bool is_keeping_alive)291364750dSJames Henderson void __declspec(noinline) callerOfInlineCrashFrame(bool is_keeping_alive) {
301364750dSJames Henderson   if (is_keeping_alive)
311364750dSJames Henderson     inlineCrashFrame();
321364750dSJames Henderson   else
331364750dSJames Henderson     doTailCall();
341364750dSJames Henderson }
351364750dSJames Henderson 
main()361364750dSJames Henderson int __attribute__((optnone)) main() {
371364750dSJames Henderson   callerOfInlineCrashFrame(true);
381364750dSJames Henderson }
391364750dSJames Henderson 
401364750dSJames Henderson /*
411364750dSJames Henderson DexExpectProgramState({'frames':[
421364750dSJames Henderson      {'function': 'inlineCrashFrame', 'location':{'lineno' : ref('stop')} },
431364750dSJames Henderson      {'function': 'callerOfInlineCrashFrame'},
441364750dSJames Henderson      {'function': 'main'}
451364750dSJames Henderson ]})
461364750dSJames Henderson */
47