12#include "llvm/TargetParser/Triple.h"
30 Object *RootObjectPtr = ExpectedJSON->getAsObject();
45 auto ExpectedSummary = readLUSummaryFromObject(*RootObjectPtr);
46 if (!ExpectedSummary) {
52 return std::move(*ExpectedSummary);
56JSONFormat::readLUSummaryFromObject(
const Object &RootObject) {
57 auto OptTargetTriple = RootObject.getString(
"target_triple");
58 if (!OptTargetTriple) {
61 "TargetTriple",
"target_triple",
"string")
72 llvm::Triple T(*OptTargetTriple);
74 const Array *LUNamespaceArray = RootObject.getArray(
"lu_namespace");
75 if (!LUNamespaceArray) {
78 "NestedBuildNamespace",
"lu_namespace",
"array")
82 auto ExpectedLUNamespace = nestedBuildNamespaceFromJSON(*LUNamespaceArray);
83 if (!ExpectedLUNamespace) {
90 LUSummary Summary(std::move(T), std::move(*ExpectedLUNamespace));
93 const Array *IdTableArray = RootObject.getArray(
"id_table");
97 "IdTable",
"id_table",
"array")
101 auto ExpectedIdTable = luEntityIdTableFromJSON(*IdTableArray);
102 if (!ExpectedIdTable) {
108 getIdTable(Summary) = std::move(*ExpectedIdTable);
112 const Array *LinkageTableArray = RootObject.getArray(
"linkage_table");
113 if (!LinkageTableArray) {
116 "LinkageTable",
"linkage_table",
"array")
120 auto ExpectedIdRange =
121 llvm::make_second_range(getEntities(getIdTable(Summary)));
122 std::set<EntityId> ExpectedIds(ExpectedIdRange.begin(),
123 ExpectedIdRange.end());
127 auto ExpectedLinkageTable =
128 linkageTableFromJSON(*LinkageTableArray, std::move(ExpectedIds));
129 if (!ExpectedLinkageTable) {
136 getLinkageTable(Summary) = std::move(*ExpectedLinkageTable);
140 const Array *SummaryDataArray = RootObject.getArray(
"data");
141 if (!SummaryDataArray) {
144 "SummaryData entries",
"data",
"array")
148 auto ExpectedSummaryDataMap =
149 summaryDataMapFromJSON(*SummaryDataArray, getIdTable(Summary));
150 if (!ExpectedSummaryDataMap) {
157 getData(Summary) = std::move(*ExpectedSummaryDataMap);
160 return std::move(Summary);
164 llvm::StringRef Path) {
169 RootObject[
"target_triple"] =
170 llvm::Triple::normalize(getTargetTriple(S).str());
172 RootObject[
"lu_namespace"] = nestedBuildNamespaceToJSON(getLUNamespace(S));
174 RootObject[
"id_table"] = luEntityIdTableToJSON(getIdTable(S));
176 RootObject[
"linkage_table"] = linkageTableToJSON(getLinkageTable(S));
178 auto ExpectedDataObject = summaryDataMapToJSON(getData(S));
179 if (!ExpectedDataObject) {
185 RootObject[
"data"] = std::move(*ExpectedDataObject);
193 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 (LU) summary containing merged entity summaries.
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)