diff options
-rw-r--r-- | lldb/tools/lldb-perf/common/clang/lldb_perf_clang.cpp | 59 | ||||
-rw-r--r-- | lldb/tools/lldb-perf/lib/TestCase.cpp | 195 | ||||
-rw-r--r-- | lldb/tools/lldb-perf/lib/TestCase.h | 8 |
3 files changed, 168 insertions, 94 deletions
diff --git a/lldb/tools/lldb-perf/common/clang/lldb_perf_clang.cpp b/lldb/tools/lldb-perf/common/clang/lldb_perf_clang.cpp index b9fa4df9451..3e7d0438179 100644 --- a/lldb/tools/lldb-perf/common/clang/lldb_perf_clang.cpp +++ b/lldb/tools/lldb-perf/common/clang/lldb_perf_clang.cpp @@ -84,6 +84,8 @@ public: virtual void TestStep (int counter, ActionWanted &next_action) { + char temp_source_path[PATH_MAX] = "/tmp/main.XXXXXX.cpp"; + switch (counter) { case 0: @@ -98,6 +100,47 @@ public: m_time_set_bp_main(); + int fd = mkstemps(temp_source_path, 4); + + if (fd >= 0) + { + const char *source_content = R"( +#include <stdio.h> +#include <stdint.h> +#include <vector> + +namespace { + struct Foo + { + int i; int j; + }; + void doit (const Foo &foo) + { + printf ("doit(%i)\n", foo.i); + } +} + +int main (int argc, char const *argv[], char const *envp[]) +{ + std::vector<int> ints; + for (int i=0;i<10;++i) + ints.push_back(i); + printf ("hello world\n"); + Foo foo = { 12, 13 }; + doit (foo); + return 0; +} +)"; + write (fd, source_content, strlen(source_content)); + close(fd); + } + else + { + const char *error_cstr = strerror(errno); + fprintf (stderr, "error: failed to created temporary source file: '%s' (%s)", temp_source_path, error_cstr); + exit(2); + } + m_time_launch_stop_main.Start(); const char *clang_argv[] = { "-cc1", @@ -116,10 +159,8 @@ public: "-target-linker-version", "132.10.1", "-v", "-g", - "-resource-dir", "/tmp/clang-176809/llvm-build/build/Debug/bin/../lib/clang/3.3", "-O0", "-fdeprecated-macro", - "-fdebug-compilation-dir", "/tmp/clang-176809/llvm-build/build/Debug/bin", "-ferror-limit", "19", "-fmessage-length", "298", "-stack-protector", "1", @@ -127,7 +168,6 @@ public: "-fblocks", "-fobjc-runtime=macosx-10.8.0", "-fobjc-dispatch-method=mixed", - "-fobjc-default-synthesize-properties", "-fencode-extended-block-signature", "-fcxx-exceptions", "-fexceptions", @@ -137,18 +177,18 @@ public: "-vectorize-loops", "-o", "/tmp/main.o", "-x", "c++", - "/tmp/main.cpp", + NULL, NULL }; + clang_argv[sizeof(clang_argv)/sizeof(const char *)-2] = temp_source_path; SBLaunchInfo launch_info(clang_argv); Launch (launch_info); + next_action.None(); // Don't continue or do anything, just wait for next event... } break; case 1: - puts("stop"); - m_time_launch_stop_main.Stop(); - m_time_total.Stop(); - case 2: { + m_time_launch_stop_main.Stop(); + m_time_total.Stop(); SBFrame frame (m_thread.GetFrameAtIndex(0)); // Time the first expression evaluation @@ -163,7 +203,7 @@ public: next_action.Continue(); } break; - case 3: + case 2: { SBFrame frame (m_thread.GetFrameAtIndex(21)); SBValue result; @@ -171,7 +211,6 @@ public: { m_expr_frame_non_zero(frame); } - m_target.BreakpointCreateByName("DeclContext::lookup"); next_action.Continue(); } break; diff --git a/lldb/tools/lldb-perf/lib/TestCase.cpp b/lldb/tools/lldb-perf/lib/TestCase.cpp index 9d58fa2061d..f0c4528351a 100644 --- a/lldb/tools/lldb-perf/lib/TestCase.cpp +++ b/lldb/tools/lldb-perf/lib/TestCase.cpp @@ -152,101 +152,125 @@ TestCase::Loop () if (m_verbose) printf("event = %s\n",SBDebugger::StateAsCString(state)); if (SBProcess::GetRestartedFromEvent(evt)) - continue; - switch (state) { - case eStateInvalid: - case eStateDetached: - case eStateCrashed: - case eStateUnloaded: - break; - case eStateExited: - return; - case eStateConnected: - case eStateAttaching: - case eStateLaunching: - case eStateRunning: - case eStateStepping: - continue; - case eStateStopped: - case eStateSuspended: + if (m_verbose) { - call_test_step = true; - bool fatal = false; - bool selected_thread = false; - for (auto thread_index = 0; thread_index < m_process.GetNumThreads(); thread_index++) + 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)); - 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) + 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++) { - 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; + 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 (select_thread && !selected_thread) + if (fatal) { - m_thread = thread; - selected_thread = m_process.SetSelectedThread(thread); + if (m_verbose) Xcode::RunCommand(m_debugger,"bt all",true); + exit(1); } } - if (fatal) - { - if (m_verbose) Xcode::RunCommand(m_debugger,"bt all",true); - exit(1); - } + break; } - break; - } + } } else { @@ -264,6 +288,9 @@ TestCase::Loop () 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; diff --git a/lldb/tools/lldb-perf/lib/TestCase.h b/lldb/tools/lldb-perf/lib/TestCase.h index e882ff3c9b3..811d0432b58 100644 --- a/lldb/tools/lldb-perf/lib/TestCase.h +++ b/lldb/tools/lldb-perf/lib/TestCase.h @@ -32,6 +32,7 @@ public: eStepOut, eRelaunch, eCallNext, + eNone, eKill } type; lldb::SBThread thread; @@ -45,6 +46,13 @@ public: } void + None () + { + type = Type::eNone; + thread = lldb::SBThread(); + } + + void Continue() { type = Type::eContinue; |