109467b48Spatrick //===- SymbolRecordHelpers.cpp ----------------------------------*- C++ -*-===// 209467b48Spatrick // 309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 609467b48Spatrick // 709467b48Spatrick //===----------------------------------------------------------------------===// 809467b48Spatrick 909467b48Spatrick #include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h" 1009467b48Spatrick 11*d415bd75Srobert #include "llvm/ADT/ArrayRef.h" 1209467b48Spatrick #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h" 1309467b48Spatrick 1409467b48Spatrick using namespace llvm; 1509467b48Spatrick using namespace llvm::codeview; 1609467b48Spatrick createRecord(const CVSymbol & sym)1709467b48Spatricktemplate <typename RecordT> static RecordT createRecord(const CVSymbol &sym) { 1809467b48Spatrick RecordT record(static_cast<SymbolRecordKind>(sym.kind())); 1909467b48Spatrick cantFail(SymbolDeserializer::deserializeAs<RecordT>(sym, record)); 2009467b48Spatrick return record; 2109467b48Spatrick } 2209467b48Spatrick getScopeEndOffset(const CVSymbol & Sym)2309467b48Spatrickuint32_t llvm::codeview::getScopeEndOffset(const CVSymbol &Sym) { 2409467b48Spatrick assert(symbolOpensScope(Sym.kind())); 2509467b48Spatrick switch (Sym.kind()) { 2609467b48Spatrick case SymbolKind::S_GPROC32: 2709467b48Spatrick case SymbolKind::S_LPROC32: 2809467b48Spatrick case SymbolKind::S_GPROC32_ID: 2909467b48Spatrick case SymbolKind::S_LPROC32_ID: 3009467b48Spatrick case SymbolKind::S_LPROC32_DPC: 3109467b48Spatrick case SymbolKind::S_LPROC32_DPC_ID: { 3209467b48Spatrick ProcSym Proc = createRecord<ProcSym>(Sym); 3309467b48Spatrick return Proc.End; 3409467b48Spatrick } 3509467b48Spatrick case SymbolKind::S_BLOCK32: { 3609467b48Spatrick BlockSym Block = createRecord<BlockSym>(Sym); 3709467b48Spatrick return Block.End; 3809467b48Spatrick } 3909467b48Spatrick case SymbolKind::S_THUNK32: { 4009467b48Spatrick Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym); 4109467b48Spatrick return Thunk.End; 4209467b48Spatrick } 4309467b48Spatrick case SymbolKind::S_INLINESITE: { 4409467b48Spatrick InlineSiteSym Site = createRecord<InlineSiteSym>(Sym); 4509467b48Spatrick return Site.End; 4609467b48Spatrick } 4709467b48Spatrick default: 4809467b48Spatrick assert(false && "Unknown record type"); 4909467b48Spatrick return 0; 5009467b48Spatrick } 5109467b48Spatrick } 5209467b48Spatrick 5309467b48Spatrick uint32_t getScopeParentOffset(const llvm::codeview::CVSymbol & Sym)5409467b48Spatrickllvm::codeview::getScopeParentOffset(const llvm::codeview::CVSymbol &Sym) { 5509467b48Spatrick assert(symbolOpensScope(Sym.kind())); 5609467b48Spatrick switch (Sym.kind()) { 5709467b48Spatrick case SymbolKind::S_GPROC32: 5809467b48Spatrick case SymbolKind::S_LPROC32: 5909467b48Spatrick case SymbolKind::S_GPROC32_ID: 6009467b48Spatrick case SymbolKind::S_LPROC32_ID: 6109467b48Spatrick case SymbolKind::S_LPROC32_DPC: 6209467b48Spatrick case SymbolKind::S_LPROC32_DPC_ID: { 6309467b48Spatrick ProcSym Proc = createRecord<ProcSym>(Sym); 6409467b48Spatrick return Proc.Parent; 6509467b48Spatrick } 6609467b48Spatrick case SymbolKind::S_BLOCK32: { 6709467b48Spatrick BlockSym Block = createRecord<BlockSym>(Sym); 6809467b48Spatrick return Block.Parent; 6909467b48Spatrick } 7009467b48Spatrick case SymbolKind::S_THUNK32: { 7109467b48Spatrick Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym); 7209467b48Spatrick return Thunk.Parent; 7309467b48Spatrick } 7409467b48Spatrick case SymbolKind::S_INLINESITE: { 7509467b48Spatrick InlineSiteSym Site = createRecord<InlineSiteSym>(Sym); 7609467b48Spatrick return Site.Parent; 7709467b48Spatrick } 7809467b48Spatrick default: 7909467b48Spatrick assert(false && "Unknown record type"); 8009467b48Spatrick return 0; 8109467b48Spatrick } 8209467b48Spatrick } 8309467b48Spatrick 8409467b48Spatrick CVSymbolArray limitSymbolArrayToScope(const CVSymbolArray & Symbols,uint32_t ScopeBegin)8509467b48Spatrickllvm::codeview::limitSymbolArrayToScope(const CVSymbolArray &Symbols, 8609467b48Spatrick uint32_t ScopeBegin) { 8709467b48Spatrick CVSymbol Opener = *Symbols.at(ScopeBegin); 8809467b48Spatrick assert(symbolOpensScope(Opener.kind())); 8909467b48Spatrick uint32_t EndOffset = getScopeEndOffset(Opener); 9009467b48Spatrick CVSymbol Closer = *Symbols.at(EndOffset); 9109467b48Spatrick EndOffset += Closer.RecordData.size(); 9209467b48Spatrick return Symbols.substream(ScopeBegin, EndOffset); 9309467b48Spatrick } 94