|  | //===- CodeViewYAMLTypeHashing.cpp - CodeView YAMLIO type hashing ---------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file defines classes for handling the YAML representation of CodeView | 
|  | // Debug Info. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/ObjectYAML/CodeViewYAMLTypeHashing.h" | 
|  |  | 
|  | #include "llvm/Support/BinaryStreamReader.h" | 
|  | #include "llvm/Support/BinaryStreamWriter.h" | 
|  |  | 
|  | using namespace llvm; | 
|  | using namespace llvm::codeview; | 
|  | using namespace llvm::CodeViewYAML; | 
|  | using namespace llvm::yaml; | 
|  |  | 
|  | namespace llvm { | 
|  | namespace yaml { | 
|  |  | 
|  | void MappingTraits<DebugHSection>::mapping(IO &io, DebugHSection &DebugH) { | 
|  | io.mapRequired("Version", DebugH.Version); | 
|  | io.mapRequired("HashAlgorithm", DebugH.HashAlgorithm); | 
|  | io.mapOptional("HashValues", DebugH.Hashes); | 
|  | } | 
|  |  | 
|  | void ScalarTraits<GlobalHash>::output(const GlobalHash &GH, void *Ctx, | 
|  | raw_ostream &OS) { | 
|  | ScalarTraits<BinaryRef>::output(GH.Hash, Ctx, OS); | 
|  | } | 
|  |  | 
|  | StringRef ScalarTraits<GlobalHash>::input(StringRef Scalar, void *Ctx, | 
|  | GlobalHash &GH) { | 
|  | return ScalarTraits<BinaryRef>::input(Scalar, Ctx, GH.Hash); | 
|  | } | 
|  |  | 
|  | } // end namespace yaml | 
|  | } // end namespace llvm | 
|  |  | 
|  | DebugHSection llvm::CodeViewYAML::fromDebugH(ArrayRef<uint8_t> DebugH) { | 
|  | assert(DebugH.size() >= 8); | 
|  | assert((DebugH.size() - 8) % 8 == 0); | 
|  |  | 
|  | BinaryStreamReader Reader(DebugH, llvm::endianness::little); | 
|  | DebugHSection DHS; | 
|  | cantFail(Reader.readInteger(DHS.Magic)); | 
|  | cantFail(Reader.readInteger(DHS.Version)); | 
|  | cantFail(Reader.readInteger(DHS.HashAlgorithm)); | 
|  |  | 
|  | while (Reader.bytesRemaining() != 0) { | 
|  | ArrayRef<uint8_t> S; | 
|  | cantFail(Reader.readBytes(S, 8)); | 
|  | DHS.Hashes.emplace_back(S); | 
|  | } | 
|  | assert(Reader.bytesRemaining() == 0); | 
|  | return DHS; | 
|  | } | 
|  |  | 
|  | ArrayRef<uint8_t> llvm::CodeViewYAML::toDebugH(const DebugHSection &DebugH, | 
|  | BumpPtrAllocator &Alloc) { | 
|  | uint32_t Size = 8 + 8 * DebugH.Hashes.size(); | 
|  | uint8_t *Data = Alloc.Allocate<uint8_t>(Size); | 
|  | MutableArrayRef<uint8_t> Buffer(Data, Size); | 
|  | BinaryStreamWriter Writer(Buffer, llvm::endianness::little); | 
|  |  | 
|  | cantFail(Writer.writeInteger(DebugH.Magic)); | 
|  | cantFail(Writer.writeInteger(DebugH.Version)); | 
|  | cantFail(Writer.writeInteger(DebugH.HashAlgorithm)); | 
|  | SmallString<8> Hash; | 
|  | for (const auto &H : DebugH.Hashes) { | 
|  | Hash.clear(); | 
|  | raw_svector_ostream OS(Hash); | 
|  | H.Hash.writeAsBinary(OS); | 
|  | assert((Hash.size() == 8) && "Invalid hash size!"); | 
|  | cantFail(Writer.writeFixedString(Hash)); | 
|  | } | 
|  | assert(Writer.bytesRemaining() == 0); | 
|  | return Buffer; | 
|  | } |