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   }
417a7e6055SDimitry Andric   default:
427a7e6055SDimitry Andric     break;
437a7e6055SDimitry Andric   }
447a7e6055SDimitry Andric   return nullptr;
457a7e6055SDimitry Andric }
467a7e6055SDimitry Andric 
477a7e6055SDimitry Andric uint32_t NativeExeSymbol::getAge() const {
487a7e6055SDimitry Andric   auto IS = File.getPDBInfoStream();
497a7e6055SDimitry Andric   if (IS)
507a7e6055SDimitry Andric     return IS->getAge();
517a7e6055SDimitry Andric   consumeError(IS.takeError());
527a7e6055SDimitry Andric   return 0;
537a7e6055SDimitry Andric }
547a7e6055SDimitry Andric 
557a7e6055SDimitry Andric std::string NativeExeSymbol::getSymbolsFileName() const {
567a7e6055SDimitry Andric   return File.getFilePath();
577a7e6055SDimitry Andric }
587a7e6055SDimitry Andric 
597a7e6055SDimitry Andric PDB_UniqueId NativeExeSymbol::getGuid() const {
607a7e6055SDimitry Andric   auto IS = File.getPDBInfoStream();
617a7e6055SDimitry Andric   if (IS)
627a7e6055SDimitry Andric     return IS->getGuid();
637a7e6055SDimitry Andric   consumeError(IS.takeError());
647a7e6055SDimitry Andric   return PDB_UniqueId{{0}};
657a7e6055SDimitry Andric }
667a7e6055SDimitry Andric 
677a7e6055SDimitry Andric bool NativeExeSymbol::hasCTypes() const {
687a7e6055SDimitry Andric   auto Dbi = File.getPDBDbiStream();
697a7e6055SDimitry Andric   if (Dbi)
707a7e6055SDimitry Andric     return Dbi->hasCTypes();
717a7e6055SDimitry Andric   consumeError(Dbi.takeError());
727a7e6055SDimitry Andric   return false;
737a7e6055SDimitry Andric }
747a7e6055SDimitry Andric 
757a7e6055SDimitry Andric bool NativeExeSymbol::hasPrivateSymbols() const {
767a7e6055SDimitry Andric   auto Dbi = File.getPDBDbiStream();
777a7e6055SDimitry Andric   if (Dbi)
787a7e6055SDimitry Andric     return !Dbi->isStripped();
797a7e6055SDimitry Andric   consumeError(Dbi.takeError());
807a7e6055SDimitry Andric   return false;
817a7e6055SDimitry Andric }
827a7e6055SDimitry Andric 
837a7e6055SDimitry Andric } // namespace pdb
847a7e6055SDimitry Andric } // namespace llvm
85