diff options
Diffstat (limited to 'tools/lldb-perf/lib/TestCase.cpp')
-rw-r--r-- | tools/lldb-perf/lib/TestCase.cpp | 308 |
1 files changed, 0 insertions, 308 deletions
diff --git a/tools/lldb-perf/lib/TestCase.cpp b/tools/lldb-perf/lib/TestCase.cpp deleted file mode 100644 index 393948989967..000000000000 --- a/tools/lldb-perf/lib/TestCase.cpp +++ /dev/null @@ -1,308 +0,0 @@ -//===-- TestCase.cpp --------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "TestCase.h" -#include "Results.h" -#include "Xcode.h" - -using namespace lldb_perf; - -TestCase::TestCase() - : m_debugger(), m_target(), m_process(), m_thread(), m_listener(), - m_verbose(false), m_step(0) { - SBDebugger::Initialize(); - SBHostOS::ThreadCreated("<lldb-tester.app.main>"); - m_debugger = SBDebugger::Create(false); - m_listener = m_debugger.GetListener(); - m_listener.StartListeningForEventClass( - m_debugger, SBProcess::GetBroadcasterClass(), - SBProcess::eBroadcastBitStateChanged | SBProcess::eBroadcastBitInterrupt); -} - -static std::string GetShortOptionString(struct option *long_options) { - std::string option_string; - for (int i = 0; long_options[i].name != NULL; ++i) { - if (long_options[i].flag == NULL) { - option_string.push_back((char)long_options[i].val); - switch (long_options[i].has_arg) { - default: - case no_argument: - break; - case required_argument: - option_string.push_back(':'); - break; - case optional_argument: - option_string.append(2, ':'); - break; - } - } - } - return option_string; -} - -bool TestCase::Setup(int &argc, const char **&argv) { - bool done = false; - - struct option *long_options = GetLongOptions(); - - if (long_options) { - std::string short_option_string(GetShortOptionString(long_options)); - -#if __GLIBC__ - optind = 0; -#else - optreset = 1; - optind = 1; -#endif - while (!done) { - int long_options_index = -1; - const int short_option = ::getopt_long_only( - argc, const_cast<char **>(argv), short_option_string.c_str(), - long_options, &long_options_index); - - switch (short_option) { - case 0: - // Already handled - break; - - case -1: - done = true; - break; - - default: - done = !ParseOption(short_option, optarg); - break; - } - } - argc -= optind; - argv += optind; - } - - return false; -} - -bool TestCase::Launch(lldb::SBLaunchInfo &launch_info) { - lldb::SBError error; - m_process = m_target.Launch(launch_info, error); - if (!error.Success()) - fprintf(stderr, "error: %s\n", error.GetCString()); - if (m_process.IsValid()) - return true; - return false; -} - -bool TestCase::Launch(std::initializer_list<const char *> args) { - std::vector<const char *> args_vect(args); - args_vect.push_back(NULL); - lldb::SBLaunchInfo launch_info((const char **)&args_vect[0]); - return Launch(launch_info); -} - -void TestCase::SetVerbose(bool b) { m_verbose = b; } - -bool TestCase::GetVerbose() { return m_verbose; } - -void TestCase::Loop() { - while (true) { - bool call_test_step = false; - if (m_process.IsValid()) { - SBEvent evt; - m_listener.WaitForEvent(UINT32_MAX, evt); - StateType state = SBProcess::GetStateFromEvent(evt); - if (m_verbose) - printf("event = %s\n", SBDebugger::StateAsCString(state)); - if (SBProcess::GetRestartedFromEvent(evt)) { - if (m_verbose) { - const uint32_t num_threads = m_process.GetNumThreads(); - for (auto thread_index = 0; thread_index < num_threads; - thread_index++) { - SBThread thread(m_process.GetThreadAtIndex(thread_index)); - SBFrame frame(thread.GetFrameAtIndex(0)); - SBStream strm; - strm.RedirectToFileHandle(stdout, false); - frame.GetDescription(strm); - } - puts("restarted"); - } - call_test_step = false; - } else { - switch (state) { - case eStateInvalid: - case eStateDetached: - case eStateCrashed: - case eStateUnloaded: - break; - case eStateExited: - return; - case eStateConnected: - case eStateAttaching: - case eStateLaunching: - case eStateRunning: - case eStateStepping: - call_test_step = false; - break; - - case eStateStopped: - case eStateSuspended: { - call_test_step = true; - bool fatal = false; - bool selected_thread = false; - const uint32_t num_threads = m_process.GetNumThreads(); - for (auto thread_index = 0; thread_index < num_threads; - thread_index++) { - SBThread thread(m_process.GetThreadAtIndex(thread_index)); - SBFrame frame(thread.GetFrameAtIndex(0)); - SBStream strm; - strm.RedirectToFileHandle(stdout, false); - frame.GetDescription(strm); - bool select_thread = false; - StopReason stop_reason = thread.GetStopReason(); - if (m_verbose) - printf("tid = 0x%llx pc = 0x%llx ", thread.GetThreadID(), - frame.GetPC()); - switch (stop_reason) { - case eStopReasonNone: - if (m_verbose) - printf("none\n"); - break; - - case eStopReasonTrace: - select_thread = true; - if (m_verbose) - printf("trace\n"); - break; - - case eStopReasonPlanComplete: - select_thread = true; - if (m_verbose) - printf("plan complete\n"); - break; - case eStopReasonThreadExiting: - if (m_verbose) - printf("thread exiting\n"); - break; - case eStopReasonExec: - if (m_verbose) - printf("exec\n"); - break; - case eStopReasonInvalid: - if (m_verbose) - printf("invalid\n"); - break; - case eStopReasonException: - select_thread = true; - if (m_verbose) - printf("exception\n"); - fatal = true; - break; - case eStopReasonBreakpoint: - select_thread = true; - if (m_verbose) - printf("breakpoint id = %lld.%lld\n", - thread.GetStopReasonDataAtIndex(0), - thread.GetStopReasonDataAtIndex(1)); - break; - case eStopReasonWatchpoint: - select_thread = true; - if (m_verbose) - printf("watchpoint id = %lld\n", - thread.GetStopReasonDataAtIndex(0)); - break; - case eStopReasonSignal: - select_thread = true; - if (m_verbose) - printf("signal %d\n", (int)thread.GetStopReasonDataAtIndex(0)); - break; - } - if (select_thread && !selected_thread) { - m_thread = thread; - selected_thread = m_process.SetSelectedThread(thread); - } - } - if (fatal) { - if (m_verbose) - Xcode::RunCommand(m_debugger, "bt all", true); - exit(1); - } - } break; - } - } - } else { - call_test_step = true; - } - - if (call_test_step) { - do_the_call: - if (m_verbose) - printf("RUNNING STEP %d\n", m_step); - ActionWanted action; - TestStep(m_step, action); - m_step++; - SBError err; - switch (action.type) { - case ActionWanted::Type::eNone: - // Just exit and wait for the next event - break; - case ActionWanted::Type::eContinue: - err = m_process.Continue(); - break; - case ActionWanted::Type::eStepOut: - if (action.thread.IsValid() == false) { - if (m_verbose) { - Xcode::RunCommand(m_debugger, "bt all", true); - printf("error: invalid thread for step out on step %d\n", m_step); - } - exit(501); - } - m_process.SetSelectedThread(action.thread); - action.thread.StepOut(); - break; - case ActionWanted::Type::eStepOver: - if (action.thread.IsValid() == false) { - if (m_verbose) { - Xcode::RunCommand(m_debugger, "bt all", true); - printf("error: invalid thread for step over %d\n", m_step); - } - exit(500); - } - m_process.SetSelectedThread(action.thread); - action.thread.StepOver(); - break; - case ActionWanted::Type::eRelaunch: - if (m_process.IsValid()) { - m_process.Kill(); - m_process.Clear(); - } - Launch(action.launch_info); - break; - case ActionWanted::Type::eKill: - if (m_verbose) - printf("kill\n"); - m_process.Kill(); - return; - case ActionWanted::Type::eCallNext: - goto do_the_call; - break; - } - } - } - - if (GetVerbose()) - printf("I am gonna die at step %d\n", m_step); -} - -int TestCase::Run(TestCase &test, int argc, const char **argv) { - if (test.Setup(argc, argv)) { - test.Loop(); - Results results; - test.WriteResults(results); - return RUN_SUCCESS; - } else - return RUN_SETUP_ERROR; -} |