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