1407dec59SZachary Turner //===- SymbolSerializer.cpp -------------------------------------*- C++ -*-===// 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" 11407dec59SZachary Turner 12407dec59SZachary Turner using namespace llvm; 13407dec59SZachary Turner using namespace llvm::codeview; 14407dec59SZachary Turner 15*ebd3ae83SZachary Turner SymbolSerializer::SymbolSerializer(BumpPtrAllocator &Allocator, 16*ebd3ae83SZachary Turner CodeViewContainer Container) 17*ebd3ae83SZachary Turner : Storage(Allocator), RecordBuffer(MaxRecordLength), 18*ebd3ae83SZachary Turner Stream(RecordBuffer, llvm::support::little), Writer(Stream), 19*ebd3ae83SZachary Turner Mapping(Writer, Container) {} 20407dec59SZachary Turner 21407dec59SZachary Turner Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) { 22407dec59SZachary Turner assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!"); 23407dec59SZachary Turner 24407dec59SZachary Turner Writer.setOffset(0); 25407dec59SZachary Turner 26407dec59SZachary Turner if (auto EC = writeRecordPrefix(Record.kind())) 27407dec59SZachary Turner return EC; 28407dec59SZachary Turner 29407dec59SZachary Turner CurrentSymbol = Record.kind(); 30407dec59SZachary Turner if (auto EC = Mapping.visitSymbolBegin(Record)) 31407dec59SZachary Turner return EC; 32407dec59SZachary Turner 33407dec59SZachary Turner return Error::success(); 34407dec59SZachary Turner } 35407dec59SZachary Turner 36407dec59SZachary Turner Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) { 37407dec59SZachary Turner assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!"); 38407dec59SZachary Turner 39407dec59SZachary Turner if (auto EC = Mapping.visitSymbolEnd(Record)) 40407dec59SZachary Turner return EC; 41407dec59SZachary Turner 42407dec59SZachary Turner uint32_t RecordEnd = Writer.getOffset(); 43407dec59SZachary Turner uint16_t Length = RecordEnd - 2; 44407dec59SZachary Turner Writer.setOffset(0); 45407dec59SZachary Turner if (auto EC = Writer.writeInteger(Length)) 46407dec59SZachary Turner return EC; 47407dec59SZachary Turner 48407dec59SZachary Turner uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd); 49407dec59SZachary Turner ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd); 50407dec59SZachary Turner Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd); 51407dec59SZachary Turner CurrentSymbol.reset(); 52407dec59SZachary Turner 53407dec59SZachary Turner return Error::success(); 54407dec59SZachary Turner } 55