brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 8571ca6 Raw
101 lines · cpp
1//===- NativeExeSymbol.cpp - native impl for PDBSymbolExe -------*- 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#include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h"10 11#include "llvm/DebugInfo/CodeView/CodeView.h"12#include "llvm/DebugInfo/PDB/Native/DbiStream.h"13#include "llvm/DebugInfo/PDB/Native/InfoStream.h"14#include "llvm/DebugInfo/PDB/Native/NativeEnumModules.h"15#include "llvm/DebugInfo/PDB/Native/NativeSession.h"16#include "llvm/DebugInfo/PDB/Native/PDBFile.h"17#include "llvm/DebugInfo/PDB/Native/SymbolCache.h"18 19using namespace llvm;20using namespace llvm::pdb;21 22static DbiStream *getDbiStreamPtr(NativeSession &Session) {23  Expected<DbiStream &> DbiS = Session.getPDBFile().getPDBDbiStream();24  if (DbiS)25    return &DbiS.get();26 27  consumeError(DbiS.takeError());28  return nullptr;29}30 31NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId)32    : NativeRawSymbol(Session, PDB_SymType::Exe, SymbolId),33      Dbi(getDbiStreamPtr(Session)) {}34 35std::unique_ptr<IPDBEnumSymbols>36NativeExeSymbol::findChildren(PDB_SymType Type) const {37  switch (Type) {38  case PDB_SymType::Compiland: {39    return std::unique_ptr<IPDBEnumSymbols>(new NativeEnumModules(Session));40    break;41  }42  case PDB_SymType::ArrayType:43    return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ARRAY);44  case PDB_SymType::Enum:45    return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ENUM);46  case PDB_SymType::PointerType:47    return Session.getSymbolCache().createTypeEnumerator(codeview::LF_POINTER);48  case PDB_SymType::UDT:49    return Session.getSymbolCache().createTypeEnumerator(50        {codeview::LF_STRUCTURE, codeview::LF_CLASS, codeview::LF_UNION,51         codeview::LF_INTERFACE});52  case PDB_SymType::VTableShape:53    return Session.getSymbolCache().createTypeEnumerator(codeview::LF_VTSHAPE);54  case PDB_SymType::FunctionSig:55    return Session.getSymbolCache().createTypeEnumerator(56        {codeview::LF_PROCEDURE, codeview::LF_MFUNCTION});57  case PDB_SymType::Typedef:58    return Session.getSymbolCache().createGlobalsEnumerator(codeview::S_UDT);59 60  default:61    break;62  }63  return nullptr;64}65 66uint32_t NativeExeSymbol::getAge() const {67  auto IS = Session.getPDBFile().getPDBInfoStream();68  if (IS)69    return IS->getAge();70  consumeError(IS.takeError());71  return 0;72}73 74std::string NativeExeSymbol::getSymbolsFileName() const {75  return std::string(Session.getPDBFile().getFilePath());76}77 78codeview::GUID NativeExeSymbol::getGuid() const {79  auto IS = Session.getPDBFile().getPDBInfoStream();80  if (IS)81    return IS->getGuid();82  consumeError(IS.takeError());83  return codeview::GUID{{0}};84}85 86bool NativeExeSymbol::hasCTypes() const {87  auto Dbi = Session.getPDBFile().getPDBDbiStream();88  if (Dbi)89    return Dbi->hasCTypes();90  consumeError(Dbi.takeError());91  return false;92}93 94bool NativeExeSymbol::hasPrivateSymbols() const {95  auto Dbi = Session.getPDBFile().getPDBDbiStream();96  if (Dbi)97    return !Dbi->isStripped();98  consumeError(Dbi.takeError());99  return false;100}101