LLVM  4.0.0
CVSymbolVisitor.cpp
Go to the documentation of this file.
1 //===- CVSymbolVisitor.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 
11 
15 
16 using namespace llvm;
17 using namespace llvm::codeview;
18 
19 template <typename T>
20 static Error takeObject(ArrayRef<uint8_t> &Data, const T *&Res) {
21  if (Data.size() < sizeof(*Res))
22  return llvm::make_error<CodeViewError>(cv_error_code::insufficient_buffer);
23  Res = reinterpret_cast<const T *>(Data.data());
24  Data = Data.drop_front(sizeof(*Res));
25  return Error::success();
26 }
27 
29  : Callbacks(Callbacks) {}
30 
31 template <typename T>
33  SymbolVisitorCallbacks &Callbacks) {
34  SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.Type);
35  T KnownRecord(RK);
36  if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
37  return EC;
38  return Error::success();
39 }
40 
42  if (auto EC = Callbacks.visitSymbolBegin(Record))
43  return EC;
44 
45  switch (Record.Type) {
46  default:
47  if (auto EC = Callbacks.visitUnknownSymbol(Record))
48  return EC;
49  break;
50 #define SYMBOL_RECORD(EnumName, EnumVal, Name) \
51  case EnumName: { \
52  if (auto EC = visitKnownRecord<Name>(Record, Callbacks)) \
53  return EC; \
54  break; \
55  }
56 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
57  SYMBOL_RECORD(EnumVal, EnumVal, AliasName)
58 #include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
59  }
60 
61  if (auto EC = Callbacks.visitSymbolEnd(Record))
62  return EC;
63 
64  return Error::success();
65 }
66 
68  for (auto I : Symbols) {
69  if (auto EC = visitSymbolRecord(I))
70  return EC;
71  }
72  return Error::success();
73 }
SymbolRecordKind
Distinguishes individual records in the Symbols subsection of a .debug$S section. ...
Definition: CodeView.h:35
virtual Error visitUnknownSymbol(CVSymbol &Record)
Action to take on unknown symbols. By default, they are ignored.
Error visitSymbolRecord(CVSymbol &Record)
CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
virtual Error visitSymbolEnd(CVSymbol &Record)
static Error visitKnownRecord(CVSymbol &Record, SymbolVisitorCallbacks &Callbacks)
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:141
static ErrorSuccess success()
Create a success value.
static Error takeObject(ArrayRef< uint8_t > &Data, const T *&Res)
Error visitSymbolStream(const CVSymbolArray &Symbols)
#define I(x, y, z)
Definition: MD5.cpp:54
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition: ArrayRef.h:180
Lightweight error class with error context and mandatory checking.
const T * data() const
Definition: ArrayRef.h:138
virtual Error visitSymbolBegin(CVSymbol &Record)
Paired begin/end actions for all symbols.