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