12#include "llvm/TargetParser/Triple.h"
22llvm::Expected<TUSummaryEncoding>
31 Object *RootObjectPtr = ExpectedJSON->getAsObject();
46 auto ExpectedEncoding = readTUSummaryEncodingFromObject(*RootObjectPtr);
47 if (!ExpectedEncoding) {
53 return std::move(*ExpectedEncoding);
57JSONFormat::readTUSummaryEncodingFromObject(
const Object &RootObject) {
58 auto OptTargetTriple = RootObject.getString(
"target_triple");
59 if (!OptTargetTriple) {
62 "TargetTriple",
"target_triple",
"string")
73 llvm::Triple T(*OptTargetTriple);
75 const Object *TUNamespaceObject = RootObject.getObject(
"tu_namespace");
76 if (!TUNamespaceObject) {
79 "BuildNamespace",
"tu_namespace",
"object")
83 auto ExpectedTUNamespace = buildNamespaceFromJSON(*TUNamespaceObject);
84 if (!ExpectedTUNamespace) {
91 TUSummaryEncoding
Encoding(std::move(T), std::move(*ExpectedTUNamespace));
94 const Array *IdTableArray = RootObject.getArray(
"id_table");
98 "IdTable",
"id_table",
"array")
102 auto ExpectedIdTable = tuEntityIdTableFromJSON(*IdTableArray);
103 if (!ExpectedIdTable) {
109 getIdTable(Encoding) = std::move(*ExpectedIdTable);
113 const Array *LinkageTableArray = RootObject.getArray(
"linkage_table");
114 if (!LinkageTableArray) {
117 "LinkageTable",
"linkage_table",
"array")
121 auto ExpectedIdRange =
122 llvm::make_second_range(getEntities(getIdTable(Encoding)));
123 std::set<EntityId> ExpectedIds(ExpectedIdRange.begin(),
124 ExpectedIdRange.end());
128 auto ExpectedLinkageTable =
129 linkageTableFromJSON(*LinkageTableArray, std::move(ExpectedIds));
130 if (!ExpectedLinkageTable) {
137 getLinkageTable(Encoding) = std::move(*ExpectedLinkageTable);
141 const Array *SummaryDataArray = RootObject.getArray(
"data");
142 if (!SummaryDataArray) {
145 "SummaryData entries",
"data",
"array")
149 auto ExpectedEncodingSummaryDataMap =
150 encodingSummaryDataMapFromJSON(*SummaryDataArray);
151 if (!ExpectedEncodingSummaryDataMap) {
158 getData(Encoding) = std::move(*ExpectedEncodingSummaryDataMap);
161 return std::move(Encoding);
166 llvm::StringRef Path) {
167 if (
auto Error =
writeJSON(tuSummaryEncodingToJSON(SummaryEncoding), Path)) {
173 return llvm::Error::success();
176Object JSONFormat::tuSummaryEncodingToJSON(
182 RootObject[
"target_triple"] =
183 llvm::Triple::normalize(getTargetTriple(SummaryEncoding).str());
185 RootObject[
"tu_namespace"] =
186 buildNamespaceToJSON(getTUNamespace(SummaryEncoding));
188 RootObject[
"id_table"] = tuEntityIdTableToJSON(getIdTable(SummaryEncoding));
190 RootObject[
"linkage_table"] =
191 linkageTableToJSON(getLinkageTable(SummaryEncoding));
193 RootObject[
"data"] = encodingSummaryDataMapToJSON(getData(SummaryEncoding));
static ErrorBuilder create(std::error_code EC, const char *Fmt, Args &&...ArgVals)
Create an ErrorBuilder with an error code and formatted message.
ErrorBuilder & context(const char *Msg)
Add context information as a plain string.
llvm::Error build() const
Build and return the final error.
static ErrorBuilder wrap(llvm::Error E)
Wrap an existing error and optionally add context.
Represents a translation unit summary in its serialized encoding.
constexpr const char * ReadingFromFile
constexpr const char * ReadingFromField
constexpr const char * FailedToReadObjectAtField
constexpr const char * WritingToFile
constexpr const char * FailedToReadObject
constexpr const char * JSONTypeKey
Root-object key naming the summary kind so files are self-describing.
constexpr const char * JSONTypeValueTUSummary
Value written to JSONTypeKey for serialized TUSummary files.
llvm::Error validateNormalizedTargetTriple(llvm::StringRef Triple)
Validates that Triple is a target triple string in normalized form.
llvm::json::Object Object
llvm::Expected< Value > readJSON(llvm::StringRef Path)
llvm::Error checkSummaryType(const Object &RootObject, llvm::StringRef ExpectedType)
Reads the JSONTypeKey field from the root object and verifies it equals ExpectedType.
llvm::Error writeJSON(Value &&V, llvm::StringRef Path)