]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/lldb-perf/darwin/formatters/formatters.cpp
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / tools / lldb-perf / darwin / formatters / formatters.cpp
1 //===-- formatters.cpp ------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include <CoreFoundation/CoreFoundation.h>
11
12 #include "lldb-perf/lib/Measurement.h"
13 #include "lldb-perf/lib/Metric.h"
14 #include "lldb-perf/lib/TestCase.h"
15 #include "lldb-perf/lib/Timer.h"
16 #include "lldb-perf/lib/Xcode.h"
17
18 #include <fstream>
19 #include <iostream>
20 #include <unistd.h>
21
22 using namespace lldb_perf;
23
24 class FormattersTest : public TestCase {
25 public:
26   FormattersTest() : TestCase() {
27     m_dump_std_vector_measurement = CreateTimeMeasurement(
28         [](SBValue value) -> void {
29           lldb_perf::Xcode::FetchVariable(value, 1, false);
30         },
31         "std-vector", "time to dump an std::vector");
32     m_dump_std_list_measurement = CreateTimeMeasurement(
33         [](SBValue value) -> void {
34           lldb_perf::Xcode::FetchVariable(value, 1, false);
35         },
36         "std-list", "time to dump an std::list");
37     m_dump_std_map_measurement = CreateTimeMeasurement(
38         [](SBValue value) -> void {
39           lldb_perf::Xcode::FetchVariable(value, 1, false);
40         },
41         "std-map", "time to dump an std::map");
42
43     // use this in manual mode
44     m_dump_std_string_measurement = CreateTimeMeasurement(
45         []() -> void {}, "std-string", "time to dump an std::string");
46
47     m_dump_nsstring_measurement = CreateTimeMeasurement(
48         [](SBValue value) -> void {
49           lldb_perf::Xcode::FetchVariable(value, 0, false);
50         },
51         "ns-string", "time to dump an NSString");
52
53     m_dump_nsarray_measurement = CreateTimeMeasurement(
54         [](SBValue value) -> void {
55           lldb_perf::Xcode::FetchVariable(value, 1, false);
56         },
57         "ns-array", "time to dump an NSArray");
58
59     m_dump_nsdictionary_measurement = CreateTimeMeasurement(
60         [](SBValue value) -> void {
61           lldb_perf::Xcode::FetchVariable(value, 1, false);
62         },
63         "ns-dictionary", "time to dump an NSDictionary");
64
65     m_dump_nsset_measurement = CreateTimeMeasurement(
66         [](SBValue value) -> void {
67           lldb_perf::Xcode::FetchVariable(value, 1, false);
68         },
69         "ns-set", "time to dump an NSSet");
70
71     m_dump_nsbundle_measurement = CreateTimeMeasurement(
72         [](SBValue value) -> void {
73           lldb_perf::Xcode::FetchVariable(value, 1, false);
74         },
75         "ns-bundle", "time to dump an NSBundle");
76
77     m_dump_nsdate_measurement = CreateTimeMeasurement(
78         [](SBValue value) -> void {
79           lldb_perf::Xcode::FetchVariable(value, 0, false);
80         },
81         "ns-date", "time to dump an NSDate");
82   }
83
84   virtual ~FormattersTest() {}
85
86   virtual bool Setup(int &argc, const char **&argv) {
87     m_app_path.assign(argv[1]);
88     m_out_path.assign(argv[2]);
89     m_target = m_debugger.CreateTarget(m_app_path.c_str());
90     m_target.BreakpointCreateByName("main");
91     SBLaunchInfo launch_info(argv);
92     return Launch(launch_info);
93   }
94
95   void DoTest() {
96     SBFrame frame_zero(m_thread.GetFrameAtIndex(0));
97
98     m_dump_nsarray_measurement(
99         frame_zero.FindVariable("nsarray", lldb::eDynamicCanRunTarget));
100     m_dump_nsarray_measurement(
101         frame_zero.FindVariable("nsmutablearray", lldb::eDynamicCanRunTarget));
102
103     m_dump_nsdictionary_measurement(
104         frame_zero.FindVariable("nsdictionary", lldb::eDynamicCanRunTarget));
105     m_dump_nsdictionary_measurement(frame_zero.FindVariable(
106         "nsmutabledictionary", lldb::eDynamicCanRunTarget));
107
108     m_dump_nsstring_measurement(
109         frame_zero.FindVariable("str0", lldb::eDynamicCanRunTarget));
110     m_dump_nsstring_measurement(
111         frame_zero.FindVariable("str1", lldb::eDynamicCanRunTarget));
112     m_dump_nsstring_measurement(
113         frame_zero.FindVariable("str2", lldb::eDynamicCanRunTarget));
114     m_dump_nsstring_measurement(
115         frame_zero.FindVariable("str3", lldb::eDynamicCanRunTarget));
116     m_dump_nsstring_measurement(
117         frame_zero.FindVariable("str4", lldb::eDynamicCanRunTarget));
118
119     m_dump_nsdate_measurement(
120         frame_zero.FindVariable("me", lldb::eDynamicCanRunTarget));
121     m_dump_nsdate_measurement(
122         frame_zero.FindVariable("cutie", lldb::eDynamicCanRunTarget));
123     m_dump_nsdate_measurement(
124         frame_zero.FindVariable("mom", lldb::eDynamicCanRunTarget));
125     m_dump_nsdate_measurement(
126         frame_zero.FindVariable("dad", lldb::eDynamicCanRunTarget));
127     m_dump_nsdate_measurement(
128         frame_zero.FindVariable("today", lldb::eDynamicCanRunTarget));
129
130     m_dump_nsbundle_measurement(
131         frame_zero.FindVariable("bundles", lldb::eDynamicCanRunTarget));
132     m_dump_nsbundle_measurement(
133         frame_zero.FindVariable("frameworks", lldb::eDynamicCanRunTarget));
134
135     m_dump_nsset_measurement(
136         frame_zero.FindVariable("nsset", lldb::eDynamicCanRunTarget));
137     m_dump_nsset_measurement(
138         frame_zero.FindVariable("nsmutableset", lldb::eDynamicCanRunTarget));
139
140     m_dump_std_vector_measurement(
141         frame_zero.FindVariable("vector", lldb::eDynamicCanRunTarget));
142     m_dump_std_list_measurement(
143         frame_zero.FindVariable("list", lldb::eDynamicCanRunTarget));
144     m_dump_std_map_measurement(
145         frame_zero.FindVariable("map", lldb::eDynamicCanRunTarget));
146
147     auto sstr0 = frame_zero.FindVariable("sstr0", lldb::eDynamicCanRunTarget);
148     auto sstr1 = frame_zero.FindVariable("sstr1", lldb::eDynamicCanRunTarget);
149     auto sstr2 = frame_zero.FindVariable("sstr2", lldb::eDynamicCanRunTarget);
150     auto sstr3 = frame_zero.FindVariable("sstr3", lldb::eDynamicCanRunTarget);
151     auto sstr4 = frame_zero.FindVariable("sstr4", lldb::eDynamicCanRunTarget);
152
153     m_dump_std_string_measurement.Start();
154     Xcode::FetchVariable(sstr0, 0, false);
155     m_dump_std_string_measurement.Stop();
156
157     m_dump_std_string_measurement.Start();
158     Xcode::FetchVariable(sstr1, 0, false);
159     m_dump_std_string_measurement.Stop();
160
161     m_dump_std_string_measurement.Start();
162     Xcode::FetchVariable(sstr2, 0, false);
163     m_dump_std_string_measurement.Stop();
164
165     m_dump_std_string_measurement.Start();
166     Xcode::FetchVariable(sstr3, 0, false);
167     m_dump_std_string_measurement.Stop();
168
169     m_dump_std_string_measurement.Start();
170     Xcode::FetchVariable(sstr4, 0, false);
171     m_dump_std_string_measurement.Stop();
172   }
173
174   virtual void TestStep(int counter, ActionWanted &next_action) {
175     switch (counter) {
176     case 0:
177       m_target.BreakpointCreateByLocation("fmts_tester.mm", 78);
178       next_action.Continue();
179       break;
180     case 1:
181       DoTest();
182       next_action.Continue();
183       break;
184     case 2:
185       DoTest();
186       next_action.Continue();
187       break;
188     case 3:
189       DoTest();
190       next_action.Continue();
191       break;
192     case 4:
193       DoTest();
194       next_action.Continue();
195       break;
196     case 5:
197       DoTest();
198       next_action.Continue();
199       break;
200     case 6:
201       DoTest();
202       next_action.Continue();
203       break;
204     case 7:
205       DoTest();
206       next_action.Continue();
207       break;
208     case 8:
209       DoTest();
210       next_action.Continue();
211       break;
212     case 9:
213       DoTest();
214       next_action.Continue();
215       break;
216     case 10:
217       DoTest();
218       next_action.Continue();
219       break;
220     default:
221       next_action.Kill();
222       break;
223     }
224   }
225
226   virtual void WriteResults(Results &results) {
227     m_dump_std_vector_measurement.WriteAverageAndStandardDeviation(results);
228     m_dump_std_list_measurement.WriteAverageAndStandardDeviation(results);
229     m_dump_std_map_measurement.WriteAverageAndStandardDeviation(results);
230     m_dump_std_string_measurement.WriteAverageAndStandardDeviation(results);
231
232     m_dump_nsstring_measurement.WriteAverageAndStandardDeviation(results);
233     m_dump_nsarray_measurement.WriteAverageAndStandardDeviation(results);
234     m_dump_nsdictionary_measurement.WriteAverageAndStandardDeviation(results);
235     m_dump_nsset_measurement.WriteAverageAndStandardDeviation(results);
236     m_dump_nsbundle_measurement.WriteAverageAndStandardDeviation(results);
237     m_dump_nsdate_measurement.WriteAverageAndStandardDeviation(results);
238     results.Write(m_out_path.c_str());
239   }
240
241 private:
242   // C++ formatters
243   TimeMeasurement<std::function<void(SBValue)>> m_dump_std_vector_measurement;
244   TimeMeasurement<std::function<void(SBValue)>> m_dump_std_list_measurement;
245   TimeMeasurement<std::function<void(SBValue)>> m_dump_std_map_measurement;
246   TimeMeasurement<std::function<void()>> m_dump_std_string_measurement;
247
248   // Cocoa formatters
249   TimeMeasurement<std::function<void(SBValue)>> m_dump_nsstring_measurement;
250   TimeMeasurement<std::function<void(SBValue)>> m_dump_nsarray_measurement;
251   TimeMeasurement<std::function<void(SBValue)>> m_dump_nsdictionary_measurement;
252   TimeMeasurement<std::function<void(SBValue)>> m_dump_nsset_measurement;
253   TimeMeasurement<std::function<void(SBValue)>> m_dump_nsbundle_measurement;
254   TimeMeasurement<std::function<void(SBValue)>> m_dump_nsdate_measurement;
255
256   // useful files
257   std::string m_app_path;
258   std::string m_out_path;
259 };
260
261 // argv[1] == path to app
262 // argv[2] == path to result
263 int main(int argc, const char *argv[]) {
264   FormattersTest frmtest;
265   frmtest.SetVerbose(true);
266   TestCase::Run(frmtest, argc, argv);
267   return 0;
268 }