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