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