brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 36e075b Raw
168 lines · c
1//===-- PdbUtil.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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBUTIL_H10#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBUTIL_H11 12#include "lldb/Expression/DWARFExpression.h"13#include "lldb/Symbol/Variable.h"14#include "lldb/lldb-enumerations.h"15 16#include "llvm/DebugInfo/CodeView/CodeView.h"17#include "llvm/DebugInfo/CodeView/SymbolRecord.h"18#include "llvm/DebugInfo/CodeView/TypeRecord.h"19#include "llvm/DebugInfo/PDB/PDBTypes.h"20 21#include "PdbSymUid.h"22 23#include <tuple>24#include <utility>25 26namespace llvm {27namespace pdb {28class TpiStream;29}30} // namespace llvm31 32namespace lldb_private {33namespace npdb {34 35class PdbIndex;36 37struct CVTagRecord {38  enum Kind { Class, Struct, Union, Enum };39 40  static CVTagRecord create(llvm::codeview::CVType type);41 42  Kind kind() const { return m_kind; }43 44  const llvm::codeview::TagRecord &asTag() const {45    if (m_kind == Struct || m_kind == Class)46      return cvclass;47    if (m_kind == Enum)48      return cvenum;49    return cvunion;50  }51 52  const llvm::codeview::ClassRecord &asClass() const {53    assert(m_kind == Struct || m_kind == Class);54    return cvclass;55  }56 57  const llvm::codeview::EnumRecord &asEnum() const {58    assert(m_kind == Enum);59    return cvenum;60  }61 62  const llvm::codeview::UnionRecord &asUnion() const {63    assert(m_kind == Union);64    return cvunion;65  }66 67  llvm::StringRef name() const {68    if (m_kind == Struct || m_kind == Class)69      return cvclass.Name;70    if (m_kind == Enum)71      return cvenum.Name;72    return cvunion.Name;73  }74 75  CompilerContextKind contextKind() const {76    if (m_kind == Struct || m_kind == Class)77      return CompilerContextKind::ClassOrStruct;78    if (m_kind == Enum)79      return CompilerContextKind::Enum;80 81    assert(m_kind == Union);82    return CompilerContextKind::Union;83  }84 85private:86  CVTagRecord(llvm::codeview::ClassRecord &&c);87  CVTagRecord(llvm::codeview::UnionRecord &&u);88  CVTagRecord(llvm::codeview::EnumRecord &&e);89  union {90    llvm::codeview::ClassRecord cvclass;91    llvm::codeview::EnumRecord cvenum;92    llvm::codeview::UnionRecord cvunion;93  };94  Kind m_kind;95};96 97struct SegmentOffset {98  SegmentOffset() = default;99  SegmentOffset(uint16_t s, uint32_t o) : segment(s), offset(o) {}100  uint16_t segment = 0;101  uint32_t offset = 0;102};103 104struct SegmentOffsetLength {105  SegmentOffsetLength() = default;106  SegmentOffsetLength(uint16_t s, uint32_t o, uint32_t l)107      : so(s, o), length(l) {}108  SegmentOffset so;109  uint32_t length = 0;110};111 112struct VariableInfo {113  llvm::StringRef name;114  llvm::codeview::TypeIndex type;115  DWARFExpressionList location;116  bool is_param;117};118 119llvm::pdb::PDB_SymType CVSymToPDBSym(llvm::codeview::SymbolKind kind);120llvm::pdb::PDB_SymType CVTypeToPDBType(llvm::codeview::TypeLeafKind kind);121 122bool SymbolHasAddress(const llvm::codeview::CVSymbol &sym);123bool SymbolIsCode(const llvm::codeview::CVSymbol &sym);124 125SegmentOffset GetSegmentAndOffset(const llvm::codeview::CVSymbol &sym);126SegmentOffsetLength127GetSegmentOffsetAndLength(const llvm::codeview::CVSymbol &sym);128 129template <typename RecordT> bool IsValidRecord(const RecordT &sym) {130  return true;131}132 133inline bool IsValidRecord(const llvm::codeview::ProcRefSym &sym) {134  // S_PROCREF symbols have 1-based module indices.135  return sym.Module > 0;136}137 138bool IsForwardRefUdt(llvm::codeview::CVType cvt);139bool IsTagRecord(llvm::codeview::CVType cvt);140bool IsClassStructUnion(llvm::codeview::CVType cvt);141 142bool IsForwardRefUdt(const PdbTypeSymId &id, llvm::pdb::TpiStream &tpi);143bool IsTagRecord(const PdbTypeSymId &id, llvm::pdb::TpiStream &tpi);144 145lldb::AccessType TranslateMemberAccess(llvm::codeview::MemberAccess access);146llvm::codeview::TypeIndex GetFieldListIndex(llvm::codeview::CVType cvt);147llvm::codeview::TypeIndex148LookThroughModifierRecord(llvm::codeview::CVType modifier);149 150llvm::StringRef DropNameScope(llvm::StringRef name);151 152VariableInfo GetVariableNameInfo(llvm::codeview::CVSymbol symbol);153VariableInfo GetVariableLocationInfo(PdbIndex &index, PdbCompilandSymId var_id,154                                     Block &func_block, lldb::ModuleSP module);155 156size_t GetTypeSizeForSimpleKind(llvm::codeview::SimpleTypeKind kind);157lldb::BasicType158GetCompilerTypeForSimpleKind(llvm::codeview::SimpleTypeKind kind);159 160PdbTypeSymId GetBestPossibleDecl(PdbTypeSymId id, llvm::pdb::TpiStream &tpi);161 162size_t GetSizeOfType(PdbTypeSymId id, llvm::pdb::TpiStream &tpi);163 164} // namespace npdb165} // namespace lldb_private166 167#endif168