1d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton//===-- TestCase.cpp --------------------------------------------*- C++ -*-===// 2f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata// 3d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton// The LLVM Compiler Infrastructure 4f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata// 5d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton// This file is distributed under the University of Illinois Open Source 6d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton// License. See LICENSE.TXT for details. 7f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata// 8d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton//===----------------------------------------------------------------------===// 9f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata 10f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#include "TestCase.h" 119de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton#include "Results.h" 12f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#include "Xcode.h" 13f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata 14af222500aa2ce2b18149277e561cdf75f2115df2Greg Claytonusing namespace lldb_perf; 15f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata 16f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico GranataTestCase::TestCase () : 1791c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton m_debugger(), 1891c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton m_target(), 1991c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton m_process(), 2091c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton m_thread(), 2191c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton m_listener(), 22e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata m_verbose(false), 23e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata m_step(0) 24f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{ 25c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata SBDebugger::Initialize(); 26f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata SBHostOS::ThreadCreated ("<lldb-tester.app.main>"); 27f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata m_debugger = SBDebugger::Create(false); 28f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata m_listener = m_debugger.GetListener(); 29f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata} 30f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata 31b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granatastatic std::string 32b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico GranataGetShortOptionString (struct option *long_options) 33b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata{ 34b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata std::string option_string; 35b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata for (int i = 0; long_options[i].name != NULL; ++i) 36b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata { 37b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata if (long_options[i].flag == NULL) 38b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata { 39b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata option_string.push_back ((char) long_options[i].val); 40b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata switch (long_options[i].has_arg) 41b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata { 42b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata default: 43b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata case no_argument: 44b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata break; 45b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata case required_argument: 46b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata option_string.push_back (':'); 47b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata break; 48b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata case optional_argument: 49b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata option_string.append (2, ':'); 50b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata break; 51b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata } 52b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata } 53b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata } 54b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata return option_string; 55b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata} 56b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata 5791c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Claytonbool 58b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico GranataTestCase::Setup (int& argc, const char**& argv) 5991c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton{ 60b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata bool done = false; 61b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata 62b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata struct option* long_options = GetLongOptions(); 63b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata 64b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata if (long_options) 65b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata { 66b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata std::string short_option_string (GetShortOptionString(long_options)); 67b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata 68b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata #if __GLIBC__ 69b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata optind = 0; 70b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata #else 71b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata optreset = 1; 72b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata optind = 1; 73b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata #endif 74b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata while (!done) 75b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata { 76b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata int long_options_index = -1; 77b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata const int short_option = ::getopt_long_only (argc, 78b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata const_cast<char **>(argv), 79b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata short_option_string.c_str(), 80b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata long_options, 81b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata &long_options_index); 82b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata 83b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata switch (short_option) 84b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata { 85b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata case 0: 86b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata // Already handled 87b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata break; 88b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata 89b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata case -1: 90b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata done = true; 91b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata break; 92b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata 93b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata default: 94b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata done = !ParseOption(short_option, optarg); 95b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata break; 96b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata } 97b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata } 98b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata argc -= optind; 99b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata argv += optind; 100b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata } 101b1b36ec6dcfbe7c7dfa423d50cb7c2296deca68eEnrico Granata 10291c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton return false; 10391c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton} 104c50fc4b658c46ef43b1add131391ecdd1f9bd752Enrico Granata 105f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granatabool 10691c570abdc2eb7f0d9bc5affb086d515838ebc39Greg ClaytonTestCase::Launch (lldb::SBLaunchInfo &launch_info) 107f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{ 10891c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton lldb::SBError error; 10991c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton m_process = m_target.Launch (launch_info, error); 11091c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton if (!error.Success()) 11191c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton fprintf (stderr, "error: %s\n", error.GetCString()); 11291c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton if (m_process.IsValid()) 11391c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton { 11491c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton m_process.GetBroadcaster().AddListener(m_listener, SBProcess::eBroadcastBitStateChanged | SBProcess::eBroadcastBitInterrupt); 11591c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton return true; 11691c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton } 11791c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton return false; 118f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata} 119f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata 120101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granatabool 121101a2d6d590b12f9647032d656a13d3d7c432038Enrico GranataTestCase::Launch (std::initializer_list<const char*> args) 122101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata{ 123101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata std::vector<const char*> args_vect(args); 124101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata args_vect.push_back(NULL); 125101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata lldb::SBLaunchInfo launch_info((const char**)&args_vect[0]); 126101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata return Launch(launch_info); 127101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata} 128101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata 129f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granatavoid 130f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico GranataTestCase::SetVerbose (bool b) 131f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{ 132f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata m_verbose = b; 133f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata} 134f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata 135f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granatabool 136f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico GranataTestCase::GetVerbose () 137f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{ 138f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata return m_verbose; 139f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata} 140f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata 141f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granatavoid 142f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico GranataTestCase::Loop () 143f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{ 144f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata while (true) 145f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata { 1469de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton bool call_test_step = false; 1479de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_process.IsValid()) 1489de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 1499de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton SBEvent evt; 1509de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton m_listener.WaitForEvent (UINT32_MAX, evt); 1519de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton StateType state = SBProcess::GetStateFromEvent (evt); 1529de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 1539de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("event = %s\n",SBDebugger::StateAsCString(state)); 1549de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (SBProcess::GetRestartedFromEvent(evt)) 1559de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton continue; 1569de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton switch (state) 1579de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 1589de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateInvalid: 1599de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateDetached: 1609de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateCrashed: 1619de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateUnloaded: 1629de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 1639de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateExited: 1649de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton return; 1659de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateConnected: 1669de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateAttaching: 1679de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateLaunching: 1689de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateRunning: 1699de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateStepping: 1709de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton continue; 1719de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateStopped: 1729de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStateSuspended: 1739de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 1749de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton call_test_step = true; 1759de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton bool fatal = false; 1769de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton bool selected_thread = false; 1779de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton for (auto thread_index = 0; thread_index < m_process.GetNumThreads(); thread_index++) 17891c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton { 1799de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton SBThread thread(m_process.GetThreadAtIndex(thread_index)); 1809de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton SBFrame frame(thread.GetFrameAtIndex(0)); 1819de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton bool select_thread = false; 1829de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton StopReason stop_reason = thread.GetStopReason(); 1839de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) printf("tid = 0x%llx pc = 0x%llx ",thread.GetThreadID(),frame.GetPC()); 1849de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton switch (stop_reason) 185f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata { 1869de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonNone: 1879de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 1889de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("none\n"); 1899de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 1909de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton 1919de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonTrace: 1929de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton select_thread = true; 1939de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 1949de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("trace\n"); 1959de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 1969de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton 1979de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonPlanComplete: 1989de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton select_thread = true; 1999de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2009de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("plan complete\n"); 2019de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2029de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonThreadExiting: 2039de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2049de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("thread exiting\n"); 2059de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2069de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonExec: 2079de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2089de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("exec\n"); 2099de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2109de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonInvalid: 2119de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2129de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("invalid\n"); 2139de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2149de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonException: 2159de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton select_thread = true; 2169de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2179de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("exception\n"); 2189de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton fatal = true; 2199de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2209de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonBreakpoint: 2219de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton select_thread = true; 2229de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2239de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("breakpoint id = %lld.%lld\n",thread.GetStopReasonDataAtIndex(0),thread.GetStopReasonDataAtIndex(1)); 2249de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2259de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonWatchpoint: 2269de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton select_thread = true; 2279de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2289de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("watchpoint id = %lld\n",thread.GetStopReasonDataAtIndex(0)); 2299de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2309de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case eStopReasonSignal: 2319de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton select_thread = true; 2329de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2339de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("signal %d\n",(int)thread.GetStopReasonDataAtIndex(0)); 2349de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 235f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata } 2369de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (select_thread && !selected_thread) 237f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata { 2389de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton m_thread = thread; 2399de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton selected_thread = m_process.SetSelectedThread(thread); 240f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata } 2419de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 2429de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (fatal) 2439de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 2449de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) Xcode::RunCommand(m_debugger,"bt all",true); 2459de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton exit(1); 2469de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 2479de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 2489de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 249f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata } 250f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata } 2519de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton else 2529de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 2539de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton call_test_step = true; 2549de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 2559de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton 2569de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (call_test_step) 2579de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 258442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata do_the_call: 2599de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2609de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("RUNNING STEP %d\n",m_step); 2619de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton ActionWanted action; 2629de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton TestStep(m_step, action); 2639de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton m_step++; 2649de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton SBError err; 2659de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton switch (action.type) 2669de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 2679de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case ActionWanted::Type::eContinue: 2689de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton err = m_process.Continue(); 2699de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2709de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case ActionWanted::Type::eStepOut: 2719de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (action.thread.IsValid() == false) 2729de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 2739de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2749de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 2759de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton Xcode::RunCommand(m_debugger,"bt all",true); 2769de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("error: invalid thread for step out on step %d\n", m_step); 2779de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 2789de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton exit(501); 2799de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 2809de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton m_process.SetSelectedThread(action.thread); 2819de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton action.thread.StepOut(); 2829de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 2839de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case ActionWanted::Type::eStepOver: 2849de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (action.thread.IsValid() == false) 2859de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 2869de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 2879de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton { 2889de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton Xcode::RunCommand(m_debugger,"bt all",true); 2899de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("error: invalid thread for step over %d\n",m_step); 2909de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 2919de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton exit(500); 2929de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 2939de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton m_process.SetSelectedThread(action.thread); 2949de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton action.thread.StepOver(); 2959de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton break; 296b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata case ActionWanted::Type::eRelaunch: 297b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata if (m_process.IsValid()) 298b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata { 299b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata m_process.Kill(); 300b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata m_process.Clear(); 301b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata } 302b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata Launch(action.launch_info); 303b8158c8227c34b0fde91cf8602003f250bead007Enrico Granata break; 3049de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton case ActionWanted::Type::eKill: 3059de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton if (m_verbose) 3069de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton printf("kill\n"); 3079de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton m_process.Kill(); 3089de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton return; 309442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata case ActionWanted::Type::eCallNext: 310442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata goto do_the_call; 311442b3f60c3569eb2445df8c72065a93a44bf97bfEnrico Granata break; 3129de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 3139de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton } 3149de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton 315f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata } 3169de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton 317e62d448f4b663edfac26b9071323606b1b5fdc1dEnrico Granata if (GetVerbose()) printf("I am gonna die at step %d\n",m_step); 318f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata} 319f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata 320101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granataint 321f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico GranataTestCase::Run (TestCase& test, int argc, const char** argv) 322f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{ 32391c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton if (test.Setup(argc, argv)) 32491c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton { 32591c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton test.Loop(); 3269de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton Results results; 3279de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton test.WriteResults(results); 328101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata return RUN_SUCCESS; 32991c570abdc2eb7f0d9bc5affb086d515838ebc39Greg Clayton } 330101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata else 331101a2d6d590b12f9647032d656a13d3d7c432038Enrico Granata return RUN_SETUP_ERROR; 332f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata} 3339de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton 334