17a7e6055SDimitry Andric //===- NativeExeSymbol.cpp - native impl for PDBSymbolExe -------*- C++ -*-===// 27a7e6055SDimitry Andric // 37a7e6055SDimitry Andric // The LLVM Compiler Infrastructure 47a7e6055SDimitry Andric // 57a7e6055SDimitry Andric // This file is distributed under the University of Illinois Open Source 67a7e6055SDimitry Andric // License. See LICENSE.TXT for details. 77a7e6055SDimitry Andric // 87a7e6055SDimitry Andric //===----------------------------------------------------------------------===// 97a7e6055SDimitry Andric 107a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h" 117a7e6055SDimitry Andric 12edd7eaddSDimitry Andric #include "llvm/ADT/STLExtras.h" 137a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/DbiStream.h" 147a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/InfoStream.h" 157a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/NativeEnumModules.h" 167a7e6055SDimitry Andric #include "llvm/DebugInfo/PDB/Native/PDBFile.h" 177a7e6055SDimitry Andric 187a7e6055SDimitry Andric namespace llvm { 197a7e6055SDimitry Andric namespace pdb { 207a7e6055SDimitry Andric 21c4394386SDimitry Andric NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId) 22edd7eaddSDimitry Andric : NativeRawSymbol(Session, SymbolId), File(Session.getPDBFile()) {} 23edd7eaddSDimitry Andric 24edd7eaddSDimitry Andric std::unique_ptr<NativeRawSymbol> NativeExeSymbol::clone() const { 25edd7eaddSDimitry Andric return llvm::make_unique<NativeExeSymbol>(Session, SymbolId); 26edd7eaddSDimitry Andric } 277a7e6055SDimitry Andric 287a7e6055SDimitry Andric std::unique_ptr<IPDBEnumSymbols> 297a7e6055SDimitry Andric NativeExeSymbol::findChildren(PDB_SymType Type) const { 307a7e6055SDimitry Andric switch (Type) { 317a7e6055SDimitry Andric case PDB_SymType::Compiland: { 327a7e6055SDimitry Andric auto Dbi = File.getPDBDbiStream(); 337a7e6055SDimitry Andric if (Dbi) { 340f5676f4SDimitry Andric const DbiModuleList &Modules = Dbi->modules(); 357a7e6055SDimitry Andric return std::unique_ptr<IPDBEnumSymbols>( 367a7e6055SDimitry Andric new NativeEnumModules(Session, Modules)); 377a7e6055SDimitry Andric } 387a7e6055SDimitry Andric consumeError(Dbi.takeError()); 397a7e6055SDimitry Andric break; 407a7e6055SDimitry Andric } 412cab237bSDimitry Andric case PDB_SymType::Enum: 422cab237bSDimitry Andric return Session.createTypeEnumerator(codeview::LF_ENUM); 437a7e6055SDimitry Andric default: 447a7e6055SDimitry Andric break; 457a7e6055SDimitry Andric } 467a7e6055SDimitry Andric return nullptr; 477a7e6055SDimitry Andric } 487a7e6055SDimitry Andric 497a7e6055SDimitry Andric uint32_t NativeExeSymbol::getAge() const { 507a7e6055SDimitry Andric auto IS = File.getPDBInfoStream(); 517a7e6055SDimitry Andric if (IS) 527a7e6055SDimitry Andric return IS->getAge(); 537a7e6055SDimitry Andric consumeError(IS.takeError()); 547a7e6055SDimitry Andric return 0; 557a7e6055SDimitry Andric } 567a7e6055SDimitry Andric 577a7e6055SDimitry Andric std::string NativeExeSymbol::getSymbolsFileName() const { 587a7e6055SDimitry Andric return File.getFilePath(); 597a7e6055SDimitry Andric } 607a7e6055SDimitry Andric 61b40b48b8SDimitry Andric codeview::GUID NativeExeSymbol::getGuid() const { 627a7e6055SDimitry Andric auto IS = File.getPDBInfoStream(); 637a7e6055SDimitry Andric if (IS) 647a7e6055SDimitry Andric return IS->getGuid(); 657a7e6055SDimitry Andric consumeError(IS.takeError()); 66b40b48b8SDimitry Andric return codeview::GUID{{0}}; 677a7e6055SDimitry Andric } 687a7e6055SDimitry Andric 697a7e6055SDimitry Andric bool NativeExeSymbol::hasCTypes() const { 707a7e6055SDimitry Andric auto Dbi = File.getPDBDbiStream(); 717a7e6055SDimitry Andric if (Dbi) 727a7e6055SDimitry Andric return Dbi->hasCTypes(); 737a7e6055SDimitry Andric consumeError(Dbi.takeError()); 747a7e6055SDimitry Andric return false; 757a7e6055SDimitry Andric } 767a7e6055SDimitry Andric 777a7e6055SDimitry Andric bool NativeExeSymbol::hasPrivateSymbols() const { 787a7e6055SDimitry Andric auto Dbi = File.getPDBDbiStream(); 797a7e6055SDimitry Andric if (Dbi) 807a7e6055SDimitry Andric return !Dbi->isStripped(); 817a7e6055SDimitry Andric consumeError(Dbi.takeError()); 827a7e6055SDimitry Andric return false; 837a7e6055SDimitry Andric } 847a7e6055SDimitry Andric 857a7e6055SDimitry Andric } // namespace pdb 867a7e6055SDimitry Andric } // namespace llvm 87