14fcfc199SEugene Zelenko //===- SymbolSerializer.cpp -----------------------------------------------===// 2407dec59SZachary Turner // 3407dec59SZachary Turner // The LLVM Compiler Infrastructure 4407dec59SZachary Turner // 5407dec59SZachary Turner // This file is distributed under the University of Illinois Open Source 6407dec59SZachary Turner // License. See LICENSE.TXT for details. 7407dec59SZachary Turner // 8407dec59SZachary Turner //===----------------------------------------------------------------------===// 9407dec59SZachary Turner 10407dec59SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolSerializer.h" 114fcfc199SEugene Zelenko #include "llvm/ADT/ArrayRef.h" 124fcfc199SEugene Zelenko #include "llvm/DebugInfo/CodeView/SymbolRecord.h" 134fcfc199SEugene Zelenko #include "llvm/Support/Endian.h" 144fcfc199SEugene Zelenko #include "llvm/Support/Error.h" 154fcfc199SEugene Zelenko #include <cassert> 164fcfc199SEugene Zelenko #include <cstdint> 174fcfc199SEugene Zelenko #include <cstring> 18407dec59SZachary Turner 19407dec59SZachary Turner using namespace llvm; 20407dec59SZachary Turner using namespace llvm::codeview; 21407dec59SZachary Turner 22ebd3ae83SZachary Turner SymbolSerializer::SymbolSerializer(BumpPtrAllocator &Allocator, 23ebd3ae83SZachary Turner CodeViewContainer Container) 24*5641c07dSZachary Turner : Storage(Allocator), Stream(RecordBuffer, support::little), Writer(Stream), 25ebd3ae83SZachary Turner Mapping(Writer, Container) {} 26407dec59SZachary Turner 27407dec59SZachary Turner Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) { 28407dec59SZachary Turner assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!"); 29407dec59SZachary Turner 30407dec59SZachary Turner Writer.setOffset(0); 31407dec59SZachary Turner 32407dec59SZachary Turner if (auto EC = writeRecordPrefix(Record.kind())) 33407dec59SZachary Turner return EC; 34407dec59SZachary Turner 35407dec59SZachary Turner CurrentSymbol = Record.kind(); 36407dec59SZachary Turner if (auto EC = Mapping.visitSymbolBegin(Record)) 37407dec59SZachary Turner return EC; 38407dec59SZachary Turner 39407dec59SZachary Turner return Error::success(); 40407dec59SZachary Turner } 41407dec59SZachary Turner 42407dec59SZachary Turner Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) { 43407dec59SZachary Turner assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!"); 44407dec59SZachary Turner 45407dec59SZachary Turner if (auto EC = Mapping.visitSymbolEnd(Record)) 46407dec59SZachary Turner return EC; 47407dec59SZachary Turner 48407dec59SZachary Turner uint32_t RecordEnd = Writer.getOffset(); 49407dec59SZachary Turner uint16_t Length = RecordEnd - 2; 50407dec59SZachary Turner Writer.setOffset(0); 51407dec59SZachary Turner if (auto EC = Writer.writeInteger(Length)) 52407dec59SZachary Turner return EC; 53407dec59SZachary Turner 54407dec59SZachary Turner uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd); 55407dec59SZachary Turner ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd); 56407dec59SZachary Turner Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd); 57407dec59SZachary Turner CurrentSymbol.reset(); 58407dec59SZachary Turner 59407dec59SZachary Turner return Error::success(); 60407dec59SZachary Turner } 61