1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===- RecordIterator.h -----------------------------------------*- C++ -*-===// 2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// The LLVM Compiler Infrastructure 4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details. 7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H 11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H 12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/ArrayRef.h" 14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/iterator_range.h" 15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/RecordSerialization.h" 16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/StreamInterface.h" 17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/StreamReader.h" 18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Endian.h" 19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm { 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace codeview { 22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename Kind> struct CVRecord { 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint32_t Length; 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Kind Type; 26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ArrayRef<uint8_t> Data; 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ArrayRef<uint8_t> RawData; 28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename Kind> struct VarStreamArrayExtractor<CVRecord<Kind>> { 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Error operator()(StreamRef Stream, uint32_t &Len, 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CVRecord<Kind> &Item) const { 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const RecordPrefix *Prefix = nullptr; 34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StreamReader Reader(Stream); 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint32_t Offset = Reader.getOffset(); 36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto EC = Reader.readObject(Prefix)) 38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return EC; 39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Item.Length = Prefix->RecordLen; 40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Item.Length < 2) 41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return make_error<CodeViewError>(cv_error_code::corrupt_record); 42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Item.Type = static_cast<Kind>(uint16_t(Prefix->RecordKind)); 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Reader.setOffset(Offset); 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto EC = 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Reader.readBytes(Item.RawData, Item.Length + sizeof(uint16_t))) 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return EC; 48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Item.Data = Item.RawData.slice(sizeof(RecordPrefix)); 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Len = Prefix->RecordLen + 2; 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Error::success(); 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif 57