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