Line data Source code
1 : //===- SymbolSerializer.cpp -----------------------------------------------===//
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 : #include "llvm/ADT/ArrayRef.h"
12 : #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
13 : #include "llvm/Support/Endian.h"
14 : #include "llvm/Support/Error.h"
15 : #include <cassert>
16 : #include <cstdint>
17 : #include <cstring>
18 :
19 : using namespace llvm;
20 : using namespace llvm::codeview;
21 :
22 1224 : SymbolSerializer::SymbolSerializer(BumpPtrAllocator &Allocator,
23 1224 : CodeViewContainer Container)
24 : : Storage(Allocator), Stream(RecordBuffer, support::little), Writer(Stream),
25 2448 : Mapping(Writer, Container) {}
26 :
27 1224 : Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) {
28 : assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!");
29 :
30 : Writer.setOffset(0);
31 :
32 2448 : if (auto EC = writeRecordPrefix(Record.kind()))
33 : return EC;
34 :
35 1224 : CurrentSymbol = Record.kind();
36 2448 : if (auto EC = Mapping.visitSymbolBegin(Record))
37 : return EC;
38 :
39 : return Error::success();
40 : }
41 :
42 1224 : Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) {
43 : assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!");
44 :
45 2448 : if (auto EC = Mapping.visitSymbolEnd(Record))
46 : return EC;
47 :
48 1224 : uint32_t RecordEnd = Writer.getOffset();
49 1224 : uint16_t Length = RecordEnd - 2;
50 : Writer.setOffset(0);
51 2448 : if (auto EC = Writer.writeInteger(Length))
52 : return EC;
53 :
54 1224 : uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd);
55 1224 : ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd);
56 1224 : Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd);
57 : CurrentSymbol.reset();
58 :
59 : return Error::success();
60 : }
|