13#include "llvm/TargetParser/Triple.h"
21llvm::Expected<MultiArchSharedLibrary>
30 Object *RootObjectPtr = ExpectedJSON->getAsObject();
34 "MultiArchSharedLibrary",
"object")
46 auto ExpectedM = readMultiArchSharedLibraryFromObject(*RootObjectPtr);
53 return std::move(*ExpectedM);
57JSONFormat::readMultiArchSharedLibraryFromObject(
const Object &RootObject) {
58 const Array *NamespaceArray = RootObject.getArray(
"namespace");
59 if (!NamespaceArray) {
62 "NestedBuildNamespace",
"namespace",
"array")
66 auto ExpectedNamespace = nestedBuildNamespaceFromJSON(*NamespaceArray);
67 if (!ExpectedNamespace) {
74 const Array *MembersArray = RootObject.getArray(
"members");
78 "MultiArchSharedLibrary members",
"members",
83 MultiArchSharedLibrary M(std::move(*ExpectedNamespace));
84 auto &Members = getMembers(M);
85 const auto &WrapperNamespace = getNamespace(M);
87 for (
const auto &[Index, MemberValue] : llvm::enumerate(*MembersArray)) {
88 const Object *MemberObject = MemberValue.getAsObject();
92 "MultiArchSharedLibrary member", Index,
100 "MultiArchSharedLibrary member", Index)
104 auto ExpectedMember = readLUSummaryEncodingFromObject(*MemberObject);
105 if (!ExpectedMember) {
108 "MultiArchSharedLibrary member", Index)
114 if (WrapperNamespace != getLUNamespace(*ExpectedMember)) {
119 "MultiArchSharedLibrary member", Index)
123 auto [It, Inserted] = Members.insert(
124 std::make_unique<LUSummaryEncoding>(std::move(*ExpectedMember)));
126 auto MemberTriple = llvm::Triple::normalize(getTargetTriple(**It).str());
129 "MultiArchSharedLibrary member", Index,
140 llvm::StringRef Path) {
145 RootObject[
"namespace"] = nestedBuildNamespaceToJSON(getNamespace(M));
148 MembersArray.reserve(getMembers(M).size());
149 for (
const auto &
Member : getMembers(M)) {
150 MembersArray.push_back(luSummaryEncodingToJSON(*
Member));
152 RootObject[
"members"] = std::move(MembersArray);
160 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 multi-architecture shared library.
constexpr const char * ReadingFromFile
constexpr const char * ReadingFromField
constexpr const char * FailedToReadObjectAtIndex
constexpr const char * FailedToReadObjectAtField
constexpr const char * MismatchedNestedNamespace
constexpr const char * WritingToFile
constexpr const char * ReadingFromIndex
constexpr const char * FailedInsertionOnDuplication
constexpr const char * FailedToReadObject
constexpr const char * JSONTypeValueMultiArchSharedLibrary
Value written to JSONTypeKey for serialized MultiArchSharedLibrary files.
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::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)