1*4fcfc199SEugene 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" 11*4fcfc199SEugene Zelenko #include "llvm/ADT/ArrayRef.h" 12*4fcfc199SEugene Zelenko #include "llvm/DebugInfo/CodeView/SymbolRecord.h" 13*4fcfc199SEugene Zelenko #include "llvm/Support/Endian.h" 14*4fcfc199SEugene Zelenko #include "llvm/Support/Error.h" 15*4fcfc199SEugene Zelenko #include <cassert> 16*4fcfc199SEugene Zelenko #include <cstdint> 17*4fcfc199SEugene 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) 24ebd3ae83SZachary Turner : Storage(Allocator), RecordBuffer(MaxRecordLength), 25*4fcfc199SEugene Zelenko Stream(RecordBuffer, support::little), Writer(Stream), 26ebd3ae83SZachary Turner Mapping(Writer, Container) {} 27407dec59SZachary Turner 28407dec59SZachary Turner Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) { 29407dec59SZachary Turner assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!"); 30407dec59SZachary Turner 31407dec59SZachary Turner Writer.setOffset(0); 32407dec59SZachary Turner 33407dec59SZachary Turner if (auto EC = writeRecordPrefix(Record.kind())) 34407dec59SZachary Turner return EC; 35407dec59SZachary Turner 36407dec59SZachary Turner CurrentSymbol = Record.kind(); 37407dec59SZachary Turner if (auto EC = Mapping.visitSymbolBegin(Record)) 38407dec59SZachary Turner return EC; 39407dec59SZachary Turner 40407dec59SZachary Turner return Error::success(); 41407dec59SZachary Turner } 42407dec59SZachary Turner 43407dec59SZachary Turner Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) { 44407dec59SZachary Turner assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!"); 45407dec59SZachary Turner 46407dec59SZachary Turner if (auto EC = Mapping.visitSymbolEnd(Record)) 47407dec59SZachary Turner return EC; 48407dec59SZachary Turner 49407dec59SZachary Turner uint32_t RecordEnd = Writer.getOffset(); 50407dec59SZachary Turner uint16_t Length = RecordEnd - 2; 51407dec59SZachary Turner Writer.setOffset(0); 52407dec59SZachary Turner if (auto EC = Writer.writeInteger(Length)) 53407dec59SZachary Turner return EC; 54407dec59SZachary Turner 55407dec59SZachary Turner uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd); 56407dec59SZachary Turner ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd); 57407dec59SZachary Turner Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd); 58407dec59SZachary Turner CurrentSymbol.reset(); 59407dec59SZachary Turner 60407dec59SZachary Turner return Error::success(); 61407dec59SZachary Turner } 62