1 //===- SymbolSerializer.cpp -------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "llvm/DebugInfo/CodeView/SymbolSerializer.h" 11 12 using namespace llvm; 13 using namespace llvm::codeview; 14 15 SymbolSerializer::SymbolSerializer(BumpPtrAllocator &Allocator) 16 : Storage(Allocator), RecordBuffer(MaxRecordLength), Stream(RecordBuffer, llvm::support::little), 17 Writer(Stream), Mapping(Writer) { } 18 19 Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) { 20 assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!"); 21 22 Writer.setOffset(0); 23 24 if (auto EC = writeRecordPrefix(Record.kind())) 25 return EC; 26 27 CurrentSymbol = Record.kind(); 28 if (auto EC = Mapping.visitSymbolBegin(Record)) 29 return EC; 30 31 return Error::success(); 32 } 33 34 Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) { 35 assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!"); 36 37 if (auto EC = Mapping.visitSymbolEnd(Record)) 38 return EC; 39 40 uint32_t RecordEnd = Writer.getOffset(); 41 uint16_t Length = RecordEnd - 2; 42 Writer.setOffset(0); 43 if (auto EC = Writer.writeInteger(Length)) 44 return EC; 45 46 uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd); 47 ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd); 48 Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd); 49 CurrentSymbol.reset(); 50 51 return Error::success(); 52 } 53