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 Hendersonvoid __attribute__((optnone)) setCrashString(const char *) {} doTailCall()181364750dSJames Hendersonvoid __attribute__((optnone)) doTailCall() {} 191364750dSJames Henderson extern "C" void __declspec(noreturn) abort(); 201364750dSJames Henderson inlineCrashFrame()211364750dSJames Hendersonvoid __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 Hendersonvoid __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 Hendersonint __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