summaryrefslogtreecommitdiffstats
path: root/lldb/tools/lldb-perf/lib/TestCase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/tools/lldb-perf/lib/TestCase.cpp')
-rw-r--r--lldb/tools/lldb-perf/lib/TestCase.cpp588
1 files changed, 269 insertions, 319 deletions
diff --git a/lldb/tools/lldb-perf/lib/TestCase.cpp b/lldb/tools/lldb-perf/lib/TestCase.cpp
index c23a5e51977..39394898996 100644
--- a/lldb/tools/lldb-perf/lib/TestCase.cpp
+++ b/lldb/tools/lldb-perf/lib/TestCase.cpp
@@ -13,346 +13,296 @@
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);
+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;
- }
- }
+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;
+ }
+ 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;
+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;
+ }
}
-
- return false;
-}
+ argc -= optind;
+ argv += optind;
+ }
-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;
+ 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);
+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;
}
-void
-TestCase::SetVerbose (bool b)
-{
- m_verbose = b;
+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);
}
-bool
-TestCase::GetVerbose ()
-{
- return m_verbose;
-}
+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);
+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("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;
+ 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;
}
- 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;
- }
+ if (select_thread && !selected_thread) {
+ m_thread = thread;
+ selected_thread = m_process.SetSelectedThread(thread);
}
- }
- else
- {
- call_test_step = true;
+ }
+ 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 (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);
+ 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;
+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;
}
-
OpenPOWER on IntegriCloud