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