NativeExeSymbol.cpp revision 320970
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/NativeEnumModules.h"
16#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
17
18namespace llvm {
19namespace pdb {
20
21NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId)
22    : NativeRawSymbol(Session, SymbolId), File(Session.getPDBFile()) {}
23
24std::unique_ptr<NativeRawSymbol> NativeExeSymbol::clone() const {
25  return llvm::make_unique<NativeExeSymbol>(Session, SymbolId);
26}
27
28std::unique_ptr<IPDBEnumSymbols>
29NativeExeSymbol::findChildren(PDB_SymType Type) const {
30  switch (Type) {
31  case PDB_SymType::Compiland: {
32    auto Dbi = File.getPDBDbiStream();
33    if (Dbi) {
34      const DbiModuleList &Modules = Dbi->modules();
35      return std::unique_ptr<IPDBEnumSymbols>(
36          new NativeEnumModules(Session, Modules));
37    }
38    consumeError(Dbi.takeError());
39    break;
40  }
41  default:
42    break;
43  }
44  return nullptr;
45}
46
47uint32_t NativeExeSymbol::getAge() const {
48  auto IS = File.getPDBInfoStream();
49  if (IS)
50    return IS->getAge();
51  consumeError(IS.takeError());
52  return 0;
53}
54
55std::string NativeExeSymbol::getSymbolsFileName() const {
56  return File.getFilePath();
57}
58
59PDB_UniqueId NativeExeSymbol::getGuid() const {
60  auto IS = File.getPDBInfoStream();
61  if (IS)
62    return IS->getGuid();
63  consumeError(IS.takeError());
64  return PDB_UniqueId{{0}};
65}
66
67bool NativeExeSymbol::hasCTypes() const {
68  auto Dbi = File.getPDBDbiStream();
69  if (Dbi)
70    return Dbi->hasCTypes();
71  consumeError(Dbi.takeError());
72  return false;
73}
74
75bool NativeExeSymbol::hasPrivateSymbols() const {
76  auto Dbi = File.getPDBDbiStream();
77  if (Dbi)
78    return !Dbi->isStripped();
79  consumeError(Dbi.takeError());
80  return false;
81}
82
83} // namespace pdb
84} // namespace llvm
85