xref: /openbsd-src/gnu/llvm/llvm/lib/ObjectYAML/ArchiveYAML.cpp (revision 73471bf04ceb096474c7f0fa83b1b65c70a787a1)
1*73471bf0Spatrick //===- ArchiveYAML.cpp - ELF YAMLIO implementation -------------------- ----===//
2*73471bf0Spatrick //
3*73471bf0Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*73471bf0Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*73471bf0Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*73471bf0Spatrick //
7*73471bf0Spatrick //===----------------------------------------------------------------------===//
8*73471bf0Spatrick //
9*73471bf0Spatrick // This file defines classes for handling the YAML representation of archives.
10*73471bf0Spatrick //
11*73471bf0Spatrick //===----------------------------------------------------------------------===//
12*73471bf0Spatrick 
13*73471bf0Spatrick #include "llvm/ObjectYAML/ArchiveYAML.h"
14*73471bf0Spatrick 
15*73471bf0Spatrick namespace llvm {
16*73471bf0Spatrick 
17*73471bf0Spatrick namespace yaml {
18*73471bf0Spatrick 
mapping(IO & IO,ArchYAML::Archive & A)19*73471bf0Spatrick void MappingTraits<ArchYAML::Archive>::mapping(IO &IO, ArchYAML::Archive &A) {
20*73471bf0Spatrick   assert(!IO.getContext() && "The IO context is initialized already");
21*73471bf0Spatrick   IO.setContext(&A);
22*73471bf0Spatrick   IO.mapTag("!Arch", true);
23*73471bf0Spatrick   IO.mapOptional("Magic", A.Magic, "!<arch>\n");
24*73471bf0Spatrick   IO.mapOptional("Members", A.Members);
25*73471bf0Spatrick   IO.mapOptional("Content", A.Content);
26*73471bf0Spatrick   IO.setContext(nullptr);
27*73471bf0Spatrick }
28*73471bf0Spatrick 
validate(IO &,ArchYAML::Archive & A)29*73471bf0Spatrick std::string MappingTraits<ArchYAML::Archive>::validate(IO &,
30*73471bf0Spatrick                                                        ArchYAML::Archive &A) {
31*73471bf0Spatrick   if (A.Members && A.Content)
32*73471bf0Spatrick     return "\"Content\" and \"Members\" cannot be used together";
33*73471bf0Spatrick   return "";
34*73471bf0Spatrick }
35*73471bf0Spatrick 
mapping(IO & IO,ArchYAML::Archive::Child & E)36*73471bf0Spatrick void MappingTraits<ArchYAML::Archive::Child>::mapping(
37*73471bf0Spatrick     IO &IO, ArchYAML::Archive::Child &E) {
38*73471bf0Spatrick   assert(IO.getContext() && "The IO context is not initialized");
39*73471bf0Spatrick   for (auto &P : E.Fields)
40*73471bf0Spatrick     IO.mapOptional(P.first.data(), P.second.Value, P.second.DefaultValue);
41*73471bf0Spatrick   IO.mapOptional("Content", E.Content);
42*73471bf0Spatrick   IO.mapOptional("PaddingByte", E.PaddingByte);
43*73471bf0Spatrick }
44*73471bf0Spatrick 
45*73471bf0Spatrick std::string
validate(IO &,ArchYAML::Archive::Child & C)46*73471bf0Spatrick MappingTraits<ArchYAML::Archive::Child>::validate(IO &,
47*73471bf0Spatrick                                                   ArchYAML::Archive::Child &C) {
48*73471bf0Spatrick   for (auto &P : C.Fields)
49*73471bf0Spatrick     if (P.second.Value.size() > P.second.MaxLength)
50*73471bf0Spatrick       return ("the maximum length of \"" + P.first + "\" field is " +
51*73471bf0Spatrick               Twine(P.second.MaxLength))
52*73471bf0Spatrick           .str();
53*73471bf0Spatrick   return "";
54*73471bf0Spatrick }
55*73471bf0Spatrick 
56*73471bf0Spatrick } // end namespace yaml
57*73471bf0Spatrick 
58*73471bf0Spatrick } // end namespace llvm
59