LLVM  4.0.0
SymbolSerializer.h
Go to the documentation of this file.
1 //===- symbolSerializer.h ---------------------------------------*- 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 #ifndef LLVM_DEBUGINFO_CODEVIEW_SYMBOLSERIALIZER_H
11 #define LLVM_DEBUGINFO_CODEVIEW_SYMBOLSERIALIZER_H
12 
17 
18 #include "llvm/ADT/Optional.h"
19 #include "llvm/ADT/SmallVector.h"
20 #include "llvm/ADT/StringMap.h"
21 #include "llvm/ADT/StringRef.h"
23 #include "llvm/Support/Allocator.h"
24 #include "llvm/Support/Error.h"
25 
26 namespace llvm {
27 namespace codeview {
28 
30  uint32_t RecordStart = 0;
31  msf::StreamWriter &Writer;
32  SymbolRecordMapping Mapping;
33  Optional<SymbolKind> CurrentSymbol;
34 
35  Error writeRecordPrefix(SymbolKind Kind) {
37  Prefix.RecordKind = Kind;
38  Prefix.RecordLen = 0;
39  if (auto EC = Writer.writeObject(Prefix))
40  return EC;
41  return Error::success();
42  }
43 
44 public:
46  : Writer(Writer), Mapping(Writer) {}
47 
48  virtual Error visitSymbolBegin(CVSymbol &Record) override {
49  assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!");
50 
51  RecordStart = Writer.getOffset();
52  if (auto EC = writeRecordPrefix(Record.kind()))
53  return EC;
54 
55  CurrentSymbol = Record.kind();
56  if (auto EC = Mapping.visitSymbolBegin(Record))
57  return EC;
58 
59  return Error::success();
60  }
61 
62  virtual Error visitSymbolEnd(CVSymbol &Record) override {
63  assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!");
64 
65  if (auto EC = Mapping.visitSymbolEnd(Record))
66  return EC;
67 
68  uint32_t RecordEnd = Writer.getOffset();
69  Writer.setOffset(RecordStart);
70  uint16_t Length = RecordEnd - Writer.getOffset() - 2;
71  if (auto EC = Writer.writeInteger(Length))
72  return EC;
73 
74  Writer.setOffset(RecordEnd);
75  CurrentSymbol.reset();
76 
77  return Error::success();
78  }
79 
80 #define SYMBOL_RECORD(EnumName, EnumVal, Name) \
81  virtual Error visitKnownRecord(CVSymbol &CVR, Name &Record) override { \
82  return visitKnownRecordImpl(CVR, Record); \
83  }
84 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
85 #include "CVSymbolTypes.def"
86 
87 private:
88  template <typename RecordKind>
89  Error visitKnownRecordImpl(CVSymbol &CVR, RecordKind &Record) {
90  return Mapping.visitKnownRecord(CVR, Record);
91  }
92 };
93 }
94 }
95 
96 #endif
void setOffset(uint32_t Off)
Definition: StreamWriter.h:79
bool hasValue() const
Definition: Optional.h:125
This provides a very simple, boring adaptor for a begin and end iterator into a range type...
virtual Error visitSymbolBegin(CVSymbol &Record) override
Paired begin/end actions for all symbols.
This file defines the MallocAllocator and BumpPtrAllocator interfaces.
SymbolSerializer(msf::StreamWriter &Writer)
virtual Error visitSymbolEnd(CVSymbol &Record) override
Error writeObject(const T &Obj)
Definition: StreamWriter.h:49
Kind kind() const
Definition: CVRecord.h:33
CVRecord< SymbolKind > CVSymbol
Definition: SymbolRecord.h:940
Error writeInteger(uint8_t Int)
Error visitSymbolEnd(CVSymbol &Record) override
static ErrorSuccess success()
Create a success value.
uint32_t getOffset() const
Definition: StreamWriter.h:80
SymbolKind
Duplicate copy of the above enum, but using the official CV names.
Definition: CodeView.h:42
const unsigned Kind
void reset()
Definition: Optional.h:108
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Lightweight error class with error context and mandatory checking.
Error visitSymbolBegin(CVSymbol &Record) override
Paired begin/end actions for all symbols.