12#include "llvm/TargetParser/Triple.h"
22llvm::Expected<LUSummaryEncoding>
31 Object *RootObjectPtr = ExpectedJSON->getAsObject();
46 auto ExpectedEncoding = readLUSummaryEncodingFromObject(*RootObjectPtr);
47 if (!ExpectedEncoding) {
53 return std::move(*ExpectedEncoding);
57JSONFormat::readLUSummaryEncodingFromObject(
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 Array *LUNamespaceArray = RootObject.getArray(
"lu_namespace");
76 if (!LUNamespaceArray) {
79 "NestedBuildNamespace",
"lu_namespace",
"array")
83 auto ExpectedLUNamespace = nestedBuildNamespaceFromJSON(*LUNamespaceArray);
84 if (!ExpectedLUNamespace) {
91 LUSummaryEncoding
Encoding(std::move(T), std::move(*ExpectedLUNamespace));
94 const Array *IdTableArray = RootObject.getArray(
"id_table");
98 "IdTable",
"id_table",
"array")
102 auto ExpectedIdTable = luEntityIdTableFromJSON(*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) {
171 RootObject[
"target_triple"] =
172 llvm::Triple::normalize(getTargetTriple(SummaryEncoding).str());
174 RootObject[
"lu_namespace"] =
175 nestedBuildNamespaceToJSON(getLUNamespace(SummaryEncoding));
177 RootObject[
"id_table"] = luEntityIdTableToJSON(getIdTable(SummaryEncoding));
179 RootObject[
"linkage_table"] =
180 linkageTableToJSON(getLinkageTable(SummaryEncoding));
182 RootObject[
"data"] = encodingSummaryDataMapToJSON(getData(SummaryEncoding));
190 return llvm::Error::success();
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 link 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 * JSONTypeValueLUSummary
Value written to JSONTypeKey for serialized LUSummary 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)