mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-03-07 11:59:09 +00:00
[PDB] Add some helper functions for working with scopes.
llvm-svn: 349361
This commit is contained in:
parent
9c59ff4bb6
commit
5167d581e4
@ -51,6 +51,7 @@ inline bool symbolEndsScope(SymbolKind Kind) {
|
||||
/// Given a symbol P for which symbolOpensScope(P) == true, return the
|
||||
/// corresponding end offset.
|
||||
uint32_t getScopeEndOffset(const CVSymbol &Symbol);
|
||||
uint32_t getScopeParentOffset(const CVSymbol &Symbol);
|
||||
|
||||
CVSymbolArray limitSymbolArrayToScope(const CVSymbolArray &Symbols,
|
||||
uint32_t ScopeBegin);
|
||||
|
@ -44,6 +44,8 @@ public:
|
||||
symbols(bool *HadError) const;
|
||||
|
||||
const codeview::CVSymbolArray &getSymbolArray() const { return SymbolArray; }
|
||||
const codeview::CVSymbolArray
|
||||
getSymbolArrayForScope(uint32_t ScopeBegin) const;
|
||||
|
||||
BinarySubstreamRef getSymbolsSubstream() const;
|
||||
BinarySubstreamRef getC11LinesSubstream() const;
|
||||
|
@ -21,8 +21,7 @@ template <typename RecordT> RecordT createRecord(const CVSymbol &sym) {
|
||||
return record;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
llvm::codeview::getScopeEndOffset(const llvm::codeview::CVSymbol &Sym) {
|
||||
uint32_t llvm::codeview::getScopeEndOffset(const CVSymbol &Sym) {
|
||||
assert(symbolOpensScope(Sym.kind()));
|
||||
switch (Sym.kind()) {
|
||||
case SymbolKind::S_GPROC32:
|
||||
@ -52,6 +51,37 @@ llvm::codeview::getScopeEndOffset(const llvm::codeview::CVSymbol &Sym) {
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t
|
||||
llvm::codeview::getScopeParentOffset(const llvm::codeview::CVSymbol &Sym) {
|
||||
assert(symbolOpensScope(Sym.kind()));
|
||||
switch (Sym.kind()) {
|
||||
case SymbolKind::S_GPROC32:
|
||||
case SymbolKind::S_LPROC32:
|
||||
case SymbolKind::S_GPROC32_ID:
|
||||
case SymbolKind::S_LPROC32_ID:
|
||||
case SymbolKind::S_LPROC32_DPC:
|
||||
case SymbolKind::S_LPROC32_DPC_ID: {
|
||||
ProcSym Proc = createRecord<ProcSym>(Sym);
|
||||
return Proc.Parent;
|
||||
}
|
||||
case SymbolKind::S_BLOCK32: {
|
||||
BlockSym Block = createRecord<BlockSym>(Sym);
|
||||
return Block.Parent;
|
||||
}
|
||||
case SymbolKind::S_THUNK32: {
|
||||
Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym);
|
||||
return Thunk.Parent;
|
||||
}
|
||||
case SymbolKind::S_INLINESITE: {
|
||||
InlineSiteSym Site = createRecord<InlineSiteSym>(Sym);
|
||||
return Site.Parent;
|
||||
}
|
||||
default:
|
||||
assert(false && "Unknown record type");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
CVSymbolArray
|
||||
llvm::codeview::limitSymbolArrayToScope(const CVSymbolArray &Symbols,
|
||||
uint32_t ScopeBegin) {
|
||||
|
@ -11,7 +11,9 @@
|
||||
#include "llvm/ADT/iterator_range.h"
|
||||
#include "llvm/DebugInfo/CodeView/CodeView.h"
|
||||
#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
|
||||
#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
|
||||
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
|
||||
#include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h"
|
||||
#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
|
||||
#include "llvm/DebugInfo/PDB/Native/RawError.h"
|
||||
#include "llvm/Support/BinaryStreamReader.h"
|
||||
@ -77,6 +79,11 @@ Error ModuleDebugStreamRef::reload() {
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
const codeview::CVSymbolArray
|
||||
ModuleDebugStreamRef::getSymbolArrayForScope(uint32_t ScopeBegin) const {
|
||||
return limitSymbolArrayToScope(SymbolArray, ScopeBegin);
|
||||
}
|
||||
|
||||
BinarySubstreamRef ModuleDebugStreamRef::getSymbolsSubstream() const {
|
||||
return SymbolsSubstream;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user