1a93458b0SZachary Turner //===- SymbolRecordHelpers.cpp ----------------------------------*- C++ -*-===// 2a93458b0SZachary Turner // 3a93458b0SZachary Turner // The LLVM Compiler Infrastructure 4a93458b0SZachary Turner // 5a93458b0SZachary Turner // This file is distributed under the University of Illinois Open Source 6a93458b0SZachary Turner // License. See LICENSE.TXT for details. 7a93458b0SZachary Turner // 8a93458b0SZachary Turner //===----------------------------------------------------------------------===// 9a93458b0SZachary Turner 10a93458b0SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h" 11a93458b0SZachary Turner 12a93458b0SZachary Turner #include "llvm/ADT/SmallVector.h" 13a93458b0SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h" 14a93458b0SZachary Turner 15a93458b0SZachary Turner using namespace llvm; 16a93458b0SZachary Turner using namespace llvm::codeview; 17a93458b0SZachary Turner 18a93458b0SZachary Turner template <typename RecordT> RecordT createRecord(const CVSymbol &sym) { 19a93458b0SZachary Turner RecordT record(static_cast<SymbolRecordKind>(sym.kind())); 20a93458b0SZachary Turner cantFail(SymbolDeserializer::deserializeAs<RecordT>(sym, record)); 21a93458b0SZachary Turner return record; 22a93458b0SZachary Turner } 23a93458b0SZachary Turner 24a93458b0SZachary Turner uint32_t 25a93458b0SZachary Turner llvm::codeview::getScopeEndOffset(const llvm::codeview::CVSymbol &Sym) { 26a93458b0SZachary Turner assert(symbolOpensScope(Sym.kind())); 27a93458b0SZachary Turner switch (Sym.kind()) { 28a93458b0SZachary Turner case SymbolKind::S_GPROC32: 29a93458b0SZachary Turner case SymbolKind::S_LPROC32: 30a93458b0SZachary Turner case SymbolKind::S_GPROC32_ID: 31a93458b0SZachary Turner case SymbolKind::S_LPROC32_ID: 32a93458b0SZachary Turner case SymbolKind::S_LPROC32_DPC: 33a93458b0SZachary Turner case SymbolKind::S_LPROC32_DPC_ID: { 34a93458b0SZachary Turner ProcSym Proc = createRecord<ProcSym>(Sym); 35a93458b0SZachary Turner return Proc.End; 36a93458b0SZachary Turner } 37a93458b0SZachary Turner case SymbolKind::S_BLOCK32: { 38a93458b0SZachary Turner BlockSym Block = createRecord<BlockSym>(Sym); 39a93458b0SZachary Turner return Block.End; 40a93458b0SZachary Turner } 41a93458b0SZachary Turner case SymbolKind::S_THUNK32: { 42a93458b0SZachary Turner Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym); 43a93458b0SZachary Turner return Thunk.End; 44a93458b0SZachary Turner } 45a93458b0SZachary Turner case SymbolKind::S_INLINESITE: { 46a93458b0SZachary Turner InlineSiteSym Site = createRecord<InlineSiteSym>(Sym); 47a93458b0SZachary Turner return Site.End; 48a93458b0SZachary Turner } 49a93458b0SZachary Turner default: 50a93458b0SZachary Turner assert(false && "Unknown record type"); 51a93458b0SZachary Turner return 0; 52a93458b0SZachary Turner } 53a93458b0SZachary Turner } 54*a42bbe39SZachary Turner 55*a42bbe39SZachary Turner CVSymbolArray 56*a42bbe39SZachary Turner llvm::codeview::limitSymbolArrayToScope(const CVSymbolArray &Symbols, 57*a42bbe39SZachary Turner uint32_t ScopeBegin) { 58*a42bbe39SZachary Turner CVSymbol Opener = *Symbols.at(ScopeBegin); 59*a42bbe39SZachary Turner assert(symbolOpensScope(Opener.kind())); 60*a42bbe39SZachary Turner uint32_t EndOffset = getScopeEndOffset(Opener); 61*a42bbe39SZachary Turner CVSymbol Closer = *Symbols.at(EndOffset); 62*a42bbe39SZachary Turner EndOffset += Closer.RecordData.size(); 63*a42bbe39SZachary Turner return Symbols.substream(ScopeBegin, EndOffset); 64*a42bbe39SZachary Turner } 65