13#include "llvm/TargetParser/Triple.h"
21llvm::Expected<StaticLibrary>
30 Object *RootObjectPtr = ExpectedJSON->getAsObject();
34 "StaticLibrary",
"object")
45 auto ExpectedStaticLibrary = readStaticLibraryFromObject(*RootObjectPtr);
46 if (!ExpectedStaticLibrary) {
52 return std::move(*ExpectedStaticLibrary);
56JSONFormat::readStaticLibraryFromObject(
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 Object *NamespaceObject = RootObject.getObject(
"namespace");
75 if (!NamespaceObject) {
78 "BuildNamespace",
"namespace",
"object")
82 auto ExpectedNamespace = buildNamespaceFromJSON(*NamespaceObject);
83 if (!ExpectedNamespace) {
91 std::errc::invalid_argument,
101 const Array *MembersArray = RootObject.getArray(
"members");
105 "StaticLibrary members",
"members",
"array")
109 auto &Members = getMembers(S);
110 const auto &StaticLibraryTriple = getTargetTriple(S);
112 for (
const auto &[Index, MemberValue] : llvm::enumerate(*MembersArray)) {
113 const Object *MemberObject = MemberValue.getAsObject();
117 "StaticLibrary member", Index,
"object")
128 auto ExpectedMember = readTUSummaryEncodingFromObject(*MemberObject);
129 if (!ExpectedMember) {
136 if (ExpectedMember->getTargetTriple() != StaticLibraryTriple) {
138 std::errc::invalid_argument,
140 llvm::Triple::normalize(StaticLibraryTriple.str()),
142 llvm::Triple::normalize(
143 ExpectedMember->getTargetTriple().str()))
149 auto MemberNamespace = getTUNamespace(*ExpectedMember);
151 std::make_unique<TUSummaryEncoding>(std::move(*ExpectedMember));
152 auto [It, Inserted] = Members.insert(std::move(Owned));
156 "StaticLibrary member", Index,
166 llvm::StringRef Path) {
171 RootObject[
"target_triple"] =
172 llvm::Triple::normalize(getTargetTriple(S).str());
174 RootObject[
"namespace"] = buildNamespaceToJSON(getNamespace(S));
177 MembersArray.reserve(getMembers(S).size());
178 for (
const auto &
Member : getMembers(S)) {
179 MembersArray.push_back(tuSummaryEncodingToJSON(*
Member));
181 RootObject[
"members"] = std::move(MembersArray);
189 return llvm::Error::success();
static Decl::Kind getKind(const Decl *D)
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 static library of translation unit summary encodings.
constexpr const char * ReadingFromFile
constexpr const char * ReadingFromField
constexpr const char * MismatchedSummaryType
constexpr const char * FailedToReadObjectAtIndex
constexpr const char * FailedToReadObjectAtField
constexpr const char * WritingToFile
constexpr const char * ReadingFromIndex
constexpr const char * FailedInsertionOnDuplication
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.
constexpr const char * JSONTypeValueStaticLibrary
Value written to JSONTypeKey for serialized StaticLibrary 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::StringRef buildNamespaceKindToJSON(BuildNamespaceKind BNK)
llvm::Error writeJSON(Value &&V, llvm::StringRef Path)