51 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ObjectYAML/ArchiveYAML.h"10#include "llvm/ObjectYAML/yaml2obj.h"11#include "llvm/Support/raw_ostream.h"12 13using namespace llvm;14using namespace ArchYAML;15 16namespace llvm {17namespace yaml {18 19bool 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 yaml50} // namespace llvm51