annotate libc/utils/benchmarks/JSON.cpp @ 204:e348f3e5c8b2

ReadFromString worked.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 05 Jun 2021 15:35:13 +0900
parents 0572611fdcc8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1 //===-- JSON serialization routines ---------------------------------------===//
150
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "JSON.h"
anatofuz
parents:
diff changeset
10 #include "LibcBenchmark.h"
anatofuz
parents:
diff changeset
11 #include "llvm/ADT/DenseSet.h"
anatofuz
parents:
diff changeset
12 #include "llvm/ADT/SmallVector.h"
anatofuz
parents:
diff changeset
13 #include "llvm/ADT/StringRef.h"
anatofuz
parents:
diff changeset
14 #include "llvm/ADT/StringSwitch.h"
anatofuz
parents:
diff changeset
15 #include "llvm/Support/Errc.h"
anatofuz
parents:
diff changeset
16 #include "llvm/Support/Error.h"
anatofuz
parents:
diff changeset
17 #include "llvm/Support/ErrorHandling.h"
anatofuz
parents:
diff changeset
18 #include "llvm/Support/JSON.h"
anatofuz
parents:
diff changeset
19 #include "llvm/Support/MathExtras.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
20
150
anatofuz
parents:
diff changeset
21 #include <chrono>
anatofuz
parents:
diff changeset
22 #include <limits>
anatofuz
parents:
diff changeset
23 #include <memory>
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
24 #include <string>
150
anatofuz
parents:
diff changeset
25 #include <vector>
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 namespace llvm {
anatofuz
parents:
diff changeset
28 namespace libc_benchmarks {
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 template <typename T>
anatofuz
parents:
diff changeset
31 static Error intFromJsonTemplate(const json::Value &V, T &Out) {
anatofuz
parents:
diff changeset
32 if (const auto &MaybeInt64 = V.getAsInteger()) {
anatofuz
parents:
diff changeset
33 int64_t Value = *MaybeInt64;
anatofuz
parents:
diff changeset
34 if (Value < std::numeric_limits<T>::min() ||
anatofuz
parents:
diff changeset
35 Value > std::numeric_limits<T>::max())
anatofuz
parents:
diff changeset
36 return createStringError(errc::io_error, "Out of bound Integer");
anatofuz
parents:
diff changeset
37 Out = Value;
anatofuz
parents:
diff changeset
38 return Error::success();
anatofuz
parents:
diff changeset
39 }
anatofuz
parents:
diff changeset
40 return createStringError(errc::io_error, "Can't parse Integer");
anatofuz
parents:
diff changeset
41 }
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 static Error fromJson(const json::Value &V, double &Out) {
anatofuz
parents:
diff changeset
44 if (auto S = V.getAsNumber()) {
anatofuz
parents:
diff changeset
45 Out = *S;
anatofuz
parents:
diff changeset
46 return Error::success();
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48 return createStringError(errc::io_error, "Can't parse Double");
anatofuz
parents:
diff changeset
49 }
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 static Error fromJson(const json::Value &V, std::string &Out) {
anatofuz
parents:
diff changeset
52 if (auto S = V.getAsString()) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
53 Out = std::string(*S);
150
anatofuz
parents:
diff changeset
54 return Error::success();
anatofuz
parents:
diff changeset
55 }
anatofuz
parents:
diff changeset
56 return createStringError(errc::io_error, "Can't parse String");
anatofuz
parents:
diff changeset
57 }
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 static Error fromJson(const json::Value &V, uint32_t &Out) {
anatofuz
parents:
diff changeset
60 return intFromJsonTemplate(V, Out);
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 static Error fromJson(const json::Value &V, uint8_t &Out) {
anatofuz
parents:
diff changeset
64 return intFromJsonTemplate(V, Out);
anatofuz
parents:
diff changeset
65 }
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 static Error fromJson(const json::Value &V, int &Out) {
anatofuz
parents:
diff changeset
68 return intFromJsonTemplate(V, Out);
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 static Error fromJson(const json::Value &V, libc_benchmarks::Duration &D) {
anatofuz
parents:
diff changeset
72 if (V.kind() != json::Value::Kind::Number)
anatofuz
parents:
diff changeset
73 return createStringError(errc::io_error, "Can't parse Duration");
anatofuz
parents:
diff changeset
74 D = libc_benchmarks::Duration(*V.getAsNumber());
anatofuz
parents:
diff changeset
75 return Error::success();
anatofuz
parents:
diff changeset
76 }
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 static Error fromJson(const json::Value &V, MaybeAlign &Out) {
anatofuz
parents:
diff changeset
79 const auto MaybeInt = V.getAsInteger();
anatofuz
parents:
diff changeset
80 if (!MaybeInt)
anatofuz
parents:
diff changeset
81 return createStringError(errc::io_error,
anatofuz
parents:
diff changeset
82 "Can't parse Align, not an Integer");
anatofuz
parents:
diff changeset
83 const int64_t Value = *MaybeInt;
anatofuz
parents:
diff changeset
84 if (!Value) {
anatofuz
parents:
diff changeset
85 Out = None;
anatofuz
parents:
diff changeset
86 return Error::success();
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88 if (isPowerOf2_64(Value)) {
anatofuz
parents:
diff changeset
89 Out = Align(Value);
anatofuz
parents:
diff changeset
90 return Error::success();
anatofuz
parents:
diff changeset
91 }
anatofuz
parents:
diff changeset
92 return createStringError(errc::io_error,
anatofuz
parents:
diff changeset
93 "Can't parse Align, not a power of two");
anatofuz
parents:
diff changeset
94 }
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 static Error fromJson(const json::Value &V,
anatofuz
parents:
diff changeset
97 libc_benchmarks::BenchmarkLog &Out) {
anatofuz
parents:
diff changeset
98 if (V.kind() != json::Value::Kind::String)
anatofuz
parents:
diff changeset
99 return createStringError(errc::io_error,
anatofuz
parents:
diff changeset
100 "Can't parse BenchmarkLog, not a String");
anatofuz
parents:
diff changeset
101 const auto String = *V.getAsString();
anatofuz
parents:
diff changeset
102 auto Parsed =
anatofuz
parents:
diff changeset
103 llvm::StringSwitch<Optional<libc_benchmarks::BenchmarkLog>>(String)
anatofuz
parents:
diff changeset
104 .Case("None", libc_benchmarks::BenchmarkLog::None)
anatofuz
parents:
diff changeset
105 .Case("Last", libc_benchmarks::BenchmarkLog::Last)
anatofuz
parents:
diff changeset
106 .Case("Full", libc_benchmarks::BenchmarkLog::Full)
anatofuz
parents:
diff changeset
107 .Default(None);
anatofuz
parents:
diff changeset
108 if (!Parsed)
anatofuz
parents:
diff changeset
109 return createStringError(errc::io_error,
anatofuz
parents:
diff changeset
110 Twine("Can't parse BenchmarkLog, invalid value '")
anatofuz
parents:
diff changeset
111 .concat(String)
anatofuz
parents:
diff changeset
112 .concat("'"));
anatofuz
parents:
diff changeset
113 Out = *Parsed;
anatofuz
parents:
diff changeset
114 return Error::success();
anatofuz
parents:
diff changeset
115 }
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 template <typename C>
anatofuz
parents:
diff changeset
118 Error vectorFromJsonTemplate(const json::Value &V, C &Out) {
anatofuz
parents:
diff changeset
119 auto *A = V.getAsArray();
anatofuz
parents:
diff changeset
120 if (!A)
anatofuz
parents:
diff changeset
121 return createStringError(errc::io_error, "Can't parse Array");
anatofuz
parents:
diff changeset
122 Out.clear();
anatofuz
parents:
diff changeset
123 Out.resize(A->size());
anatofuz
parents:
diff changeset
124 for (auto InOutPair : llvm::zip(*A, Out))
anatofuz
parents:
diff changeset
125 if (auto E = fromJson(std::get<0>(InOutPair), std::get<1>(InOutPair)))
anatofuz
parents:
diff changeset
126 return std::move(E);
anatofuz
parents:
diff changeset
127 return Error::success();
anatofuz
parents:
diff changeset
128 }
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 template <typename T>
anatofuz
parents:
diff changeset
131 static Error fromJson(const json::Value &V, std::vector<T> &Out) {
anatofuz
parents:
diff changeset
132 return vectorFromJsonTemplate(V, Out);
anatofuz
parents:
diff changeset
133 }
anatofuz
parents:
diff changeset
134
anatofuz
parents:
diff changeset
135 template <typename T>
anatofuz
parents:
diff changeset
136 static Error fromJson(const json::Value &V, SmallVectorImpl<T> &Out) {
anatofuz
parents:
diff changeset
137 return vectorFromJsonTemplate(V, Out);
anatofuz
parents:
diff changeset
138 }
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140 // Same as llvm::json::ObjectMapper but adds a finer error reporting mechanism.
anatofuz
parents:
diff changeset
141 class JsonObjectMapper {
anatofuz
parents:
diff changeset
142 const json::Object *O;
anatofuz
parents:
diff changeset
143 Error E;
anatofuz
parents:
diff changeset
144 SmallDenseSet<StringRef> SeenFields;
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 public:
anatofuz
parents:
diff changeset
147 explicit JsonObjectMapper(const json::Value &V)
anatofuz
parents:
diff changeset
148 : O(V.getAsObject()),
anatofuz
parents:
diff changeset
149 E(O ? Error::success()
anatofuz
parents:
diff changeset
150 : createStringError(errc::io_error, "Expected JSON Object")) {}
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152 Error takeError() {
anatofuz
parents:
diff changeset
153 if (E)
anatofuz
parents:
diff changeset
154 return std::move(E);
anatofuz
parents:
diff changeset
155 for (const auto &Itr : *O) {
anatofuz
parents:
diff changeset
156 const StringRef Key = Itr.getFirst();
anatofuz
parents:
diff changeset
157 if (!SeenFields.count(Key))
anatofuz
parents:
diff changeset
158 E = createStringError(errc::io_error,
anatofuz
parents:
diff changeset
159 Twine("Unknown field: ").concat(Key));
anatofuz
parents:
diff changeset
160 }
anatofuz
parents:
diff changeset
161 return std::move(E);
anatofuz
parents:
diff changeset
162 }
anatofuz
parents:
diff changeset
163
anatofuz
parents:
diff changeset
164 template <typename T> void map(StringRef Key, T &Out) {
anatofuz
parents:
diff changeset
165 if (E)
anatofuz
parents:
diff changeset
166 return;
anatofuz
parents:
diff changeset
167 if (const json::Value *Value = O->get(Key)) {
anatofuz
parents:
diff changeset
168 SeenFields.insert(Key);
anatofuz
parents:
diff changeset
169 E = fromJson(*Value, Out);
anatofuz
parents:
diff changeset
170 }
anatofuz
parents:
diff changeset
171 }
anatofuz
parents:
diff changeset
172 };
anatofuz
parents:
diff changeset
173
anatofuz
parents:
diff changeset
174 static Error fromJson(const json::Value &V,
anatofuz
parents:
diff changeset
175 libc_benchmarks::BenchmarkOptions &Out) {
anatofuz
parents:
diff changeset
176 JsonObjectMapper O(V);
anatofuz
parents:
diff changeset
177 O.map("MinDuration", Out.MinDuration);
anatofuz
parents:
diff changeset
178 O.map("MaxDuration", Out.MaxDuration);
anatofuz
parents:
diff changeset
179 O.map("InitialIterations", Out.InitialIterations);
anatofuz
parents:
diff changeset
180 O.map("MaxIterations", Out.MaxIterations);
anatofuz
parents:
diff changeset
181 O.map("MinSamples", Out.MinSamples);
anatofuz
parents:
diff changeset
182 O.map("MaxSamples", Out.MaxSamples);
anatofuz
parents:
diff changeset
183 O.map("Epsilon", Out.Epsilon);
anatofuz
parents:
diff changeset
184 O.map("ScalingFactor", Out.ScalingFactor);
anatofuz
parents:
diff changeset
185 O.map("Log", Out.Log);
anatofuz
parents:
diff changeset
186 return O.takeError();
anatofuz
parents:
diff changeset
187 }
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 static Error fromJson(const json::Value &V, libc_benchmarks::SizeRange &Out) {
anatofuz
parents:
diff changeset
190 JsonObjectMapper O(V);
anatofuz
parents:
diff changeset
191 O.map("From", Out.From);
anatofuz
parents:
diff changeset
192 O.map("To", Out.To);
anatofuz
parents:
diff changeset
193 O.map("Step", Out.Step);
anatofuz
parents:
diff changeset
194 return O.takeError();
anatofuz
parents:
diff changeset
195 }
anatofuz
parents:
diff changeset
196
anatofuz
parents:
diff changeset
197 static Error fromJson(const json::Value &V,
anatofuz
parents:
diff changeset
198 libc_benchmarks::StudyConfiguration &Out) {
anatofuz
parents:
diff changeset
199 JsonObjectMapper O(V);
anatofuz
parents:
diff changeset
200 O.map("Runs", Out.Runs);
anatofuz
parents:
diff changeset
201 O.map("BufferSize", Out.BufferSize);
anatofuz
parents:
diff changeset
202 O.map("Size", Out.Size);
anatofuz
parents:
diff changeset
203 O.map("AddressAlignment", Out.AddressAlignment);
anatofuz
parents:
diff changeset
204 O.map("MemsetValue", Out.MemsetValue);
anatofuz
parents:
diff changeset
205 O.map("MemcmpMismatchAt", Out.MemcmpMismatchAt);
anatofuz
parents:
diff changeset
206 return O.takeError();
anatofuz
parents:
diff changeset
207 }
anatofuz
parents:
diff changeset
208
anatofuz
parents:
diff changeset
209 static Error fromJson(const json::Value &V, libc_benchmarks::CacheInfo &Out) {
anatofuz
parents:
diff changeset
210 JsonObjectMapper O(V);
anatofuz
parents:
diff changeset
211 O.map("Type", Out.Type);
anatofuz
parents:
diff changeset
212 O.map("Level", Out.Level);
anatofuz
parents:
diff changeset
213 O.map("Size", Out.Size);
anatofuz
parents:
diff changeset
214 O.map("NumSharing", Out.NumSharing);
anatofuz
parents:
diff changeset
215 return O.takeError();
anatofuz
parents:
diff changeset
216 }
anatofuz
parents:
diff changeset
217
anatofuz
parents:
diff changeset
218 static Error fromJson(const json::Value &V, libc_benchmarks::HostState &Out) {
anatofuz
parents:
diff changeset
219 JsonObjectMapper O(V);
anatofuz
parents:
diff changeset
220 O.map("CpuName", Out.CpuName);
anatofuz
parents:
diff changeset
221 O.map("CpuFrequency", Out.CpuFrequency);
anatofuz
parents:
diff changeset
222 O.map("Caches", Out.Caches);
anatofuz
parents:
diff changeset
223 return O.takeError();
anatofuz
parents:
diff changeset
224 }
anatofuz
parents:
diff changeset
225
anatofuz
parents:
diff changeset
226 static Error fromJson(const json::Value &V,
anatofuz
parents:
diff changeset
227 libc_benchmarks::FunctionMeasurements &Out) {
anatofuz
parents:
diff changeset
228 JsonObjectMapper O(V);
anatofuz
parents:
diff changeset
229 O.map("Name", Out.Name);
anatofuz
parents:
diff changeset
230 std::vector<uint32_t> Sizes;
anatofuz
parents:
diff changeset
231 O.map("Sizes", Sizes);
anatofuz
parents:
diff changeset
232 std::vector<libc_benchmarks::Duration> Runtimes;
anatofuz
parents:
diff changeset
233 O.map("Runtimes", Runtimes);
anatofuz
parents:
diff changeset
234 if (Sizes.size() != Runtimes.size())
anatofuz
parents:
diff changeset
235 return createStringError(errc::io_error,
anatofuz
parents:
diff changeset
236 "Measurement Size and Runtime mistmatch");
anatofuz
parents:
diff changeset
237 Out.Measurements.resize(Sizes.size());
anatofuz
parents:
diff changeset
238 for (size_t I = 0; I < Sizes.size(); ++I) {
anatofuz
parents:
diff changeset
239 Out.Measurements[I].Size = Sizes[I];
anatofuz
parents:
diff changeset
240 Out.Measurements[I].Runtime = Runtimes[I];
anatofuz
parents:
diff changeset
241 }
anatofuz
parents:
diff changeset
242 return O.takeError();
anatofuz
parents:
diff changeset
243 }
anatofuz
parents:
diff changeset
244
anatofuz
parents:
diff changeset
245 static Error fromJson(const json::Value &V, libc_benchmarks::Study &Out) {
anatofuz
parents:
diff changeset
246 JsonObjectMapper O(V);
anatofuz
parents:
diff changeset
247 O.map("Host", Out.Host);
anatofuz
parents:
diff changeset
248 O.map("Options", Out.Options);
anatofuz
parents:
diff changeset
249 O.map("Configuration", Out.Configuration);
anatofuz
parents:
diff changeset
250 O.map("Functions", Out.Functions);
anatofuz
parents:
diff changeset
251 return O.takeError();
anatofuz
parents:
diff changeset
252 }
anatofuz
parents:
diff changeset
253
anatofuz
parents:
diff changeset
254 static double Seconds(const Duration &D) {
anatofuz
parents:
diff changeset
255 return std::chrono::duration<double>(D).count();
anatofuz
parents:
diff changeset
256 }
anatofuz
parents:
diff changeset
257
anatofuz
parents:
diff changeset
258 Expected<Study> ParseJsonStudy(StringRef Content) {
anatofuz
parents:
diff changeset
259 Expected<json::Value> EV = json::parse(Content);
anatofuz
parents:
diff changeset
260 if (!EV)
anatofuz
parents:
diff changeset
261 return EV.takeError();
anatofuz
parents:
diff changeset
262 Study S;
anatofuz
parents:
diff changeset
263 if (Error E = fromJson(*EV, S))
anatofuz
parents:
diff changeset
264 return std::move(E);
anatofuz
parents:
diff changeset
265 return S;
anatofuz
parents:
diff changeset
266 }
anatofuz
parents:
diff changeset
267
anatofuz
parents:
diff changeset
268 static StringRef Serialize(const BenchmarkLog &L) {
anatofuz
parents:
diff changeset
269 switch (L) {
anatofuz
parents:
diff changeset
270 case BenchmarkLog::None:
anatofuz
parents:
diff changeset
271 return "None";
anatofuz
parents:
diff changeset
272 case BenchmarkLog::Last:
anatofuz
parents:
diff changeset
273 return "Last";
anatofuz
parents:
diff changeset
274 case BenchmarkLog::Full:
anatofuz
parents:
diff changeset
275 return "Full";
anatofuz
parents:
diff changeset
276 }
anatofuz
parents:
diff changeset
277 llvm_unreachable("Unhandled BenchmarkLog value");
anatofuz
parents:
diff changeset
278 }
anatofuz
parents:
diff changeset
279
anatofuz
parents:
diff changeset
280 static void Serialize(const BenchmarkOptions &BO, json::OStream &JOS) {
anatofuz
parents:
diff changeset
281 JOS.object([&]() {
anatofuz
parents:
diff changeset
282 JOS.attribute("MinDuration", Seconds(BO.MinDuration));
anatofuz
parents:
diff changeset
283 JOS.attribute("MaxDuration", Seconds(BO.MaxDuration));
anatofuz
parents:
diff changeset
284 JOS.attribute("InitialIterations", BO.InitialIterations);
anatofuz
parents:
diff changeset
285 JOS.attribute("MaxIterations", BO.MaxIterations);
anatofuz
parents:
diff changeset
286 JOS.attribute("MinSamples", BO.MinSamples);
anatofuz
parents:
diff changeset
287 JOS.attribute("MaxSamples", BO.MaxSamples);
anatofuz
parents:
diff changeset
288 JOS.attribute("Epsilon", BO.Epsilon);
anatofuz
parents:
diff changeset
289 JOS.attribute("ScalingFactor", BO.ScalingFactor);
anatofuz
parents:
diff changeset
290 JOS.attribute("Log", Serialize(BO.Log));
anatofuz
parents:
diff changeset
291 });
anatofuz
parents:
diff changeset
292 }
anatofuz
parents:
diff changeset
293
anatofuz
parents:
diff changeset
294 static void Serialize(const CacheInfo &CI, json::OStream &JOS) {
anatofuz
parents:
diff changeset
295 JOS.object([&]() {
anatofuz
parents:
diff changeset
296 JOS.attribute("Type", CI.Type);
anatofuz
parents:
diff changeset
297 JOS.attribute("Level", CI.Level);
anatofuz
parents:
diff changeset
298 JOS.attribute("Size", CI.Size);
anatofuz
parents:
diff changeset
299 JOS.attribute("NumSharing", CI.NumSharing);
anatofuz
parents:
diff changeset
300 });
anatofuz
parents:
diff changeset
301 }
anatofuz
parents:
diff changeset
302
anatofuz
parents:
diff changeset
303 static void Serialize(const HostState &HS, json::OStream &JOS) {
anatofuz
parents:
diff changeset
304 JOS.object([&]() {
anatofuz
parents:
diff changeset
305 JOS.attribute("CpuName", HS.CpuName);
anatofuz
parents:
diff changeset
306 JOS.attribute("CpuFrequency", HS.CpuFrequency);
anatofuz
parents:
diff changeset
307 JOS.attributeArray("Caches", [&]() {
anatofuz
parents:
diff changeset
308 for (const auto &CI : HS.Caches)
anatofuz
parents:
diff changeset
309 Serialize(CI, JOS);
anatofuz
parents:
diff changeset
310 });
anatofuz
parents:
diff changeset
311 });
anatofuz
parents:
diff changeset
312 }
anatofuz
parents:
diff changeset
313
anatofuz
parents:
diff changeset
314 static void Serialize(const StudyConfiguration &SC, json::OStream &JOS) {
anatofuz
parents:
diff changeset
315 JOS.object([&]() {
anatofuz
parents:
diff changeset
316 JOS.attribute("Runs", SC.Runs);
anatofuz
parents:
diff changeset
317 JOS.attribute("BufferSize", SC.BufferSize);
anatofuz
parents:
diff changeset
318 JOS.attributeObject("Size", [&]() {
anatofuz
parents:
diff changeset
319 JOS.attribute("From", SC.Size.From);
anatofuz
parents:
diff changeset
320 JOS.attribute("To", SC.Size.To);
anatofuz
parents:
diff changeset
321 JOS.attribute("Step", SC.Size.Step);
anatofuz
parents:
diff changeset
322 });
anatofuz
parents:
diff changeset
323 if (SC.AddressAlignment)
anatofuz
parents:
diff changeset
324 JOS.attribute("AddressAlignment",
anatofuz
parents:
diff changeset
325 static_cast<int64_t>(SC.AddressAlignment->value()));
anatofuz
parents:
diff changeset
326 JOS.attribute("MemsetValue", SC.MemsetValue);
anatofuz
parents:
diff changeset
327 JOS.attribute("MemcmpMismatchAt", SC.MemcmpMismatchAt);
anatofuz
parents:
diff changeset
328 });
anatofuz
parents:
diff changeset
329 }
anatofuz
parents:
diff changeset
330
anatofuz
parents:
diff changeset
331 static void Serialize(const FunctionMeasurements &FM, json::OStream &JOS) {
anatofuz
parents:
diff changeset
332 JOS.object([&]() {
anatofuz
parents:
diff changeset
333 JOS.attribute("Name", FM.Name);
anatofuz
parents:
diff changeset
334 JOS.attributeArray("Sizes", [&]() {
anatofuz
parents:
diff changeset
335 for (const auto &M : FM.Measurements)
anatofuz
parents:
diff changeset
336 JOS.value(M.Size);
anatofuz
parents:
diff changeset
337 });
anatofuz
parents:
diff changeset
338 JOS.attributeArray("Runtimes", [&]() {
anatofuz
parents:
diff changeset
339 for (const auto &M : FM.Measurements)
anatofuz
parents:
diff changeset
340 JOS.value(Seconds(M.Runtime));
anatofuz
parents:
diff changeset
341 });
anatofuz
parents:
diff changeset
342 });
anatofuz
parents:
diff changeset
343 }
anatofuz
parents:
diff changeset
344
anatofuz
parents:
diff changeset
345 void SerializeToJson(const Study &S, json::OStream &JOS) {
anatofuz
parents:
diff changeset
346 JOS.object([&]() {
anatofuz
parents:
diff changeset
347 JOS.attributeBegin("Host");
anatofuz
parents:
diff changeset
348 Serialize(S.Host, JOS);
anatofuz
parents:
diff changeset
349 JOS.attributeEnd();
anatofuz
parents:
diff changeset
350
anatofuz
parents:
diff changeset
351 JOS.attributeBegin("Options");
anatofuz
parents:
diff changeset
352 Serialize(S.Options, JOS);
anatofuz
parents:
diff changeset
353 JOS.attributeEnd();
anatofuz
parents:
diff changeset
354
anatofuz
parents:
diff changeset
355 JOS.attributeBegin("Configuration");
anatofuz
parents:
diff changeset
356 Serialize(S.Configuration, JOS);
anatofuz
parents:
diff changeset
357 JOS.attributeEnd();
anatofuz
parents:
diff changeset
358
anatofuz
parents:
diff changeset
359 if (!S.Functions.empty()) {
anatofuz
parents:
diff changeset
360 JOS.attributeArray("Functions", [&]() {
anatofuz
parents:
diff changeset
361 for (const auto &FM : S.Functions)
anatofuz
parents:
diff changeset
362 Serialize(FM, JOS);
anatofuz
parents:
diff changeset
363 });
anatofuz
parents:
diff changeset
364 }
anatofuz
parents:
diff changeset
365 });
anatofuz
parents:
diff changeset
366 }
anatofuz
parents:
diff changeset
367
anatofuz
parents:
diff changeset
368 } // namespace libc_benchmarks
anatofuz
parents:
diff changeset
369 } // namespace llvm