1 //===- SymbolRecordHelpers.h ------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_DEBUGINFO_CODEVIEW_SYMBOLRECORDHELPERS_H 10 #define LLVM_DEBUGINFO_CODEVIEW_SYMBOLRECORDHELPERS_H 11 12 #include "llvm/DebugInfo/CodeView/CVRecord.h" 13 #include "llvm/DebugInfo/CodeView/CodeView.h" 14 15 namespace llvm { 16 namespace codeview { 17 /// Return true if this symbol opens a scope. This implies that the symbol has 18 /// "parent" and "end" fields, which contain the offset of the S_END or 19 /// S_INLINESITE_END record. 20 inline bool symbolOpensScope(SymbolKind Kind) { 21 switch (Kind) { 22 case SymbolKind::S_GPROC32: 23 case SymbolKind::S_LPROC32: 24 case SymbolKind::S_LPROC32_ID: 25 case SymbolKind::S_GPROC32_ID: 26 case SymbolKind::S_BLOCK32: 27 case SymbolKind::S_SEPCODE: 28 case SymbolKind::S_THUNK32: 29 case SymbolKind::S_INLINESITE: 30 case SymbolKind::S_INLINESITE2: 31 return true; 32 default: 33 break; 34 } 35 return false; 36 } 37 38 /// Return true if this ssymbol ends a scope. 39 inline bool symbolEndsScope(SymbolKind Kind) { 40 switch (Kind) { 41 case SymbolKind::S_END: 42 case SymbolKind::S_PROC_ID_END: 43 case SymbolKind::S_INLINESITE_END: 44 return true; 45 default: 46 break; 47 } 48 return false; 49 } 50 51 /// Given a symbol P for which symbolOpensScope(P) == true, return the 52 /// corresponding end offset. 53 uint32_t getScopeEndOffset(const CVSymbol &Symbol); 54 uint32_t getScopeParentOffset(const CVSymbol &Symbol); 55 56 CVSymbolArray limitSymbolArrayToScope(const CVSymbolArray &Symbols, 57 uint32_t ScopeBegin); 58 59 } // namespace codeview 60 } // namespace llvm 61 62 #endif 63