//===- RecordIterator.h -----------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H #define LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/iterator_range.h" #include "llvm/DebugInfo/CodeView/RecordSerialization.h" #include "llvm/DebugInfo/CodeView/StreamInterface.h" #include "llvm/DebugInfo/CodeView/StreamReader.h" #include "llvm/Support/Endian.h" namespace llvm { namespace codeview { template struct CVRecord { uint32_t Length; Kind Type; ArrayRef Data; ArrayRef RawData; }; template struct VarStreamArrayExtractor> { Error operator()(StreamRef Stream, uint32_t &Len, CVRecord &Item) const { const RecordPrefix *Prefix = nullptr; StreamReader Reader(Stream); uint32_t Offset = Reader.getOffset(); if (auto EC = Reader.readObject(Prefix)) return EC; Item.Length = Prefix->RecordLen; if (Item.Length < 2) return make_error(cv_error_code::corrupt_record); Item.Type = static_cast(uint16_t(Prefix->RecordKind)); Reader.setOffset(Offset); if (auto EC = Reader.readBytes(Item.RawData, Item.Length + sizeof(uint16_t))) return EC; Item.Data = Item.RawData.slice(sizeof(RecordPrefix)); Len = Prefix->RecordLen + 2; return Error::success(); } }; } } #endif