14fcfc199SEugene Zelenko //===- SymbolSerializer.cpp -----------------------------------------------===// 2407dec59SZachary Turner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6407dec59SZachary Turner // 7407dec59SZachary Turner //===----------------------------------------------------------------------===// 8407dec59SZachary Turner 9407dec59SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolSerializer.h" 104fcfc199SEugene Zelenko #include "llvm/ADT/ArrayRef.h" 114fcfc199SEugene Zelenko #include "llvm/DebugInfo/CodeView/SymbolRecord.h" 124fcfc199SEugene Zelenko #include "llvm/Support/Endian.h" 134fcfc199SEugene Zelenko #include "llvm/Support/Error.h" 144fcfc199SEugene Zelenko #include <cassert> 154fcfc199SEugene Zelenko #include <cstdint> 164fcfc199SEugene Zelenko #include <cstring> 17407dec59SZachary Turner 18407dec59SZachary Turner using namespace llvm; 19407dec59SZachary Turner using namespace llvm::codeview; 20407dec59SZachary Turner 21ebd3ae83SZachary Turner SymbolSerializer::SymbolSerializer(BumpPtrAllocator &Allocator, 22ebd3ae83SZachary Turner CodeViewContainer Container) 235641c07dSZachary Turner : Storage(Allocator), Stream(RecordBuffer, support::little), Writer(Stream), 24ebd3ae83SZachary Turner Mapping(Writer, Container) {} 25407dec59SZachary Turner 26407dec59SZachary Turner Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) { 27407dec59SZachary Turner assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!"); 28407dec59SZachary Turner 29407dec59SZachary Turner Writer.setOffset(0); 30407dec59SZachary Turner 31407dec59SZachary Turner if (auto EC = writeRecordPrefix(Record.kind())) 32407dec59SZachary Turner return EC; 33407dec59SZachary Turner 34407dec59SZachary Turner CurrentSymbol = Record.kind(); 35407dec59SZachary Turner if (auto EC = Mapping.visitSymbolBegin(Record)) 36407dec59SZachary Turner return EC; 37407dec59SZachary Turner 38407dec59SZachary Turner return Error::success(); 39407dec59SZachary Turner } 40407dec59SZachary Turner 41407dec59SZachary Turner Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) { 42407dec59SZachary Turner assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!"); 43407dec59SZachary Turner 44407dec59SZachary Turner if (auto EC = Mapping.visitSymbolEnd(Record)) 45407dec59SZachary Turner return EC; 46407dec59SZachary Turner 47407dec59SZachary Turner uint32_t RecordEnd = Writer.getOffset(); 48407dec59SZachary Turner uint16_t Length = RecordEnd - 2; 49407dec59SZachary Turner Writer.setOffset(0); 50407dec59SZachary Turner if (auto EC = Writer.writeInteger(Length)) 51407dec59SZachary Turner return EC; 52407dec59SZachary Turner 53407dec59SZachary Turner uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd); 54407dec59SZachary Turner ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd); 55407dec59SZachary Turner Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd); 56407dec59SZachary Turner CurrentSymbol.reset(); 57407dec59SZachary Turner 58407dec59SZachary Turner return Error::success(); 59407dec59SZachary Turner } 60