blob: 0071ecc856853d8aa7f5d06551ce39e9180dd3cd [file] [log] [blame]
Eugene Zelenko4fcfc192017-06-30 23:06:03 +00001//===- SymbolSerializer.cpp -----------------------------------------------===//
Zachary Turner407dec52017-03-13 14:57:45 +00002//
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"
Eugene Zelenko4fcfc192017-06-30 23:06:03 +000011#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>
Zachary Turner407dec52017-03-13 14:57:45 +000018
19using namespace llvm;
20using namespace llvm::codeview;
21
Zachary Turnerebd3ae82017-06-01 21:52:41 +000022SymbolSerializer::SymbolSerializer(BumpPtrAllocator &Allocator,
23 CodeViewContainer Container)
Zachary Turner5641c072017-08-21 20:17:19 +000024 : Storage(Allocator), Stream(RecordBuffer, support::little), Writer(Stream),
Zachary Turnerebd3ae82017-06-01 21:52:41 +000025 Mapping(Writer, Container) {}
Zachary Turner407dec52017-03-13 14:57:45 +000026
27Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) {
28 assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!");
29
30 Writer.setOffset(0);
31
32 if (auto EC = writeRecordPrefix(Record.kind()))
33 return EC;
34
35 CurrentSymbol = Record.kind();
36 if (auto EC = Mapping.visitSymbolBegin(Record))
37 return EC;
38
39 return Error::success();
40}
41
42Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) {
43 assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!");
44
45 if (auto EC = Mapping.visitSymbolEnd(Record))
46 return EC;
47
48 uint32_t RecordEnd = Writer.getOffset();
49 uint16_t Length = RecordEnd - 2;
50 Writer.setOffset(0);
51 if (auto EC = Writer.writeInteger(Length))
52 return EC;
53
54 uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd);
55 ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd);
56 Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd);
57 CurrentSymbol.reset();
58
59 return Error::success();
60}