blob: 1fbdc2b49ec99799b1ea18d251ab322fca1db566 [file] [log] [blame]
Adrian McCarthy4d93d662017-03-29 19:27:08 +00001//===- 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
Adrian McCarthy4aedc812017-06-22 18:57:51 +000012#include "llvm/ADT/STLExtras.h"
Adrian McCarthy4d93d662017-03-29 19:27:08 +000013#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
14#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
Zachary Turner7999b4f2018-09-05 23:30:38 +000015#include "llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h"
Adrian McCarthy4d93d662017-03-29 19:27:08 +000016#include "llvm/DebugInfo/PDB/Native/NativeEnumModules.h"
17#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
Zachary Turner8ab7dd602018-09-07 00:12:34 +000018#include "llvm/DebugInfo/PDB/Native/SymbolCache.h"
Zachary Turner7999b4f2018-09-05 23:30:38 +000019#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
Adrian McCarthy4d93d662017-03-29 19:27:08 +000020
Zachary Turner7999b4f2018-09-05 23:30:38 +000021using namespace llvm;
22using namespace llvm::pdb;
Adrian McCarthy4d93d662017-03-29 19:27:08 +000023
Zachary Turner8ab7dd602018-09-07 00:12:34 +000024static 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
Adrian McCarthy8d090fc2017-07-12 19:38:11 +000033NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId)
Zachary Turner7999b4f2018-09-05 23:30:38 +000034 : NativeRawSymbol(Session, PDB_SymType::Exe, SymbolId),
Zachary Turner8ab7dd602018-09-07 00:12:34 +000035 Dbi(getDbiStreamPtr(Session)) {}
Adrian McCarthy31bcb6f2017-06-22 18:43:18 +000036
37std::unique_ptr<NativeRawSymbol> NativeExeSymbol::clone() const {
Adrian McCarthy4aedc812017-06-22 18:57:51 +000038 return llvm::make_unique<NativeExeSymbol>(Session, SymbolId);
Adrian McCarthy31bcb6f2017-06-22 18:43:18 +000039}
Adrian McCarthy4d93d662017-03-29 19:27:08 +000040
41std::unique_ptr<IPDBEnumSymbols>
42NativeExeSymbol::findChildren(PDB_SymType Type) const {
43 switch (Type) {
44 case PDB_SymType::Compiland: {
Zachary Turner7999b4f2018-09-05 23:30:38 +000045 return std::unique_ptr<IPDBEnumSymbols>(new NativeEnumModules(Session));
Adrian McCarthy4d93d662017-03-29 19:27:08 +000046 break;
47 }
Adrian McCarthyb41f03e2017-08-04 22:37:58 +000048 case PDB_SymType::Enum:
Zachary Turner8ab7dd602018-09-07 00:12:34 +000049 return Session.getSymbolCache().createTypeEnumerator(codeview::LF_ENUM);
Zachary Turnerda4b63a2018-09-07 23:21:33 +000050 case PDB_SymType::PointerType:
51 return Session.getSymbolCache().createTypeEnumerator(codeview::LF_POINTER);
Adrian McCarthy4d93d662017-03-29 19:27:08 +000052 default:
53 break;
54 }
55 return nullptr;
56}
57
58uint32_t NativeExeSymbol::getAge() const {
Zachary Turner8ab7dd602018-09-07 00:12:34 +000059 auto IS = Session.getPDBFile().getPDBInfoStream();
Adrian McCarthy4d93d662017-03-29 19:27:08 +000060 if (IS)
61 return IS->getAge();
62 consumeError(IS.takeError());
63 return 0;
64}
65
66std::string NativeExeSymbol::getSymbolsFileName() const {
Zachary Turner8ab7dd602018-09-07 00:12:34 +000067 return Session.getPDBFile().getFilePath();
Adrian McCarthy4d93d662017-03-29 19:27:08 +000068}
69
Reid Kleckner67653ee2017-07-17 23:59:44 +000070codeview::GUID NativeExeSymbol::getGuid() const {
Zachary Turner8ab7dd602018-09-07 00:12:34 +000071 auto IS = Session.getPDBFile().getPDBInfoStream();
Adrian McCarthy4d93d662017-03-29 19:27:08 +000072 if (IS)
73 return IS->getGuid();
74 consumeError(IS.takeError());
Reid Kleckner67653ee2017-07-17 23:59:44 +000075 return codeview::GUID{{0}};
Adrian McCarthy4d93d662017-03-29 19:27:08 +000076}
77
78bool NativeExeSymbol::hasCTypes() const {
Zachary Turner8ab7dd602018-09-07 00:12:34 +000079 auto Dbi = Session.getPDBFile().getPDBDbiStream();
Adrian McCarthy4d93d662017-03-29 19:27:08 +000080 if (Dbi)
81 return Dbi->hasCTypes();
82 consumeError(Dbi.takeError());
83 return false;
84}
85
86bool NativeExeSymbol::hasPrivateSymbols() const {
Zachary Turner8ab7dd602018-09-07 00:12:34 +000087 auto Dbi = Session.getPDBFile().getPDBDbiStream();
Adrian McCarthy4d93d662017-03-29 19:27:08 +000088 if (Dbi)
89 return !Dbi->isStripped();
90 consumeError(Dbi.takeError());
91 return false;
92}