annotate libc/benchmarks/JSON.cpp @ 213:25ca0248ac32

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