xref: /llvm-project/llvm/lib/DebugInfo/CodeView/SymbolSerializer.cpp (revision 407dec59a4b66819081757b6895f4ec6417dd57f)
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