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