1a93458b0SZachary Turner //===- SymbolRecordHelpers.cpp ----------------------------------*- C++ -*-===// 2a93458b0SZachary Turner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a93458b0SZachary Turner // 7a93458b0SZachary Turner //===----------------------------------------------------------------------===// 8a93458b0SZachary Turner 9a93458b0SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h" 10a93458b0SZachary Turner 11*81cde474Sserge-sans-paille #include "llvm/ADT/ArrayRef.h" 12a93458b0SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h" 13a93458b0SZachary Turner 14a93458b0SZachary Turner using namespace llvm; 15a93458b0SZachary Turner using namespace llvm::codeview; 16a93458b0SZachary Turner createRecord(const CVSymbol & sym)17bfa3f0c3SBenjamin Kramertemplate <typename RecordT> static RecordT createRecord(const CVSymbol &sym) { 18a93458b0SZachary Turner RecordT record(static_cast<SymbolRecordKind>(sym.kind())); 19a93458b0SZachary Turner cantFail(SymbolDeserializer::deserializeAs<RecordT>(sym, record)); 20a93458b0SZachary Turner return record; 21a93458b0SZachary Turner } 22a93458b0SZachary Turner getScopeEndOffset(const CVSymbol & Sym)23bb3d7e56SZachary Turneruint32_t llvm::codeview::getScopeEndOffset(const CVSymbol &Sym) { 24a93458b0SZachary Turner assert(symbolOpensScope(Sym.kind())); 25a93458b0SZachary Turner switch (Sym.kind()) { 26a93458b0SZachary Turner case SymbolKind::S_GPROC32: 27a93458b0SZachary Turner case SymbolKind::S_LPROC32: 28a93458b0SZachary Turner case SymbolKind::S_GPROC32_ID: 29a93458b0SZachary Turner case SymbolKind::S_LPROC32_ID: 30a93458b0SZachary Turner case SymbolKind::S_LPROC32_DPC: 31a93458b0SZachary Turner case SymbolKind::S_LPROC32_DPC_ID: { 32a93458b0SZachary Turner ProcSym Proc = createRecord<ProcSym>(Sym); 33a93458b0SZachary Turner return Proc.End; 34a93458b0SZachary Turner } 35a93458b0SZachary Turner case SymbolKind::S_BLOCK32: { 36a93458b0SZachary Turner BlockSym Block = createRecord<BlockSym>(Sym); 37a93458b0SZachary Turner return Block.End; 38a93458b0SZachary Turner } 39a93458b0SZachary Turner case SymbolKind::S_THUNK32: { 40a93458b0SZachary Turner Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym); 41a93458b0SZachary Turner return Thunk.End; 42a93458b0SZachary Turner } 43a93458b0SZachary Turner case SymbolKind::S_INLINESITE: { 44a93458b0SZachary Turner InlineSiteSym Site = createRecord<InlineSiteSym>(Sym); 45a93458b0SZachary Turner return Site.End; 46a93458b0SZachary Turner } 47a93458b0SZachary Turner default: 48a93458b0SZachary Turner assert(false && "Unknown record type"); 49a93458b0SZachary Turner return 0; 50a93458b0SZachary Turner } 51a93458b0SZachary Turner } 52a42bbe39SZachary Turner 53bb3d7e56SZachary Turner uint32_t getScopeParentOffset(const llvm::codeview::CVSymbol & Sym)54bb3d7e56SZachary Turnerllvm::codeview::getScopeParentOffset(const llvm::codeview::CVSymbol &Sym) { 55bb3d7e56SZachary Turner assert(symbolOpensScope(Sym.kind())); 56bb3d7e56SZachary Turner switch (Sym.kind()) { 57bb3d7e56SZachary Turner case SymbolKind::S_GPROC32: 58bb3d7e56SZachary Turner case SymbolKind::S_LPROC32: 59bb3d7e56SZachary Turner case SymbolKind::S_GPROC32_ID: 60bb3d7e56SZachary Turner case SymbolKind::S_LPROC32_ID: 61bb3d7e56SZachary Turner case SymbolKind::S_LPROC32_DPC: 62bb3d7e56SZachary Turner case SymbolKind::S_LPROC32_DPC_ID: { 63bb3d7e56SZachary Turner ProcSym Proc = createRecord<ProcSym>(Sym); 64bb3d7e56SZachary Turner return Proc.Parent; 65bb3d7e56SZachary Turner } 66bb3d7e56SZachary Turner case SymbolKind::S_BLOCK32: { 67bb3d7e56SZachary Turner BlockSym Block = createRecord<BlockSym>(Sym); 68bb3d7e56SZachary Turner return Block.Parent; 69bb3d7e56SZachary Turner } 70bb3d7e56SZachary Turner case SymbolKind::S_THUNK32: { 71bb3d7e56SZachary Turner Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym); 72bb3d7e56SZachary Turner return Thunk.Parent; 73bb3d7e56SZachary Turner } 74bb3d7e56SZachary Turner case SymbolKind::S_INLINESITE: { 75bb3d7e56SZachary Turner InlineSiteSym Site = createRecord<InlineSiteSym>(Sym); 76bb3d7e56SZachary Turner return Site.Parent; 77bb3d7e56SZachary Turner } 78bb3d7e56SZachary Turner default: 79bb3d7e56SZachary Turner assert(false && "Unknown record type"); 80bb3d7e56SZachary Turner return 0; 81bb3d7e56SZachary Turner } 82bb3d7e56SZachary Turner } 83bb3d7e56SZachary Turner 84a42bbe39SZachary Turner CVSymbolArray limitSymbolArrayToScope(const CVSymbolArray & Symbols,uint32_t ScopeBegin)85a42bbe39SZachary Turnerllvm::codeview::limitSymbolArrayToScope(const CVSymbolArray &Symbols, 86a42bbe39SZachary Turner uint32_t ScopeBegin) { 87a42bbe39SZachary Turner CVSymbol Opener = *Symbols.at(ScopeBegin); 88a42bbe39SZachary Turner assert(symbolOpensScope(Opener.kind())); 89a42bbe39SZachary Turner uint32_t EndOffset = getScopeEndOffset(Opener); 90a42bbe39SZachary Turner CVSymbol Closer = *Symbols.at(EndOffset); 91a42bbe39SZachary Turner EndOffset += Closer.RecordData.size(); 92a42bbe39SZachary Turner return Symbols.substream(ScopeBegin, EndOffset); 93a42bbe39SZachary Turner } 94