[PDB] Add some helper functions for working with scopes.

llvm-svn: 349361
This commit is contained in:
Zachary Turner 2018-12-17 16:15:36 +00:00
parent 9c59ff4bb6
commit 5167d581e4
4 changed files with 42 additions and 2 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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) {

View File

@ -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;
}