1ff0cc061SDimitry Andric //===- DIASourceFile.cpp - DIA implementation of IPDBSourceFile -*- C++ -*-===//
2ff0cc061SDimitry Andric //
3ff0cc061SDimitry Andric //                     The LLVM Compiler Infrastructure
4ff0cc061SDimitry Andric //
5ff0cc061SDimitry Andric // This file is distributed under the University of Illinois Open Source
6ff0cc061SDimitry Andric // License. See LICENSE.TXT for details.
7ff0cc061SDimitry Andric //
8ff0cc061SDimitry Andric //===----------------------------------------------------------------------===//
9ff0cc061SDimitry Andric 
103ca95b02SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIASourceFile.h"
113ca95b02SDimitry Andric #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h"
12ff0cc061SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIAEnumSymbols.h"
13ff0cc061SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIASession.h"
14*b5893f02SDimitry Andric #include "llvm/DebugInfo/PDB/DIA/DIAUtils.h"
153ca95b02SDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
16ff0cc061SDimitry Andric 
17ff0cc061SDimitry Andric using namespace llvm;
183ca95b02SDimitry Andric using namespace llvm::pdb;
19ff0cc061SDimitry Andric 
DIASourceFile(const DIASession & PDBSession,CComPtr<IDiaSourceFile> DiaSourceFile)20ff0cc061SDimitry Andric DIASourceFile::DIASourceFile(const DIASession &PDBSession,
21ff0cc061SDimitry Andric                              CComPtr<IDiaSourceFile> DiaSourceFile)
22ff0cc061SDimitry Andric     : Session(PDBSession), SourceFile(DiaSourceFile) {}
23ff0cc061SDimitry Andric 
getFileName() const24ff0cc061SDimitry Andric std::string DIASourceFile::getFileName() const {
25*b5893f02SDimitry Andric   return invokeBstrMethod(*SourceFile, &IDiaSourceFile::get_fileName);
26ff0cc061SDimitry Andric }
27ff0cc061SDimitry Andric 
getUniqueId() const28ff0cc061SDimitry Andric uint32_t DIASourceFile::getUniqueId() const {
29ff0cc061SDimitry Andric   DWORD Id;
30ff0cc061SDimitry Andric   return (S_OK == SourceFile->get_uniqueId(&Id)) ? Id : 0;
31ff0cc061SDimitry Andric }
32ff0cc061SDimitry Andric 
getChecksum() const33ff0cc061SDimitry Andric std::string DIASourceFile::getChecksum() const {
34ff0cc061SDimitry Andric   DWORD ByteSize = 0;
35ff0cc061SDimitry Andric   HRESULT Result = SourceFile->get_checksum(0, &ByteSize, nullptr);
36ff0cc061SDimitry Andric   if (ByteSize == 0)
37ff0cc061SDimitry Andric     return std::string();
38ff0cc061SDimitry Andric   std::vector<BYTE> ChecksumBytes(ByteSize);
39ff0cc061SDimitry Andric   Result = SourceFile->get_checksum(ByteSize, &ByteSize, &ChecksumBytes[0]);
40ff0cc061SDimitry Andric   if (S_OK != Result)
41ff0cc061SDimitry Andric     return std::string();
42ff0cc061SDimitry Andric   return std::string(ChecksumBytes.begin(), ChecksumBytes.end());
43ff0cc061SDimitry Andric }
44ff0cc061SDimitry Andric 
getChecksumType() const45ff0cc061SDimitry Andric PDB_Checksum DIASourceFile::getChecksumType() const {
46ff0cc061SDimitry Andric   DWORD Type;
47ff0cc061SDimitry Andric   HRESULT Result = SourceFile->get_checksumType(&Type);
48ff0cc061SDimitry Andric   if (S_OK != Result)
49ff0cc061SDimitry Andric     return PDB_Checksum::None;
50ff0cc061SDimitry Andric   return static_cast<PDB_Checksum>(Type);
51ff0cc061SDimitry Andric }
52ff0cc061SDimitry Andric 
533ca95b02SDimitry Andric std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>
getCompilands() const543ca95b02SDimitry Andric DIASourceFile::getCompilands() const {
55ff0cc061SDimitry Andric   CComPtr<IDiaEnumSymbols> DiaEnumerator;
56ff0cc061SDimitry Andric   HRESULT Result = SourceFile->get_compilands(&DiaEnumerator);
57ff0cc061SDimitry Andric   if (S_OK != Result)
58ff0cc061SDimitry Andric     return nullptr;
59ff0cc061SDimitry Andric 
603ca95b02SDimitry Andric   auto Enumerator = std::unique_ptr<IPDBEnumSymbols>(
61ff0cc061SDimitry Andric       new DIAEnumSymbols(Session, DiaEnumerator));
623ca95b02SDimitry Andric   return std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>(
633ca95b02SDimitry Andric       new ConcreteSymbolEnumerator<PDBSymbolCompiland>(std::move(Enumerator)));
64ff0cc061SDimitry Andric }
65