|  | //===- ArchiveYAML.cpp - ELF YAMLIO implementation -------------------- ----===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file defines classes for handling the YAML representation of archives. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/ObjectYAML/ArchiveYAML.h" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | namespace yaml { | 
|  |  | 
|  | void MappingTraits<ArchYAML::Archive>::mapping(IO &IO, ArchYAML::Archive &A) { | 
|  | assert(!IO.getContext() && "The IO context is initialized already"); | 
|  | IO.setContext(&A); | 
|  | IO.mapTag("!Arch", true); | 
|  | IO.mapOptional("Magic", A.Magic, "!<arch>\n"); | 
|  | IO.mapOptional("Members", A.Members); | 
|  | IO.mapOptional("Content", A.Content); | 
|  | IO.setContext(nullptr); | 
|  | } | 
|  |  | 
|  | std::string MappingTraits<ArchYAML::Archive>::validate(IO &, | 
|  | ArchYAML::Archive &A) { | 
|  | if (A.Members && A.Content) | 
|  | return "\"Content\" and \"Members\" cannot be used together"; | 
|  | return ""; | 
|  | } | 
|  |  | 
|  | void MappingTraits<ArchYAML::Archive::Child>::mapping( | 
|  | IO &IO, ArchYAML::Archive::Child &E) { | 
|  | assert(IO.getContext() && "The IO context is not initialized"); | 
|  | for (auto &P : E.Fields) | 
|  | IO.mapOptional(P.first.data(), P.second.Value, P.second.DefaultValue); | 
|  | IO.mapOptional("Content", E.Content); | 
|  | IO.mapOptional("PaddingByte", E.PaddingByte); | 
|  | } | 
|  |  | 
|  | std::string | 
|  | MappingTraits<ArchYAML::Archive::Child>::validate(IO &, | 
|  | ArchYAML::Archive::Child &C) { | 
|  | for (auto &P : C.Fields) | 
|  | if (P.second.Value.size() > P.second.MaxLength) | 
|  | return ("the maximum length of \"" + P.first + "\" field is " + | 
|  | Twine(P.second.MaxLength)) | 
|  | .str(); | 
|  | return ""; | 
|  | } | 
|  |  | 
|  | } // end namespace yaml | 
|  |  | 
|  | } // end namespace llvm |