blob: 65b601e94cfe298f23b5b05a33ba2086f6a1bce5 [file] [log] [blame]
Greg Clayton5dbe5d42013-03-21 03:39:51 +00001//===-- sketch.cpp ----------------------------------------------*- C++ -*-===//
Enrico Granataf58cece2013-03-08 20:29:13 +00002//
Greg Clayton5dbe5d42013-03-21 03:39:51 +00003// The LLVM Compiler Infrastructure
Enrico Granataf58cece2013-03-08 20:29:13 +00004//
Greg Clayton5dbe5d42013-03-21 03:39:51 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Enrico Granataf58cece2013-03-08 20:29:13 +00007//
Greg Clayton5dbe5d42013-03-21 03:39:51 +00008//===----------------------------------------------------------------------===//
Enrico Granataf58cece2013-03-08 20:29:13 +00009
10#include <CoreFoundation/CoreFoundation.h>
11
12#include "lldb-perf/lib/Timer.h"
13#include "lldb-perf/lib/Metric.h"
14#include "lldb-perf/lib/Measurement.h"
15#include "lldb-perf/lib/TestCase.h"
16#include "lldb-perf/lib/Xcode.h"
17
18#include <iostream>
19#include <unistd.h>
20#include <fstream>
21
Greg Clayton7b8f7382013-03-18 22:34:00 +000022using namespace lldb_perf;
Enrico Granataf58cece2013-03-08 20:29:13 +000023
24class SketchTest : public TestCase
25{
26public:
27 SketchTest () :
Greg Clayton1080faf2013-03-19 19:30:33 +000028 m_fetch_frames_measurement ([this] () -> void
29 {
30 Xcode::FetchFrames (GetProcess(),false,false);
31 }, "fetch-frames", "time to dump backtrace for every frame in every thread"),
32 m_file_line_bp_measurement([this] (const char* file, uint32_t line) -> void
33 {
34 Xcode::CreateFileLineBreakpoint(GetTarget(), file, line);
35 }, "file-line-bkpt", "time to set a breakpoint given a file and line"),
36 m_fetch_modules_measurement ([this] () -> void
37 {
38 Xcode::FetchModules(GetTarget());
39 }, "fetch-modules", "time to get info for all modules in the process"),
40 m_fetch_vars_measurement([this] (int depth) -> void
41 {
42 SBProcess process (GetProcess());
43 auto threads_count = process.GetNumThreads();
44 for (size_t thread_num = 0; thread_num < threads_count; thread_num++)
45 {
46 SBThread thread(process.GetThreadAtIndex(thread_num));
47 SBFrame frame(thread.GetFrameAtIndex(0));
48 Xcode::FetchVariables(frame,depth,GetVerbose());
49 }
50 }, "fetch-vars", "time to dump variables for the topmost frame in every thread"),
51 m_run_expr_measurement([this] (SBFrame frame, const char* expr) -> void
52 {
53 SBValue value(frame.EvaluateExpression(expr, lldb::eDynamicCanRunTarget));
54 Xcode::FetchVariable (value, 0, GetVerbose());
55 }, "run-expr", "time to evaluate an expression and display the result")
Enrico Granataf58cece2013-03-08 20:29:13 +000056 {}
57
58 virtual
59 ~SketchTest ()
60 {
61 }
62
Greg Claytone0b924e2013-03-19 04:41:22 +000063 virtual bool
Enrico Granataf58cece2013-03-08 20:29:13 +000064 Setup (int argc, const char** argv)
65 {
Greg Clayton1080faf2013-03-19 19:30:33 +000066 //SetVerbose(true);
Enrico Granata86910572013-03-14 19:00:42 +000067 m_app_path.assign(argv[1]);
68 m_doc_path.assign(argv[2]);
Enrico Granataf58cece2013-03-08 20:29:13 +000069 m_out_path.assign(argv[3]);
70 TestCase::Setup(argc,argv);
71 m_target = m_debugger.CreateTarget(m_app_path.c_str());
72 const char* file_arg = m_doc_path.c_str();
73 const char* persist_arg = "-ApplePersistenceIgnoreState";
74 const char* persist_skip = "YES";
75 const char* empty = nullptr;
76 const char* args[] = {file_arg,persist_arg,persist_skip,empty};
Greg Claytone0b924e2013-03-19 04:41:22 +000077 SBLaunchInfo launch_info (args);
Greg Clayton1080faf2013-03-19 19:30:33 +000078 m_file_line_bp_measurement("SKTDocument.m",245);
79 m_file_line_bp_measurement("SKTDocument.m",283);
80 m_file_line_bp_measurement("SKTText.m",326);
Greg Claytone0b924e2013-03-19 04:41:22 +000081 return Launch (launch_info);
Enrico Granataf58cece2013-03-08 20:29:13 +000082 }
83
84 void
85 DoTest ()
86 {
Greg Clayton1080faf2013-03-19 19:30:33 +000087 m_fetch_frames_measurement();
88 m_fetch_modules_measurement();
89 m_fetch_vars_measurement(1);
Enrico Granataf58cece2013-03-08 20:29:13 +000090 }
91
Greg Clayton7b8f7382013-03-18 22:34:00 +000092 virtual void
93 TestStep (int counter, ActionWanted &next_action)
Enrico Granataf58cece2013-03-08 20:29:13 +000094 {
Greg Clayton7b8f7382013-03-18 22:34:00 +000095 switch (counter)
96 {
97 case 0:
98 {
99 DoTest ();
Greg Clayton1080faf2013-03-19 19:30:33 +0000100 m_file_line_bp_measurement("SKTDocument.m",254);
Greg Clayton7b8f7382013-03-18 22:34:00 +0000101 next_action.Continue();
102 }
103 break;
104
105 case 1:
106 {
107 DoTest ();
Greg Claytone0b924e2013-03-19 04:41:22 +0000108 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"properties");
109 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"[properties description]");
110 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"typeName");
111 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"data");
112 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"[data description]");
Greg Clayton7b8f7382013-03-18 22:34:00 +0000113 next_action.Continue();
114 }
115 break;
116
117 case 2:
118 {
119 DoTest ();
120 next_action.Continue();
121 }
122 break;
123
124 case 3:
125 {
126 DoTest ();
Greg Claytone0b924e2013-03-19 04:41:22 +0000127 next_action.StepOver(m_thread);
Greg Clayton7b8f7382013-03-18 22:34:00 +0000128 }
129 break;
130
131 case 4:
132 {
133 DoTest ();
Greg Claytone0b924e2013-03-19 04:41:22 +0000134 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"layoutManager");
135 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"contents");
136 next_action.StepOver(m_thread);
Greg Clayton7b8f7382013-03-18 22:34:00 +0000137 }
138 break;
139
140 case 5:
141 {
142 DoTest ();
Greg Claytone0b924e2013-03-19 04:41:22 +0000143 next_action.StepOver(m_thread);
Greg Clayton7b8f7382013-03-18 22:34:00 +0000144 }
145 break;
146
147 case 6:
148 {
149 DoTest ();
Greg Claytone0b924e2013-03-19 04:41:22 +0000150 next_action.StepOver(m_thread);
Greg Clayton7b8f7382013-03-18 22:34:00 +0000151 }
152 break;
153
154 case 7:
155 {
156 DoTest ();
Greg Claytone0b924e2013-03-19 04:41:22 +0000157 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"@\"an NSString\"");
158 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"[(id)@\"an NSString\" description]");
159 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"@[@1,@2,@3]");
160 next_action.StepOut(m_thread);
Greg Clayton7b8f7382013-03-18 22:34:00 +0000161 }
162 break;
163
164 case 8:
165 {
166 DoTest ();
Greg Claytone0b924e2013-03-19 04:41:22 +0000167 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"[graphics description]");
168 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"[selectionIndexes description]");
169 m_run_expr_measurement(m_thread.GetFrameAtIndex(0),"(BOOL)NSIntersectsRect(rect, graphicDrawingBounds)");
Greg Clayton7b8f7382013-03-18 22:34:00 +0000170 next_action.Kill();
171 }
172 break;
173
174 default:
175 {
176 next_action.Kill();
177 }
178 break;
Enrico Granataf58cece2013-03-08 20:29:13 +0000179 }
Enrico Granataf58cece2013-03-08 20:29:13 +0000180 }
181
182 void
183 Results ()
184 {
Enrico Granataf58cece2013-03-08 20:29:13 +0000185 CFCMutableArray array;
Enrico Granata24ccabf2013-03-08 20:50:36 +0000186 m_fetch_frames_measurement.Write(array);
187 m_file_line_bp_measurement.Write(array);
188 m_fetch_modules_measurement.Write(array);
189 m_fetch_vars_measurement.Write(array);
190 m_run_expr_measurement.Write(array);
Enrico Granataf58cece2013-03-08 20:29:13 +0000191
192 CFDataRef xmlData = CFPropertyListCreateData(kCFAllocatorDefault, array.get(), kCFPropertyListXMLFormat_v1_0, 0, NULL);
193
194 CFURLRef file = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)m_out_path.c_str(), m_out_path.size(), FALSE);
195
196 CFURLWriteDataAndPropertiesToResource(file,xmlData,NULL,NULL);
197 }
198
199private:
Greg Clayton1080faf2013-03-19 19:30:33 +0000200 Measurement<lldb_perf::TimeGauge, std::function<void()>> m_fetch_frames_measurement;
201 Measurement<lldb_perf::TimeGauge, std::function<void(const char*, uint32_t)>> m_file_line_bp_measurement;
202 Measurement<lldb_perf::TimeGauge, std::function<void()>> m_fetch_modules_measurement;
203 Measurement<lldb_perf::TimeGauge, std::function<void(int)>> m_fetch_vars_measurement;
204 Measurement<lldb_perf::TimeGauge, std::function<void(SBFrame, const char*)>> m_run_expr_measurement;
Enrico Granataf58cece2013-03-08 20:29:13 +0000205
Enrico Granataf58cece2013-03-08 20:29:13 +0000206 std::string m_app_path;
207 std::string m_doc_path;
208 std::string m_out_path;
209};
210
211// argv[1] == path to app
212// argv[2] == path to document
213// argv[3] == path to result
214int main(int argc, const char * argv[])
215{
216 SketchTest skt;
217 TestCase::Run(skt,argc,argv);
218 return 0;
219}
220