1*47369e19SGeorgii Rymar //===- ArchiveEmitter.cpp ---------------------------- --------------------===//
2*47369e19SGeorgii Rymar //
3*47369e19SGeorgii Rymar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*47369e19SGeorgii Rymar // See https://llvm.org/LICENSE.txt for license information.
5*47369e19SGeorgii Rymar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*47369e19SGeorgii Rymar //
7*47369e19SGeorgii Rymar //===----------------------------------------------------------------------===//
8*47369e19SGeorgii Rymar 
9*47369e19SGeorgii Rymar #include "llvm/ObjectYAML/ArchiveYAML.h"
10*47369e19SGeorgii Rymar #include "llvm/ObjectYAML/yaml2obj.h"
11*47369e19SGeorgii Rymar #include "llvm/Support/Error.h"
12*47369e19SGeorgii Rymar #include "llvm/Support/raw_ostream.h"
13*47369e19SGeorgii Rymar 
14*47369e19SGeorgii Rymar using namespace llvm;
15*47369e19SGeorgii Rymar using namespace ArchYAML;
16*47369e19SGeorgii Rymar 
17*47369e19SGeorgii Rymar namespace llvm {
18*47369e19SGeorgii Rymar namespace yaml {
19*47369e19SGeorgii Rymar 
yaml2archive(ArchYAML::Archive & Doc,raw_ostream & Out,ErrorHandler EH)20*47369e19SGeorgii Rymar bool yaml2archive(ArchYAML::Archive &Doc, raw_ostream &Out, ErrorHandler EH) {
21*47369e19SGeorgii Rymar   Out.write(Doc.Magic.data(), Doc.Magic.size());
22*47369e19SGeorgii Rymar 
23*47369e19SGeorgii Rymar   if (Doc.Content) {
24*47369e19SGeorgii Rymar     Doc.Content->writeAsBinary(Out);
25*47369e19SGeorgii Rymar     return true;
26*47369e19SGeorgii Rymar   }
27*47369e19SGeorgii Rymar 
28*47369e19SGeorgii Rymar   if (!Doc.Members)
29*47369e19SGeorgii Rymar     return true;
30*47369e19SGeorgii Rymar 
31*47369e19SGeorgii Rymar   auto WriteField = [&](StringRef Field, uint8_t Size) {
32*47369e19SGeorgii Rymar     Out.write(Field.data(), Field.size());
33*47369e19SGeorgii Rymar     for (size_t I = Field.size(); I != Size; ++I)
34*47369e19SGeorgii Rymar       Out.write(' ');
35*47369e19SGeorgii Rymar   };
36*47369e19SGeorgii Rymar 
37*47369e19SGeorgii Rymar   for (const Archive::Child &C : *Doc.Members) {
38*47369e19SGeorgii Rymar     for (auto &P : C.Fields)
39*47369e19SGeorgii Rymar       WriteField(P.second.Value, P.second.MaxLength);
40*47369e19SGeorgii Rymar 
41*47369e19SGeorgii Rymar     if (C.Content)
42*47369e19SGeorgii Rymar       C.Content->writeAsBinary(Out);
43*47369e19SGeorgii Rymar     if (C.PaddingByte)
44*47369e19SGeorgii Rymar       Out.write(*C.PaddingByte);
45*47369e19SGeorgii Rymar   }
46*47369e19SGeorgii Rymar 
47*47369e19SGeorgii Rymar   return true;
48*47369e19SGeorgii Rymar }
49*47369e19SGeorgii Rymar 
50*47369e19SGeorgii Rymar } // namespace yaml
51*47369e19SGeorgii Rymar } // namespace llvm
52