mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-04-17 23:20:20 +00:00

This is part of a larger effort to get the Stream code moved up to Support. I don't want to do it in one large patch, in part because the changes are so big that it will treat everything as file deletions and add, losing history in the process. Aside from that though, it's just a good idea in general to make small changes. So this change only changes the names of the Stream related source files, and applies necessary source fix ups. llvm-svn: 296211
74 lines
2.4 KiB
C++
74 lines
2.4 KiB
C++
//===- CVSymbolVisitor.cpp --------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
|
|
|
|
#include "llvm/DebugInfo/CodeView/CodeViewError.h"
|
|
#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
|
|
#include "llvm/DebugInfo/MSF/BinaryByteStream.h"
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::codeview;
|
|
|
|
template <typename T>
|
|
static Error takeObject(ArrayRef<uint8_t> &Data, const T *&Res) {
|
|
if (Data.size() < sizeof(*Res))
|
|
return llvm::make_error<CodeViewError>(cv_error_code::insufficient_buffer);
|
|
Res = reinterpret_cast<const T *>(Data.data());
|
|
Data = Data.drop_front(sizeof(*Res));
|
|
return Error::success();
|
|
}
|
|
|
|
CVSymbolVisitor::CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
|
|
: Callbacks(Callbacks) {}
|
|
|
|
template <typename T>
|
|
static Error visitKnownRecord(CVSymbol &Record,
|
|
SymbolVisitorCallbacks &Callbacks) {
|
|
SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.Type);
|
|
T KnownRecord(RK);
|
|
if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
|
|
return EC;
|
|
return Error::success();
|
|
}
|
|
|
|
Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) {
|
|
if (auto EC = Callbacks.visitSymbolBegin(Record))
|
|
return EC;
|
|
|
|
switch (Record.Type) {
|
|
default:
|
|
if (auto EC = Callbacks.visitUnknownSymbol(Record))
|
|
return EC;
|
|
break;
|
|
#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
|
|
case EnumName: { \
|
|
if (auto EC = visitKnownRecord<Name>(Record, Callbacks)) \
|
|
return EC; \
|
|
break; \
|
|
}
|
|
#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
|
|
SYMBOL_RECORD(EnumVal, EnumVal, AliasName)
|
|
#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
|
|
}
|
|
|
|
if (auto EC = Callbacks.visitSymbolEnd(Record))
|
|
return EC;
|
|
|
|
return Error::success();
|
|
}
|
|
|
|
Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols) {
|
|
for (auto I : Symbols) {
|
|
if (auto EC = visitSymbolRecord(I))
|
|
return EC;
|
|
}
|
|
return Error::success();
|
|
}
|