//===- CodeViewYAMLTypeHashing.cpp - CodeView YAMLIO type hashing ---------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines classes for handling the YAML representation of CodeView // Debug Info. // //===----------------------------------------------------------------------===// #include "llvm/ObjectYAML/CodeViewYAMLTypeHashing.h" #include "llvm/BinaryFormat/COFF.h" #include "llvm/Support/BinaryByteStream.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::mapping(IO &io, DebugHSection &DebugH) { io.mapRequired("Version", DebugH.Version); io.mapRequired("HashAlgorithm", DebugH.HashAlgorithm); io.mapOptional("HashValues", DebugH.Hashes); } void ScalarTraits::output(const GlobalHash &GH, void *Ctx, raw_ostream &OS) { ScalarTraits::output(GH.Hash, Ctx, OS); } StringRef ScalarTraits::input(StringRef Scalar, void *Ctx, GlobalHash &GH) { return ScalarTraits::input(Scalar, Ctx, GH.Hash); } } // end namespace yaml } // end namespace llvm DebugHSection llvm::CodeViewYAML::fromDebugH(ArrayRef DebugH) { assert(DebugH.size() >= 8); assert((DebugH.size() - 8) % 8 == 0); BinaryStreamReader Reader(DebugH, llvm::support::little); DebugHSection DHS; cantFail(Reader.readInteger(DHS.Magic)); cantFail(Reader.readInteger(DHS.Version)); cantFail(Reader.readInteger(DHS.HashAlgorithm)); while (Reader.bytesRemaining() != 0) { ArrayRef S; cantFail(Reader.readBytes(S, 8)); DHS.Hashes.emplace_back(S); } assert(Reader.bytesRemaining() == 0); return DHS; } ArrayRef llvm::CodeViewYAML::toDebugH(const DebugHSection &DebugH, BumpPtrAllocator &Alloc) { uint32_t Size = 8 + 8 * DebugH.Hashes.size(); uint8_t *Data = Alloc.Allocate(Size); MutableArrayRef Buffer(Data, Size); BinaryStreamWriter Writer(Buffer, llvm::support::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; }